Atitit.提升语言可读性原理与实践
表1-1 语言评价标准和影响它们的语言特性
标 准 |
|||
特性 |
可 读 性 |
可 写 性 |
可 靠 性 |
简单性 |
· |
· |
· |
正交性 |
· |
· |
· |
数据类型 |
· |
· |
· |
语法设计 |
· |
· |
· |
对抽象的支持 |
· |
· |
|
表达 |
· |
· |
|
类型检查 |
· |
||
异常处理 |
· |
||
有限地使用别名 |
· |
第三个潜在的问题是运算符重载,即一个运算符有多种意义。虽然这很有用,但是如果允许使用者创建自己的重载,并且不是按常规重载,会降低可读性。例如,重载"+"用于整数和浮点数的加法显然是可取的。事实上,这一重载减少了运算符的数目,从而简化了语言。但是假设程序员将"+"定义为计算两个一维数组中所有元素的和,由于它不同于通常的向量求和,因此对这个程序,编写程序的人与读程序的人都难以理解。使程序难以理解的一个更极端的例子是将"+"定义为计算两个向量的第一个元素之差
当然,语言的简单性也不能过分。例如,如下一节所示,大多数汇编语言语句的形式与意义都是简单性的典型体现。但是这种简单性使汇编语言程序的可读性较差。由于汇编语言程序缺乏更复杂的控制语句,所以程序结构不清晰;由于语句简单,所以与高级语言相比,同样的程序需要的语句就多得多。如果高级语言的控制结构和数据结构不适当,虽然没有上面的例子那样极端,但结论是一样的。
作者:: 绰号:老哇的爪子 ( 全名::Attilax Akbar Al Rapanui 阿提拉克斯 阿克巴 阿尔 拉帕努伊 )
汉字名:艾提拉(艾龙), EMAIL:1466519819@qq.com
转载请注明来源: http://www.cnblogs.com/attilax/
1.3.1.2 正交性
程序设计语言的正交性意味着相对较小的基本结构集合,能够以较少的组合方式来构成语言的控制结构和数据结构。而且,基本结构的任一种可能组合都是合法且有意义的。例如数据类型,假设某语言有4种基本的数据类型(整型、单精度型、双精度型和字符型)和2种运算符(数组和指针)。如果2种运算符都能够作用于自身和4种基本的数据类型,就能够定义大量的数据结构。
一个语言特性是正交的,意味着它独立于程序中出现位置的上下文("正交"来自于正交向量这
IBM的设计限制较多,因此可写性较差
正交性与简单性直接相关:语言设计越正交,语言规则需要的特例就越少,特例越少意味着设计的规范程度越高,语言就越容易学习、阅读和理解。任何学过大量英语的人可以证实,英语中的许多规则特例太难学了(例如,i总是在e前,除非在c后)
过多的正交也会产生问题。ALGOL 68语言(van Wijngaarden等,1969)可能是最具有正交性的程序设计语言了。ALGOL 68中的每一语言结构都有一个类型,这些类型没有任何限制,而且大多数结构都有值。这种*组合可以产生极其复杂的结构,例如,只要结果是一个地址,就可以把条件语句、声明语句及其他各类语句一起放在赋值运算符的左边。这种极端的正交形式导致了不必要的复杂性。而且,由于语言需要大量的基本结构,高度的正交性将产生爆炸性的组合方式。因此,即使组合方式很简单,它们的整体数量也会导致语言的复杂性。
另一方面,过多的正交有损于可写性。当几乎任何基本结构的组合都合理时,程序中的错误会难以检测,从而导致编译器无法发现代码中的谬误。
可见,语言的简单性至少部分归因于相对少量的基本结构的组合,以及正交原理的有限应用。
有人认为,函数式语言同时具有良好的简单性和正交性。函数式语言,如LISP,主要通过将函数作用于给定参数来执行计算。相反,命令式语言,如C、C++和Java,通常用变量和赋值语句来指定如何计算。函数式语言提供了最佳的整体简单性,因为它们能够用一种结构,即函数调用(函数调用能够以简单的方式与其他函数调用组合起来)来完成任何计算。正是这种简单优美使一些语言研究者将函数式语言作为复杂的非函数式语言(如C++)的主要替代语言。但其他因素,如效率,限制了函数式语言的更广泛应用。
1.3.2.2 对抽象的支持
简而言之,抽象就是以允许忽略许多细节的方式来定义和使用复杂结构和操作的能力。抽象是当代程序设计语言设计的关键概念,这是抽象在现代程序设计方法学中扮演中心角色的反映。因此,程序设计语言所允许的抽象程度以及表达抽象的自然程度,对语言的可写性非常重要。程序设计语言支持两类不同的抽象:过程抽象和数据抽象。
过程抽象的一个简单例子,是使用子程序来实现程序中多处需要的排序算法
作为数据抽象的一个例子,请考虑一棵在其结点上存储整数的二叉树
面向数据的软件开发的最终演进开始于20世纪80年代早期,演变为面向对象的设计。面向对象的设计方法基于数据抽象,
1.3.2.3 表达性
语言的表达性涉及若干不同特性。在类似APL(Gilman和Rose,1976)的语言中,表达性意味着有若干功能强大的运算符,能够用很短的程序实现大量的运算。表达性更普遍的意义是,语言具有较为简捷而不笨重的方式来指定运算过程。例如,在C语言中,count++的形式比count=count+1更简短更方便。还有,Ada语言中的布尔运算符and then方便地表明对布尔表达式进行短路求值,Java语言中的for语句在写计数循环时比使用while语句更方便,虽然后者也能实现。以上这些都提高了语言的可写性。
由于冯·诺依曼结构,命令式语言的核心特征就是变量(内存单元的模型)、赋值语句(基于传输操作)和迭代形式的循环运算(这是在该体系结构上实现循环的最高效形式)。表达式中的操作数由内存传输到CPU,表达式的计算结果传回到赋值语句左边所代表的内存单元。迭
尽管事实上,命令式程序设计语言的结构是以计算机体系结构为模型的,而不是出于程序设计语言使用者的能力和意愿,有人仍然认为使用命令式语言比使用函数式语言在某种程度上更自然,因此许多人认为,即使函数式程序与命令式程序运行效率一样高,命令式程序设计语言的使用仍然会占据主导地位。
.6 语言设计中的权衡
l.3节介绍的程序设计语言的评价标准为语言设计提供了一个框架。可惜这个框架是自相矛盾的。Hoare在其关于语言设计的见解深刻的论文(Hoare,1973)中指出,有太多重要但相互矛盾的标准,协调并满足这些标准是一个重要的工程任务。
参考资料
1.3 语言评价标准 - 51CTO.COM.html