Atitit.提升语言可读性原理与实践

表1-1  语言评价标准和影响它们的语言特性1

1.3.1.2  正交性2

1.3.2.2  对抽象的支持3

1.3.2.3  表达性3

.6  语言设计中的权衡4

表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

Atitit.提升语言可读性原理与实践的更多相关文章

  1. Atitit.异步编程技术原理与实践attilax总结

    Atitit.异步编程技术原理与实践attilax总结 1. 俩种实现模式 类库方式,以及语言方式,java futuretask ,c# await1 2. 事件(中断)机制1 3. Await 模 ...

  2. Adaboost提升算法从原理到实践

    1.基本思想: 综合某些专家的判断,往往要比一个专家单独的判断要好.在"强可学习"和"弱科学习"的概念上来说就是我们通过对多个弱可学习的算法进行"组合 ...

  3. [机器学习]-Adaboost提升算法从原理到实践

    1.基本思想: 综合某些专家的判断,往往要比一个专家单独的判断要好.在”强可学习”和”弱可学习”的概念上来说就是我们通过对多个弱可学习的算法进行”组合提升或者说是强化”得到一个性能赶超强可学习算法的算 ...

  4. Atitit. 提升存储过程与编程语言的可读性解决方案v3 qc25.docx

    Atitit. 提升存储过程与编程语言的可读性解决方案v3 qc25.docx 1. 大原则:分解+命名1 1.1. 命名规范1 1.2. 分层.DI和AOP是继OO1 1.3. 运算符可读性一般要比 ...

  5. Atitit.软件兼容性原理与实践 v5 qa2.docx

    Atitit.软件兼容性原理与实践   v5 qa2.docx 1. Keyword2 2. 提升兼容性的原则2 2.1. What 与how 分离2 2.2. 老人老办法,新人新办法,只新增,少修改 ...

  6. Atitit.异常的设计原理与 策略处理 java 最佳实践 p93

    Atitit.异常的设计原理与 策略处理 java 最佳实践 p93 1 异常方面的使用准则,答案是:: 2 1.1 普通项目优先使用异常取代返回值,如果开发类库方面的项目,最好异常机制与返回值都提供 ...

  7. Atitit.ide技术原理与实践attilax总结

    Atitit.ide技术原理与实践attilax总结 1.1. 语法着色1 1.2. 智能提示1 1.3. 类成员outline..func list1 1.4. 类型推导(type inferenc ...

  8. Atitit 表达式原理 语法分析 原理与实践 解析java的dsl  递归下降是现阶段主流的语法分析方法

    Atitit 表达式原理 语法分析 原理与实践 解析java的dsl  递归下降是现阶段主流的语法分析方法 于是我们可以把上面的语法改写成如下形式:1 合并前缀1 语法分析有自上而下和自下而上两种分析 ...

  9. Atitit.软件兼容性原理与实践 v3 q326.docx

    Atitit.软件兼容性原理与实践 v3 q326.docx 1. 架构兼容性1 2. Api兼容性1 2.1. 新api  vs  修改旧的api1 3. Web方面的兼容性(js,html)1 3 ...

随机推荐

  1. Atitti knn实现的具体四个距离算法 欧氏距离、余弦距离、汉明距离、曼哈顿距离

    Atitti knn实现的具体四个距离算法  欧氏距离.余弦距离.汉明距离.曼哈顿距离 1. Knn算法实质就是相似度的关系1 1.1. 文本相似度计算在信息检索.数据挖掘.机器翻译.文档复制检测等领 ...

  2. C#获取文本文件的编码,自动区分GB2312和UTF8

    C# 获取文本文件的编码,自动区分GB2312和UTF8 以下是获取文件编码的一个类 using System; using System.IO; using System.Text; /// < ...

  3. js防止客户端多触发

    代码: /***防止多触发**id 必须唯一*fn 回掉函数*wait 延迟多长时间**使用例子:* ToPreventMoreTrigger('id', function () {//注意 id 是 ...

  4. ngOptions

    ngOptions select as select as label for value in array <select ng-model="myColor" ng-op ...

  5. universal image loader自己使用的一些感受

    1.全局入口的Application定义初始化: ImageLoaderConfiguration configuration = new ImageLoaderConfiguration.Build ...

  6. 转载:css3 content 生成内容

    本文地址:http://www.w3cplus.com/solution/css3content/css3content.html 这篇文章挺不错的,建议看一下. content一般和:before, ...

  7. transform你不知道的那些事

    transform是诸多css3新特性中最打动我的,因为它让方方正正的box module变得真实了. transform通过一组函数实现了对盒子大小.位置.角度的2D或者3D变换.不过很长时间内,我 ...

  8. hibernate(四)ID生成策略

    一.ID生成策略配置 1.ID生成方式在xml中配置方式: <?xml version="1.0"?> <!DOCTYPE hibernate-mapping P ...

  9. android 键盘遮挡 父布局上滚解决

    private void controlKeyboardLayout(final View root, final View scrollToView) { root.getViewTreeObser ...

  10. 自制jQuery焦点图切换简易插件

    首页经常是需要一个焦点图切换的效果,最近做的项目也正好需要,所以在网上搜索,后面查到了一个半成品的插件,这里我自己修改了一下. js文件夹下面有两个文件夹jquery.jslide.js与jquery ...