自该书第1版于1999年出版以来,编程语言的研究已得到迅猛发展。例如,从CS1开始,Java已经成为计算机科学课程一门重要的语言。敏捷编程与软件设计如影随形,且其语言习惯有别于传统的程序。用正规的方法进行软件设计已渐入主流,且作用显著。 有鉴于此,新版希望能够适应在当前和未来编程语言设计过程中所伴随的的激励和新挑战。例如,新版对全部4种程序设计范例及其所用的语言在广度和深度上都有进一步的提高,如表0-1所示。 表0-1 语言覆盖范围 范 例 第1版 第2版 命令式(第12章) C、Ada、Perl 面向对象(第13章) Java Java、Smalltalk、Python 函数式(第14章) Scheme、Haskell Scheme、Haskell 逻辑式(第15章) Prolog Prolog 新版第二个主要的变化是大大丰富了第2~11章关于语言设计原理的内容。我们使用不太正式的描述风格,增加了新的来自流行编程语言(如Python 和 Perl)的例子。此外,对于已经不再广泛应用的语言(如Pascal和Modula),新版多已略去。 第2、 4、 5、 7、 9章主要讲述编程语言的核心原理——语法、名称、类型、语义和函数。这几章与第1版相比较,为上机学习这些原理提供了更广泛、更深入的语言和范例。 如果您希望了解语法、类型系统、语义、函数和存储管理的具体实现原理,可以在第3、6、8、10和11章中找到这些材料。读者可以有选择地学习这几章,以丰富相关的核心原理。例如通过学习第3章中编译器的词汇和语法段,可加深和巩固对第2章的学习。注意,可以跳过部分或全部的章节,特别是初学编程语言的学生。 有3章包括了需要较多数学背景知识的可选部分。附录B提供了这些章节中主要的离散数学问题和概念,供需要快速复习的学生使用。 最后,第16、17和18章详细介绍了事件处理、并发性和程序正确性。第1版涵盖其中的两部分(事件处理和并发性),但新版加入了关于程序正确性的介绍。 总之,新版在编程语言的原理、范例和专题方面涵盖的范围更广、更深。本书共有18章。由于不同的教师对编程语言课程强调的重点有不同的看法,所以本书提供了多种选择。 0.1 提示 本书强调在编程语言设计中对于关键问题的全面实践操作。它为老师和学生提供了理论与实现相结合的经验。基于实现的经验包括C语言简单子集的设计和实施的上机操作,这被称作Clite。为便于参考,在附录A中给出了完整定义。 如上所述,本版对于主要编程范例进行了扩展。我们相信,为了掌握一个范例,学生们必须积极运用范例去解决编程问题。例如,如果学生没有函数式编程的经验,建议他们充分学习Scheme或者Haskell,完成一个说得过去的编程项目。引用一个评论者的评语: 为了明白一个范例,您自己必须实现这个范例。 另一方面,如果您的预备课程离散数学,或者AI课程已经包括函数式程序设计,可以选择跳过这一章,重点学习其他的范例或专题。 0.2 本书的结构 图0-1解释了正文如何分为3个主要的部分: ● 原理。 ● 范例。 ● 专题。 在第1部分,第2、4、5、7、9章包括5个核心原理—— 语法、名称、类型、语义和函数。该部分剩余章节(第3、6、8、10、11章)有助于加深对这些主题的理解。 图0-1 各章之间的内容关系 另一方面,高年级或研究生课程可能会包括其中的一些内容,而没有强调的材料在后续的章节中介绍。 本书的第2部分包含4个主要的程序范例: ● 命令式编程。 ● 面向对象编程。 ● 函数式编程。 ● 逻辑式编程。 这些章之间相对独立并且可以按任意顺序学习。尽管如此,一个学期的课程安排除了原理之外,一般只包括命令式编程和面向对象。当然,范例的选择可能会根据教师的侧重和该学期课程内容的不同而不同。例如,如果该学期已经有面向对象设计课程,就可以跳过第13章。 新版中的第12章是全新的内容,这一章阐述了在C、Ada和Perl 3种不同的语言中命令式编程中的关键特点,选择C语言是因为它说明了弱类型引起的问题。相反,Ada是强类型,提供了和C语言生动的对比。最后,选择Perl是由于它阐述了一种动态类型脚本语言。对讲授第12章的教师,建议在安排趣味编程项目时,包含至少一门有足够深度的语言,并且学生不熟悉这门语言。 第13章在第1版的基础上进行了较多改写。新版中,使用Java、Smalltalk和Python来研究面向对象语言的特点。使用Smalltalk主要是因为它的简单性,使用Java主要是因为它的广泛性,而使用Python主要是因为它在脚本应用程序上的灵活性。对于已经在预备课程里学过Java但没有学习过面向对象设计的学生,或许会从学习其他两门语言之一受益。面向对象范例今后一直会很重要。 函数式编程和逻辑式编程的范例(第14和15章)陆续会在其应用程序和各自的编程类型上予以区分。在介绍函数式编程时,涵盖了对并行Scheme和Haskell的讨论,所以学生只学习其中任意一种语言就可以掌握函数式编程的思想。 本书第3部分包括3个专题: ● 事件处理。 ● 并发性。 ● 正确性。 大学编程语言课程通常只涉及这些主题中的一个,而没有时间去涉及其他的主题。老师在决定编程语言课程中包含哪一个主题时应考虑到这些主题在其他课程中出现的情况。 第16和17章的主题是事件处理和并发性,叙述了反常控制问题,在编程语言的学习中需要认真对待这个问题。在编程应用中,特别是在科学计算和嵌入系统方面,二者的作用日渐凸现。学生们需要学习的主要内容包括:通信、死锁、信息传递、非确定性、事件处理、交互处理通信,以及种类繁多的具体应用(如操作系统、GUI交互和家用报警系统)中的某些个案。 最后,第18章关于正确性的内容将让人耳目一新,这一章主要分析了编程语言在支持常用方法上的发展。例如, Spark Ada的开发人员宣称使用“由架构保证正确性”的技术使编程错误数目降低了99%,并使生产率提高了3~5倍。我们认为未来对编程语言而言,软件设计中对形式方法的支持将日渐重要(很像现今面向对象编程重要一样),因此,希望老师能在编程语言课程中加入这一章。 第18章一开始回顾了公理语义学及其在命令式编程检验中的应用。这一章涵盖了在面向对象语言中“契约设计(design by contract)”的概念及其使用Java建模语言的具体应用,并延伸了这一理论。本章也涉及了结构化归纳的概念及其在检验函数式程序的正确性方面的应用。 需要说明的是,后面章节的一些问题应该在其他课程中学习,而不是仅在编程语言和范例中学习。比如,并发性、事件驱动编程和程序正确性都应该作为一门独立的课程进行学习。此外,在第3、6、8、10和11章中很多的内容可以作为编译课程的基础。因为很多大学课程安排中没有提供这些主题的专门课程,本书只是在编程语言课程中作入门性的简单介绍。 0.3 本书预备知识和学习指导 在学习这门课之前应该至少已经完成一门预科课程或者学习过数据结构。在数据结构课程中,应该已经熟悉了链表、堆栈、稀疏矩阵和哈希表。 此外,在第3、6、8、16和17章任何含有程序执行的内容中,Java知识是学习的先决条件。如果没有学习过Java,也应该通过数据结构课程来熟悉C、C++或C#方面的知识。 建议学生准备一个好的Java指南、参考手册和编程环境。这些在网络上很容易获得。我们讨论的某些内容需要Java 1.4和Java 1.5引入的新特性的支持。这些特性在文中已清楚标明。 我们也希望学生有一定的数学知识,即初等离散数学和离散结构课程的相关知识。尽管这不是必需的,但是对于要学习数学因素浓厚的某些章节(第3、6、8、10和18章)的学生而言还是非常必要的。附录B中回顾了基本的函数、集合、逻辑和证明的内容。 本书与Computing Curricula 2001 [ CC 2001]的介绍是一致的。本书涵盖了Liberal Arts Model Curriculum [Walker and Schneider, 1996]及其2005年未定稿版本中描述的编程语言课程中所涉及的所有问题。 本书涵盖了Computing Curricula 2001的核心知识部分关于编程语言的所有主题(从1到11部分),还涉及该部分的其他主题,例如,事件驱动和并发编程(PF6)、内存管理(OS5)、函数及逻辑式编程(IS)和软件工程(SE)。相对于Computing Curricula 2001,本书对每个主题都用了更多的篇幅进行讲解 0.4 编程语言资源和Web站点 本文所涉及的软件都可在Java 1.5或者更高的版本中执行,而且我们已经使用SUN公司开发的Java 1.5执行过书中的程序。表0-2是我们推荐的一系列网络资源,包括书中涉及的主要编程语言的学习指南和其他信息。 表0-2 编程语言与Web站点 语 言 Web资源地址 与该书配套的软件和相关的资料可以在站点找到,具体包括包括: ● Clite的Java语法、类型系统和语义的完整Java实现过程。 ● 本文所有可运行程序的下载包。 ● 与本书配套的授课幻灯片。 ● 课后作业答案(教师可通过密码认证获得)。 0.5 致谢 在写作过程中,很多人给予了指导。James Lu是第1版初稿的最主要合作者。William学院的Bill Bynum、Holy Cross学院的Mary和Laurie King分别撰写了第4章和第8章。William学院的David Coppit介绍了第18章中出现的校验树的使用。Bowdoin学院和William and Mary学院的学生为第1版和第2版的早期版本作出了贡献。还要特别提到的是,Doug Vail对一些富于挑战性的问题提出了解决的办法。Wyatt Dumas帮助重写了第2版中的程序,并在其中两章的内容上使我们受益匪浅。我们要感谢所有的审阅者: Qi Cheng Oklahoma大学 Rainey Little Mississippi州立大学 Jay-Evan J. Tevis Auburn大学 John Hannan Pennsylvania州立大学 Neelam Soundarajan Ohio州立大学 Robert van Engelen Florida州立大学 Shannon Tauro California大学Irvine分校 Gloria Melara California州立大学Northridge学院 Amer Diwan Colorado大学Boulder学院 Susan Gauch Kansas大学 Henri Casanova California大学San Diego学院 Cristina V. Lopes California大学Irvine学院 Salih Yurttas Texas A&M大学 Roman W. Swiniarksi San Diego州立大学 Amar Raheja California State Polytechnic大学Pomona学院 Franck Xia Missouri大学Rolla学院 Rajendra K. Raj Rochester技术学院 Randall D. Beer Case Western Reserve大学 Robert M. Cubert Florida大学 Liang Cheng Lehigh大学 David Hemmendinger Union学院 正是他们仔细的阅读、富有建设性的评审和集体智慧,极大地推动了本书第1版和第2版的出版。也正是通过他们集体而卓越的洞察力使得本书第1和第2版有了本质的提高。作者还要特别感谢Union学院的David Hemmendinger为本书所作的认真编辑和详尽建议,其中大部分已经融入到书中。 最后,我还要感谢我们的编辑Rebecca Olson和Alan Apt,感谢他们的见识、指导和支持。他们非凡的技巧使得第二版有了更大的发展。 Allen B. Tucker Robert E. Noonan Bowdoin William and Mary学院