现代程序设计语言的主要要求是
可读性、抽象和对复杂性的控制机制。
3.1 语言的历史和设计标准
执行效率、
通用标准、
生成有效代码、
抽象机制
减少语言的规则和限制降低了语言定义的复杂性,使语言更容易用于解决实际问题
简单性、
可读性
3.2 语言的效率
目标代码的效率:语言的设计应该使编译器能够生成有效的可执行代码(最优化)
翻译的效率:语言的设计能够使用速度快、长度适中的翻译器有效地翻译语言的源代码?
可实现性或者编写翻译器的效率
程序设计的效率:用语言编写程序的速度和难易程度如何?
语言的表达能力:复杂过程及其结构能够容易表示?或者是否容易将程序员的思想映射为实际的代码?
可靠性、可编写性
3.3 规律性
规律性 体现在如何将语言的一些特性溶为一体的良好程度。
好的规律性要求
特定结构中不常见的限制较少,结构之间奇特的相互作用较少,语言特性中奇异的运行方式较少。
规律性通常分为三种更确切的概念:
一般性、正交性和统一性。
一个语言要获得
一般性,应该避免在可用的结构中使用
特殊情况,以及避免把紧密相关的结构
整合成单个的更通用的整体。
正交性 是源于数学中的一个术语,意思是处于垂直或完全无关的方向。
程序设计语言中的正交性表示语言的结构可以用任意有意义的方式组合,同时结构的相互作用和使用的内容不应该产生未预料到的限制或行为。
统一性的意思是,类似的东西应该看起来相似且具有类似的意义,反之,不同的东西应该看起来完全不同。
违反规律性的实例:
一般性
·
C中相等运算符“==”不能直接用于比较两个结构体和数组,但可用于比较元素。因而,相等运算符缺乏一般性。而C++部分取消了该限制。
· Pascal不含变长数组,因此数组缺乏一般性。C和Ada却又变长数组。
正交性 在不同的上下文中,一个语言结构不应该有不同的行为。与上下文相关的限制是非正交的。
·
在C中,局部变量只能在分程序的开头定义(复合语句),而在C++中,可以在分程序的任何地方定义。
·
在C语言中,参数的传递存在非正交性:数组按索引传递,其他参数按值传递。
统一性 该原则主要集中于语言结构形式和性能的一致性。非统一性包含两类:相似的东西看起来不相似,不相似的东西看起来相似。
·
C++,类的定义之后必须有分号,而函数的定义之后却不要分号。
· Pascal的函数返回值看起来同赋值语句很相似。
3.4 进一步的语言设计原理
·简单性 “每件事情都应该尽量简单,但不能过于简单……”——爱因斯坦
·表达能力 指用语言表达复杂过程和结构的难易程度。面向对象特性正因为极大的提高了程序员根据设计编码的能力而流行。
·可扩充性 提供用户一些通用的机制,让用户为语言添加新的特性。简单地说就是能够定义新的数据类型;向翻译器本身添加关键字和结构。
·可限制性 应当能让程序员使用语言的最少知识和最少的语言结构进行编程。
·记法同习惯一致 尽可能多地合并那些标准的特性和概念。
·精确性 存在语言的精确定义,从而使得可以预测程序的行为。
·机器无关性 语言实现应与特殊机器无关。
·安全性 减少编程错误;允许发现和报告错误。
3.5 C++:语言设计的实例研究
3.5.1 背景
Stroustrup以C语言为基础,加入了他觉得很有用的Simula67的类结构来开发新语言。
设计目标:
a)用类、继承、强类型检验的形式支持优秀的程序开发。
b)以C或BCPL的 同等速度高效 执行。
c)良好的 轻便型,易于实现,易于和其他工具整合。
3.5.2 第一次实现
语言发展的基本目标扩展:
1)尽量维持 与C的兼容性
2)应该在 实践经验 的基础上不断发展
3)任何新增特性的实现,必须以 不降低程序运行效率 为前提。如果不行,就要求在不适用新特性时,不会增加额外开销。
4)不应强迫程序员使用单一程序设计形式,“多种多样”
5)应维持和强化其 强类型检查
6)应该可以 分阶段学习,就是说尽可能地在使用C++的某些特性进行编程时,不需要了解语言中其他目前未使用的特性。
7)应保持 与其他系统和语言的兼容性。
此时该语言包括静态绑定、函数、运算符重载和改进的类型检查系统,但不包括类型参数、异常和多重继承。
3.5.5 小结
C++为什么会如此成功? 也许最重要的原因,正是人们对
面向对象技术 不断增长的爆炸性兴趣,才使它把面向对象特点编程了计算的主流,因此它直接使用
基于C的语法,
不受限于特定的操作环境,且不牵扯性能方面的副作用。其他导致C++如此流行的因素包括它的
灵活性、
多态性和
可扩展性。