第一章、基本概念
01、对自然语言而言,那些只掌握有限语言的人,其思维的复杂程度,特别是其抽象思维的深度,必然受到局限。换言之,人们对不能口头或笔头描述的事物结构必定很难将其概念化。
02、往往只有懂得有关的程序设计语言实现细节的程序员才可能发现和改正某些类型的程序错误;不懂得递归调用是如何实现的程序员,常常不知道地柜算法比等价的迭代算法要慢得多。
03、程序设计语言的正交性指的是,使用该语言中一组相对少量的基本结构,经过相对少的结合步骤,可以构成该语言的控制结构与数据结构。而且,它的基本结构的任何组合都是合法的和有意义的。
04、正交语言特性的意义是独立于它在程序中出现的上下文的。缺乏正交性会导致语言规则异常。语言的正交性与语言的简单性是紧密相关的:程序设计语言的正交性设计得越好,该语言规则中的异常情况就会越少。
05、过分地追求正交性也会产生问题,极端的正交性会导致不必要的复杂性。一组较少量的基本结构以及一套相互一致的规则组合(即正交性),比仅仅具有大量的基本结构要优越得多。
06、过分的正交性也会有损于可写性,当基本结构的任意结合几乎都是合法时,程序中的错误就很难被检测出来。这也会导致编译器不能够发现代码中的谬误。
07、抽象指的是以合法省略许多细节的方式,来定义并且使用复杂结构或复杂运算的能力。
08、类型检测是语言可靠性中的一个重要因素。编译时的类型检测要比运行时的类型检测更为理想,因为运行时的类型检测是高代价的。程序中的错误发现得越早,改正错误的代价就越低。
09、如果具有中断运行时错误(以及这个程序所发现的其他非正常情况)并改正错误然后继续运行的能力,将显然有助于提高程序的可靠性。这种程序设计语言的机制称之为异常处理。
10、无论某语言的编译器质量如何,要求进行大量运行时类型检测的语言必将阻碍代码的高速执行。
11、由于运算指令被顺序地存储于相邻的存储单元,所以冯诺依曼计算机上迭代式的循环是高速的。这种高效率不鼓励使用递归式循环,尽管递归式循环常常更为自然。
12、面向对象的程序设计方法学始于数据抽象。这种方法将数据处理和数据对象封装在一起,并控制对数据的访问,并添加了继承与动态方法绑定。
13、Java语言的定义要求,必须对所有数组元素的引用进行检测,以保证所有下标都在合法的范围之内。这个步骤给包含大量数组元素引用的Java程序增加了很大的执行代价。C语言不要求进行下标范围检测,所以C程序的执行速度要比语义上等价的Java程序要快得多;当然Java程序更为可靠。Java语言的设计人员以程序执行效率为代价换取了可靠性。
14、一台计算机的存储器与它的处理器之间的链接速度通常决定着这台计算机的速度,因为执行指令的速度往往比将指令传递到处理器的速度更快,这一问题被称为冯诺依曼瓶颈。
15、Java语言的最初实现都是采用混合方法。其中被称为字节码的中间形式给任何装有字节码的解释器以及与之相关的运行时系统的机器提供了可移植性。所有这样的机器都被统称为Java虚拟机。而现在有些系统将Java字节码翻译为机器码,以便达到更快的执行速度。
16、即使(just-in-time,JIT)实现系统最初将程序翻译成一种中间语言。然后在执行的过程中,当中间语言的方法被调用时,这种实现系统再将中间语言的方法翻译为机器码。现在JIT实现系统被广泛用于Java程序。所有的.NET语言也都是用JIT系统实现的。
第二章、主要程序设计语言的发展
无
第三章、描述语法和语义
01、语言的使用人员必须能够通过查阅语言参考手册来确定如何编写软件系统。教科书和培训课程固然能够帮助学习语言,然而通常,语言手册是一种语言唯一的权威性信息来源。
02、程序设计语言的语法是它的表达式、语句和程序单元的形式,而它的语义则是这些表达式、语句和程序单元的含义。
03、程序设计语言的语法形式描述通常不包括对于最低层次语法单元的描述,这些语法小单元称为词素(Lexeme)。词素的描述由词法说明给出,它与语言的语法描述是分开的。一种程序设计语言的词素包括它的字面值、操作符和特殊字,以及其他。我们也可以认为程序是一些词素的串,而不是字符的串。
04、在BNF的描述或文法中,抽象通常被称为非终结符(nonterminal symbol),或者简称为非终结(nonterminal),而规则中的词素和标记则被称为终结符(terminal symbol),或者简称为终结(terminal)。一个BNF描述,或一种文法,仅仅是一个规则的集合。BNF尽管简单,但它具有充分的表达能力来描述几乎所有的程序设计语言的语法。
05、数学中使用省略符号(......)来表示长度可变,BNF中没有,而是使用递归来作为此类替代方法。如果一条规则中的LHS(Left Hand Side)出现在它的RHS(Right Hand Side)当中,我们称这条规则是递归的。
06、文法是定义语言的生成装置。句子的生成则被称为派生。
07、语法分析树的每一个内部节点都由一个非终结符来标记;而它的每一个叶子节点都由一个终结符来标记。语法分析树的每一颗子树都描述语句中抽象的一个实例。
08、如果由一条文法生成的句子具有两种或者多种不同的语法分析树,就称这条文法是歧义的。
09、语法分析树与派生之间的联系非常紧密:很容易从它们两者中的任意一个构造出另外一个。非歧义的文法的每一个派生只有唯一的语法分析树,尽管这棵树能够被不同的派生所表示。
10、操作符的结合性:当一条文法的LHS也出现在它的RHS的起始位置,这条规则就被称为左递归的,左递归说明左结合性。如果一条文法规则的LHS出现在RHS的最右端,则该条文法规则是右递归的,右递归说明右结合性。