程序设计语言原理(原书第12版)
作者 : [美] 罗伯特·W. 塞巴斯塔(Robert W. Sebesta) 著
译者 : 徐宝文 王子元 周晓宇 等译
丛书名 : 计算机科学丛书
出版日期 : 2022-01-13
ISBN : 978-7-111-69621-6
适用人群 : 程序设计人员
定价 : 229.00元
教辅资源下载
扩展信息
语种 : 简体中文
页数 : 564
开本 : 16
原书名 : Concepts of Programming Languages,Twelfth Edition
原出版社: Pearson Education Inc.
属性分类: 教材
包含CD : 无CD
绝版 :
图书简介

本书从为什么学习程序设计语言、常用程序设计语言的演化史、评估程序设计语言结构的标准,以及这些语言基本的实现方法开始讲起,通过不局限于特定语言种类地分析语言结构的设计问题,检测设计选择,以及比较设计可选方案来讲述程序设计语言基本原理。

图书特色

覆盖程序设计语言的基本概念、结构设计以及常见编程语言的结构设计方案选择

图书前言

第12版的更新
本书第12版的目标、总体结构以及方法与之前的11个版本相同。第一个目标是介绍现代程序设计语言的基本结构,并为读者提供对现有以及未来的程序设计语言进行严格评估的工具。第二个目标是帮助读者做好学习编译器设计的准备,为此,本书深入讨论了程序设计语言的结构,展示了描述语法的形式化方法,并介绍了词法和语法分析的方法。
与第11版相比,第12版有若干变化。为了保持本书内容不落伍,对于某些程序设计语言(尤其是Lua和Objective-C)的讨论,本版本几乎全部删除,而有关较新的程序设计语言Swift的内容则被分别增加到若干章中。
此外,在第6章中新增一节介绍可选类型。在8.3.4节中增加了一些介绍Python中的迭代器的内容。书中还有多处小改动,以对一些讨论内容进行纠正和澄清。
愿景
本书主要描述程序设计语言的基本概念。为此,主要讨论各种语言结构的设计问题,研究一些最常见的语言在结构上的设计选择,并对备选设计方案进行严格的比较。
对程序设计语言进行的任何细致研究都无法脱离一些相关的主题,包括描述程序设计语言语法和语义的形式化方法,第3章将介绍这些方法。此外,还必须考虑各种语言结构的实现技术,第4章将讨论词法和语法分析,第10章将介绍子程序链接的实现。本书还将讨论一些其他语言结构的实现技术。
以下各段将概述第12版内容。
章节概述
第1章首先介绍程序设计语言的基本原理,然后讨论用于评价程序设计语言和语言结构的标准,同时,分析影响语言设计的主要因素、语言设计中的权衡以及语言实现的基本方法。
第2章概述本书所讨论的语言的发展过程。虽然没有完整地描述任何一种语言,但是对每种语言的起源、目的和贡献都会进行讨论。这样的历史回顾是很有价值的,因为它为我们理解当代语言设计的实践和理论基础提供了必要的背景。这也推动了对语言设计与评价的进一步研究。因为这本书的其余部分都不依赖于第2章,所以这一章可以独立于其他章节单独阅读。
第3章先介绍用于描述程序设计语言的BNF范式的主要形式化方法。接下来讨论用于描述语言的语法和静态语义的属性文法。然后探讨语义描述的难点,并对三种最常见的语义方法(操作语义、指称语义和公理语义)进行简要介绍。
第4章介绍词法分析和语法分析。这一章主要面向那些不设置编译器设计课程的计算机科学院系。与第2章类似,这一章独立于除第3章之外的所有部分。这意味着这一章也可以独立于其他章节单独阅读。
第5~14章详细描述程序设计语言中主要结构的设计问题。对于每一种语言结构,都将讲述几种示例语言的设计选择并对其进行评估。具体来说,第5章介绍变量的一些特性,第6章介绍数据类型,第7章解释表达式和赋值语句,第8章描述控制语句,第9章和第10章讨论子程序及其实现,第11章研究数据抽象机制,第12章深入讨论支持面向对象程序设计的语言特性(继承和动态方法绑定),第13章讨论并发程序单元,第14章讨论异常处理,并简要讨论事件处理。
第15章和第16章描述两种重要程序设计泛型:函数式程序设计与逻辑程序设计。注意,第6章和第8章已经讨论过函数式程序设计语言的某些数据结构和控制构造。第15章介绍Scheme,包括它的一些基本函数、特殊形式、函数形式,以及一些使用Scheme语言编写的简单函数示例。此外,还简要介绍ML、Haskell和F#,以说明函数式程序设计的一些不同方向。第16章介绍逻辑程序设计以及逻辑程序设计语言Prolog。
致授课教师
一般应详细讲解第1章和第3章。对于第2章,尽管学生们会认为其内容很有趣且阅读起来很轻松,但由于缺乏严格的技术内容,我们不建议为其安排比较多的课时。如前所述,由于后续各章中的内容都不依赖于第2章,因此可以跳过该章。如果单独设置了编译器设计课程,那么也不需要讲授第4章。
对于那些具有较为丰富的C++、Java或C#编程经验的学生来说,第5~9章学习起来应该相对容易,而第10~14章的内容更具挑战性,因此需要更加详细地讲授。
第15章和第16章对于大多数低年级学生来说是全新的内容。在理想情况下,应该为需要学习这些内容的学生提供Scheme和Prolog的语言处理器。使用充足的学习材料可以让学生学习程序设计简单一些。
面向本科生开设的课程可能无法涵盖本书最后两章中的所有内容,但面向研究生开设的课程应该能够跳过前面几章中有关命令式程序设计语言的内容,这样就能有足够的课时来讨论最后两章中的内容。
补充材料
读者可以访问本书的配套网站www.pearson.com/cs-resources来获取一些补充材料,包括:
一套讲义幻灯片。书中的每一章都有配套的幻灯片。
本书中的所有图片。
几种程序设计语言的迷你手册(约100页的教程)。
可供使用的语言处理器
本书所讨论的某些程序设计语言的处理器以及相关信息可在以下网站找到:
C、C++、Fortran和Ada gcc.gnu.org
C#和F# microsoft.com
Java java.sun.com
Haskell haskell.org
Scheme www.plt-scheme.org/software/drscheme
Perl www.perl.com
Python www.python.org
Ruby www.ruby-lang.org
几乎所有的浏览器都包含JavaScript,而PHP事实上也包含在所有的Web服务器中。
配套网站提供上述所有信息。

上架指导

计算机\程序设计

封底文字

本书主要介绍程序设计语言的基本概念,讨论语言结构的设计问题,研究C++、Java、Python等常见语言在结构上的设计选择,并对设计备选方案进行严格的比较。
主要目标:
讲解现代程序设计语言的基本结构,并提供对现有以及未来的程序设计语言进行严格评价的工具。
为学习编译器设计做好准备,介绍描述语法的形式化方法,以及词法和语法分析方法。
第12版对全书内容做了与时俱进的更新,主要包括:
删除了相对过时的程序设计语言,例如Lua和Objective-C。
新的程序设计语言Swift的有关内容被添加到若干章中。
第6章新增了6.12节介绍可选类型,8.3.4节增加了一些介绍Python中的迭代器的内容。
作者简介:
罗伯特·W. 塞巴斯塔(Robert W. Sebesta) 科罗拉多大学斯普林斯分校计算机科学系荣休副教授,拥有40多年计算机科学课程教学经验,研究兴趣包括程序设计语言的设计和评估以及Web程序设计。

作者简介

[美] 罗伯特·W. 塞巴斯塔(Robert W. Sebesta) 著:罗伯特·W. 塞巴斯塔(Robert W. Sebesta) 科罗拉多大学斯普林斯分校计算机科学系荣休副教授,拥有40多年计算机科学课程教学经验,研究兴趣包括程序设计语言的设计和评估以及Web程序设计。

译者序

40年前的1981年是我大学生活的最后一个学年,我带着对程序设计语言的浓厚兴趣,通过秋季的考研从武汉大学考上了武汉数字工程研究所(第六机械工业部第七研究院第七零九研究所)的研究生,并在1982年1月大学一毕业就师从王振宇教授从事程序设计语言设计、分析与实现研究。
当时,国内大学主要学习的程序设计语言是ALGOL 60、FORTRAN、COBOL,当然也有一些学校教的是BASIC,后来也有少数学校教Pascal语言。由于当时还没有引进计算机,所学所用的计算机都是国产机,全国加起来也没有多少台计算机,基本上都用在国防、气象、物探等部门,能够使用的语言也只有ALGOL 60与FORTRAN。因此,当时国内对高级程序设计语言的认识基本上还停留在ALGOL 60是算法语言,适合于教学,FORTRAN是公式翻译语言,适合于公式计算,还谈不上对程序设计语言有多么深入的研究,更谈不上对程序设计语言的问题有多么深入的分析。软件工程的概念虽然问世十多年,但还没有引入国内(当然,国内当时也意识到goto语句是有害的)。此后,南京大学的徐家福、中科院软件所的仲萃豪、北京大学的杨芙清教授合作,在Modula与Modula-2语言的基础上分别研制出了XCY(系统程序语言)与XCY-2语言,中科院软件所的唐稚松院士则提出了世界上第一个可执行时序逻辑语言XYZ/E。
然而,国际上的情况却与国内全然不同。一方面,NATO联邦德国软件工程会议开始总结软件开发与维护过程中的问题,促使软件工程学科慢慢形成;另一方面,国外研制与使用的语言有上千种,仅美国国防系统使用的语言就有数百种,美国国防部(DOD)在20世纪70年代前期就开始意识到软件的许多问题是与程序设计语言密切相关的,这些问题包括响应度、可靠性、费用、可修改性、时限性、可移植性、效率等。为此,DOD投入巨资历时八年研制了Ada语言。
Ada语言强调可读性,注重程序设计是人的活动这一特性,同时也重视可靠性与效率等。它除了拥有那时大多数程序设计语言拥有的一般设施外,还具有模块化、重载、并发处理、异常处理、实时处理、类属(现在称为泛型)、表示与实现相分离等设施,后来的许多语言(如C++等)都吸收了Ada的许多概念与设施。但由于那时大多数计算机存在内存小、运行速度慢等问题,Ada还是像ALGOL 68、PL/I等语言一样受到一些人的批评, C. A. R. Hoare甚至在他1980年获得图灵奖的演讲中以“皇帝的旧装”为题对Ada进行了非常强烈的抨击。他认为Ada过于复杂,引入了太多的特征与表示法,“这些特征与表示法中有许多是不必要的,有一些设施(如异常处理等)甚至是很危险的”,Ada“追求小发明和闪光的饰品超过了对安全和经济的基本关心”,并警告“不要容许将此语言按目前现状用于可靠性紧要的领域”。针对Hoare对Ada的批评,我花很长时间对Ada进行了认真而系统的分析,并在1983年11月于湖北宜昌召开的全国Ada语言研讨会上发表了《简明性:Ada简明吗?》(此文修改后发表于《计算机技术》 1985年第4期)。我在该文中针对Hoare对Ada的批评,指出尽管Ada的概念与机制比较多、功能很强,但由于设计得很精巧,各种机制风格统一、有机融合,理解起来并不复杂,而且也不会产生可靠性问题。结论是:机制多、功能强的语言并不一定复杂,而且可以是很简明的,Ada就是一个简明的语言。
在Ada语言研制前后,国际上许多语言研究者也研制出一些遵循软件工程原理的语言,如CLU、Delphi、Edison、Euclid、Modula、Modula-2、Modula-3、Oberon、Object Pascal、Scheme等。
那个时候,由于个人计算机的出现,计算机的应用不再限于国防、军工系统与天文、气象、物探、银行等部门,开始走向社会,走入家庭,走向一般行业。而这些计算机应用软件一开始对可靠性、可读性、可移植性、可维护性等要求并没有那么强烈,相关软件开发人员更看重程序的可写性、灵活性与效率,加之Hoare图灵奖演讲的影响以及C语言在编写UNIX操作系统时获得的成功,使得C语言自此以后日渐盛行。
作为一个语言爱好者与研究者,我在研究Ada的同时也对C语言进行了认真的分析研究,发现:尽管C没有提供Ada所提供的模块化、并发处理、异常处理、实时处理、类属等设施,表面上看起来很简单,但C的许多概念理解起来却并不容易,用诸如类型、表达式、复合语句等C语言设施编写出的程序并不易于阅读理解,而且很容易出错,并且容易产生可靠性、安全性(safety)、可移植性、可维护性等问题。同时,我把自己的分析结果写成论文,在1984年秋天于苏州东山召开的全国C语言研讨会上宣读,当场就受到几个C语言拥趸大家的强烈批评。他们认为我对C的结论应该反过来写:C是一个可写性、可读性、可移植性、可靠性等都很好的语言。我虽然心中不服,但囿于自己当时还是硕士研究生,不仅不敢反驳,而且还得在口头上不停地表示认错。会后,我又对我的结论做了反复分析,认为并没有错,而且应该把这一结论告诉更多人,以提醒他们在使用C语言时要对C的一些问题引起重视。于是我对会议论文进行了仔细修改,在四年多的时间里向多个刊物投稿,但都没有被录用。这迫使我改变策略,对论文进行大幅度修改,在充分肯定C的基础上对其存在的问题顺带分析一下,并将论文的题目改为更中性的《C语言评注》,这才被录用并发表于《计算机研究与发展》1991年第7期。
那个时侯还没有进入网络时代,C语言的许多问题还没有充分暴露出来。到了互联网时代,人们突然发现许多安全性(security)与可靠性问题都与C语言所津津乐道的灵活性(如数组与指针的灵活运用、变量的表示与操作混合使用)等有关。
Bjarne Stroustrup从20世纪80年代初开始对C语言进行扩充,先是研制了C with Class语言,不久后将其扩充并命名为C++语言。C++是从在C的基础上增加类开始逐步地添加新设施而形成的语言:虚函数、运算符重载、多重继承、模板、异常、运行时类型识别(RTTI)、命名空间等。除了类及其相关的概念外,C++在C的基础上添加的许多设施都有从Ada中借鉴或直接拿来的痕迹,但由于C++的这些设施是逐步添加的,在概念表述与设施表示上就缺少了Ada那种一体化设计的相容性、一致性与优美性。
总之,程序设计语言与楼堂馆所等建筑一样,并不是功能强就一定复杂,一定难以理解与使用,一个功能强大的语言也可以很简明。
此前,程序设计语言的设计者主要是语言设计与软件研究者,而且大都是由一个小组而不是由一两个人设计的(N. Wirth是个例外,但他在设计Pascal、Modula与Oberon等语言之前曾与Hoare一起设计了ALGOL W语言,而Hoare又参与过ALGOL 60等的设计)。但自C语言开始,许多语言不再由程序设计语言专家设计,而是由语言使用者设计,C语言如此,C++语言如此,现在很流行的Python语言也是如此。这些语言的特点是强调功能、可写性、可学习性(实际上是浅层的可学习性),但对可读性、可靠性、安全性等基本上未予考虑,这也是很长一段时间以来C语言存在很多可靠性与安全性问题的原因之一。
问题不仅在于此,由于各种各样的原因(当然主要还是因为流行),多年来C、C++、Python等在可读性、可靠性、安全性、可移植性等方面存在较大问题的语言不仅得到了广泛的应用,而且几乎成了大多数高校计算机类专业的入门语言或必教语言,同时有些教科书又把这些语言中比较“肮脏(dirty)”的成分作为其优点进行教学或不正确地教授语言的相关成分,这给学生真正掌握语言结构与设施、编写良好的程序带来了麻烦。为了帮助学生更好地掌握程序设计语言的基本原理与基本概念,更好地学习、接受、掌握与分析新语言,我曾在1987年编写了一本《高级程序设计语言原理》讲义(经过多次试用后于1992年在航空工业出版社作为部编教材正式出版)。
顺便提一下,2008年年末,应周巢尘院士邀请,Hoare曾到访中科院软件所,他在采访中回答其1980年“皇帝的旧装”图灵奖演讲中的有关问题时,完全回避了他当年在演讲中对Ada的长篇幅的强烈批评,甚至连Ada都没有提及,而是顾左右而言他:“比如说像ALGOL 68这样的设计,我认为它们太过复杂了”“用这样的一个比喻来描述当时的这些程序设计语言太过复杂”,但“我现在回想起来,我当时说这些话,可能有一点太过傲慢”。然而,Hoare可能并没有意识到或者早就意识到了但没有公开承认,他作为图灵奖得主的这次公开演讲使Ada这样一门优秀的语言遭受了灭顶之灾,使其刚刚问世就一蹶不振,同时他也截断了程序设计语言健康发展的道路。这是一个教训:名人不要轻易臧否别人的研究与成果,因为即使是Hoare这样大名鼎鼎的图灵奖得主对他非常熟悉的小领域也会犯下难以挽回的错误。
从20世纪80年代到现在,时间过去了30多年,程序设计语言又进入了一个新的发展时期,不仅语言设施、成分与应用以及程序设计方法有了很大的发展,而且一批批新的语言不断被推出并得到推广使用,除前面列出的一些语言外,还有C#、Erlang、Go、Haskell、Java、JavaScript、Julia、Lua、Perl、R、Ruby、Rust、Scala、Scheme、Swift等。为了帮助广大教师、学生以及软件工作者学习、掌握与使用新语言,分析评价原有语言,我们翻译了本教材。
本书是一本著名的程序设计语言教材,已在欧美多个学校作为教材使用了很多年,它通过讨论分析各种语言结构与概念的设计问题,比较各种语言相关设施的特点与优劣,向读者讲授程序设计语言的基本原理。
本书的作者Robert W.Sebesta是美国科罗拉多大学斯普林斯分校(University of Colorado-Colorado Springs)计算机科学系的荣休副教授。他从事程序设计语言教学40多年,在所积累的丰富教学经验的基础上编写了这本教材,该教材经过多次修订,我们所翻译的是最新版—第12版。
本书由我负责译校,参加译校的老师还有王子元、周晓宇、张迎周、康达周、冯洋等。由于译校者水平有限,难免有错讹之处,敬请广大读者批评教正。

徐宝文
2021年10月

图书目录

译者序
第12版的变化
前言
致谢
第1章 预备知识1
1.1 掌握程序设计语言概念的必要性1
1.2 程序设计领域3
1.2.1 科学计算应用3
1.2.2 商业应用3
1.2.3 人工智能4
1.2.4 Web软件4
1.3 语言评价标准4
1.3.1 可读性5
1.3.2 可写性9
1.3.3 可靠性9
1.3.4 成本10
1.4 影响语言设计的因素11
1.4.1 计算机体系结构11
1.4.2 程序设计方法学13
1.5 程序设计语言分类14
1.6 语言设计中的权衡14
1.7 实现方法15
1.7.1 编译16
1.7.2 纯解释18
1.7.3 混合实现系统19
1.7.4 预处理程序19
1.8 程序设计环境20
小结20
复习题21
习题21
第2章 主要程序设计语言发展简史23
2.1 Zuse研制的Plankalkül语言23
2.1.1 历史背景23
2.1.2 语言概述25
2.2 伪代码25
2.2.1 短码26
2.2.2 快码26
2.2.3 UNIVAC编译系统27
2.2.4 相关工作27
2.3 IBM 704和Fortran27
2.3.1 历史背景27
2.3.2 设计过程28
2.3.3 Fortran I概述28
2.3.4 Fortran II29
2.3.5 Fortran IV、77、90、95、2003和200829
2.3.6 评价30
2.4 函数式程序设计语言:LISP31
2.4.1 人工智能的开端和列表处理31
2.4.2 LISP的设计过程32
2.4.3 语言概述32
2.4.4 评价33
2.4.5 LISP的两种后继语言34
2.4.6 相关语言34
2.5 迈向成熟的第一步:ALGOL 6035
2.5.1 历史背景35
2.5.2 早期设计过程35
2.5.3 ALGOL 58概述36
2.5.4 ALGOL 58报告的接受度37
2.5.5 ALGOL 60的设计过程37
2.5.6 ALGOL 60概述37
2.5.7 评价38
2.6 商业处理语言:COBOL39
2.6.1 历史背景39
2.6.2 FLOW-MATIC40
2.6.3 COBOL的设计过程40
2.6.4 评价40
2.7 分时处理的开始:Basic42
2.7.1 设计过程43
2.7.2 语言概述43
2.7.3 评价43
2.8 满足所有人的需求:PL/I46
2.8.1 历史背景47
2.8.2 设计过程47
2.8.3 语言概述48
2.8.4 评价48
2.9 两种早期的动态语言:APL和SNOBOL49
2.9.1 APL的起源及特征49
2.9.2 SNOBOL的起源和特征50
2.10 数据抽象的开端:SIMULA 6750
2.10.1 设计过程50
2.10.2 语言概述50
2.11 正交设计:ALGOL 6850
2.11.1 设计过程51
2.11.2 语言概述51
2.11.3 评价51
2.12 ALGOL系列语言的早期继承者52
2.12.1 简洁的设计:Pascal52
2.12.2 一个轻便的系统语言:C53
2.13 基于逻辑的程序设计:Prolog55
2.13.1 设计过程55
2.13.2 语言概述55
2.13.3 评价56
2.14 历史上规模最大的语言设计:Ada56
2.14.1 历史背景56
2.14.2 设计过程56
2.14.3 语言概述57
2.14.4 评价58
2.14.5 Ada 95和Ada 200558
2.15 面向对象程序设计:Smalltalk59
2.15.1 设计过程59
2.15.2 语言概述60
2.15.3 评价60
2.16 结合命令式和面向对象的特性:C++61
2.16.1 设计过程61
2.16.2 语言概述62
2.16.3 评价62
2.16.4 Swift:Objective-C的替代品62
2.16.5 另一个相关语言:Delphi63
2.17 基于命令式的面向对象语言:Java63
2.17.1 设计过程63
2.17.2 语言概述64
2.17.3 评价65
2.18 脚本语言66
2.18.1 Perl的起源与特点66
2.18.2 JavaScript的起源与特点67
2.18.3 PHP的起源与特点69
2.18.4 Python的起源与特点69
2.18.5 Ruby的起源与特点70
2.19 .NET旗帜语言:C#70
2.19.1 设计过程70
2.19.2 语言概述71
2.19.3 评价71
2.20 混合标记程序设计语言72
2.20.1 XSLT72
2.20.2 JSP73
小结74
文献注记74
复习题74
习题76
程序设计练习76
第3章 语法和语义描述77
3.1 概述77
3.2 语法描述的一般问题78
3.2.1 语言识别器78
3.2.2 语言生成器79
3.3 语法描述的形式化方法79
3.3.1 Backus-Naur范式与上下文无关文法79
3.3.2 扩展的BNF范式88
3.3.3 文法和识别器90
3.4 属性文法90
3.4.1 静态语义90
3.4.2 基本概念91
3.4.3 属性文法的定义91
3.4.4 内在属性91
3.4.5 属性文法示例91
3.4.6 计算属性值93
3.4.7 评价94
3.5 描述程序的含义:动态语义94
3.5.1 操作语义95
3.5.2 指称语义97
3.5.3 公理语义100
小结110
文献注记110
复习题110
习题111
第4章 词法和语法分析115
4.1 概述115
4.2 词法分析116
4.3 语法分析问题122
4.3.1 语法分析基础122
4.3.2 自顶向下的语法分析器123
4.3.3 自底向上的语法分析器124
4.3.4 语法分析的复杂度124
4.4 递归下降的语法分析124
4.4.1 递归下降的语法分析过程124
4.4.2 LL文法类129
4.5 自底向上的语法分析131
4.5.1 自底向上的语法分析器的语法分析问题131
4.5.2 移进-归约算法133
4.5.3 LR语法分析器133
小结137
复习题138
习题138
程序设计练习139
第5章 名字、绑定与作用域140
5.1 概述140
5.2 名字140
5.2.1 设计问题140
5.2.2 名字形式141
5.2.3 特殊单词141
5.3 变量142
5.3.1 名字142
5.3.2 地址142
5.3.3 类型143
5.3.4 值143
5.4 绑定的概念143
5.4.1 属性到变量的绑定144
5.4.2 绑定类型144
5.4.3 存储绑定和生存期147
5.5 作用域149
5.5.1 静态作用域149
5.5.2 分程序150
5.5.3 声明顺序153
5.5.4 全局作用域153
5.5.5 对静态作用域的评价156
5.5.6 动态作用域156
5.5.7 对动态作用域的评价157
5.6 作用域和生存期157
5.7 引用环境158
5.8 有名常量159
小结161
复习题161
习题162
程序设计练习165
第6章 数据类型167
6.1 概述167
6.2 基本数据类型168
6.2.1 数值类型168
6.2.2 布尔类型170
6.2.3 字符类型171
6.3 字符串类型171
6.3.1 设计问题171
6.3.2 字符串及其运算171
6.3.3 字符串长度选项173
6.3.4 评价173
6.3.5 字符串类型的实现174
6.4 枚举类型175
6.4.1 设计问题175
6.4.2 设计175
6.4.3 评价176
6.5 数组类型177
6.5.1 设计问题177
6.5.2 数组和索引178
6.5.3 下标绑定和数组的种类179
6.5.4 数组初始化180
6.5.5 数组运算181
6.5.6 矩阵数组和锯齿形数组182
6.5.7 切片182
6.5.8 评价183
6.5.9 数组类型的实现183
6.6 关联数组185
6.6.1 结构与运算185
6.6.2 关联数组的实现186
6.7 记录类型186
6.7.1 记录的定义187
6.7.2 记录中字段的引用187
6.7.3 评价188
6.7.4 记录类型的实现188
6.8 元组类型189
6.9 列表类型190
6.10 联合类型192
6.10.1 设计问题192
6.10.2 判别式与自由联合类型192
6.10.3 F#的联合类型193
6.10.4 评价193
6.10.5 联合类型的实现194
6.11 指针和引用类型194
6.11.1 设计问题194
6.11.2 指针运算194
6.11.3 指针的相关问题195
6.11.4 C和C++中的指针196
6.11.5 引用类型198
6.11.6 评价199
6.11.7 指针和引用类型的实现199
6.12 可选类型203
6.13 类型检查203
6.14 强类型204
6.15 类型等价205
6.16 理论和数据类型208
小结209
文献注记210
复习题210
习题211
程序设计练习212
第7章 表达式与赋值语句214
7.1 概述214
7.2 算术表达式214
7.2.1 运算符求值顺序215
7.2.2 运算分量求值顺序219
7.3 重载运算符221
7.4 类型转换222
7.4.1 表达式中的强制转换222
7.4.2 显式类型转换223
7.4.3 表达式错误224
7.5 关系表达式和布尔表达式224
7.5.1 关系表达式224
7.5.2 布尔表达式225
7.6 短路求值226
7.7 赋值语句227
7.7.1 简单赋值227
7.7.2 条件赋值227
7.7.3 复合赋值运算符227
7.7.4 一元赋值运算符228
7.7.5 赋值表达式229
7.7.6 多重赋值229
7.7.7 函数式程序设计语言中的赋值230
7.8 混合方式赋值230
小结231
复习题231
习题232
程序设计练习233
第8章 语句级控制结构234
8.1 概述234
8.2 选择语句235
8.2.1 二路选择语句235
8.2.2 多路选择语句238
8.3 重复语句244
8.3.1 计数控制循环245
8.3.2 逻辑控制循环248
8.3.3 用户定义的循环控制机制249
8.3.4 基于数据结构的迭代250
8.4 无条件分支253
8.5 保护命令254
8.6 结论256
小结256
复习题257
习题257
程序设计练习258
第9章 子程序260
9.1 概述260
9.2 子程序基础260
9.2.1 子程序的一般性质260
9.2.2 基本定义260
9.2.3 参数262
9.2.4 过程与函数265
9.3 子程序的设计问题265
9.4 局部引用环境266
9.4.1 局部变量266
9.4.2 嵌套子程序267
9.5 参数传递方法267
9.5.1 参数传递的语义模型268
9.5.2 参数传递的实现模型268
9.5.3 参数传递方法的实现272
9.5.4 常用语言的参数传递方法272
9.5.5 参数类型检查274
9.5.6 多维数组参数276
9.5.7 设计考量277
9.5.8 参数传递实例277
9.6 子程序作为参数280
9.7 子程序间接调用281
9.8 函数设计问题282
9.8.1 函数的副作用283
9.8.2 返回值类型283
9.8.3 返回值的个数283
9.9 重载子程序283
9.10 泛型子程序284
9.10.1 C++泛型函数285
9.10.2 Java 5.0泛型方法286
9.10.3 C# 2005泛型方法287
9.10.4 F#泛型函数288
9.11 用户定义的重载运算符288
9.12 闭包289
9.13 协同程序290
小结292
复习题293
习题294
程序设计练习295
第10章 子程序实现297
10.1 调用和返回的一般语义297
10.2 “简单”子程序的实现297
10.3 具有栈动态局部变量的子程序实现299
10.3.1 更复杂的活动记录299
10.3.2 不含递归的例子301
10.3.3 递归302
10.4 嵌套子程序304
10.4.1 基础304
10.4.2 静态链305
10.5 分程序309
10.6 动态作用域的实现310
10.6.1 深层访问310
10.6.2 浅层访问311
小结312
复习题312
习题313
程序设计练习315
第11章 抽象数据类型与封装结构316
11.1 抽象的概念316
11.2 数据抽象简介317
11.2.1 浮点型抽象数据类型317
11.2.2 用户自定义抽象数据类型317
11.2.3 示例318
11.3 抽象数据类型的设计问题319
11.4 语言示例319
11.4.1 C++中的抽象数据类型320
11.4.2 Java中的抽象数据类型325
11.4.3 C#中的抽象数据类型326
11.4.4 Ruby中的抽象数据类型327
11.5 参数化抽象数据类型330
11.5.1 C++330
11.5.2 Java 5.0331
11.5.3 C# 2005333
11.6 封装结构333
11.6.1 概述334
11.6.2 C中的封装334
11.6.3 C++中的封装334
11.6.4 C#程序集335
11.7 命名封装336
11.7.1 C++命名空间336
11.7.2 Java包337
11.7.3 Ruby模块338
小结338
复习题339
习题340
程序设计练习340
第12章 面向对象程序设计支持342
12.1 概述342
12.2 面向对象程序设计342
12.2.1 引言342
12.2.2 继承343
12.2.3 动态绑定344
12.3 面向对象语言的设计问题346
12.3.1 对象的排他性346
12.3.2 子类是否为子类型346
12.3.3 单继承与多继承347
12.3.4 对象的分配和释放347
12.3.5 动态绑定与静态绑定348
12.3.6 嵌套类348
12.3.7 对象的初始化349
12.4 支持面向对象程序设计的特定语言349
12.4.1 Smalltalk349
12.4.2 C++350
12.4.3 Java359
12.4.4 C#362
12.4.5 Ruby363
12.5 面向对象结构的实现366
12.5.1 存储示例数据366
12.5.2 方法调用与方法的动态绑定366
12.6 反射368
12.6.1 概述368
12.6.2 什么是反射368
12.6.3 Java中的反射369
12.6.4 C#中的反射371
小结372
复习题373
习题375
程序设计练习375
第13章 并发376
13.1 概述376
13.1.1 多处理器体系结构377
13.1.2 并发的分类378
13.1.3 使用并发的动机378
13.2 子程序级并发379
13.2.1 基本概念379
13.2.2 并发语言设计382
13.2.3 设计问题382
13.3 信号量382
13.3.1 概述382
13.3.2 合作同步383
13.3.3 竞争同步385
13.3.4 评价386
13.4 管程386
13.4.1 概述386
13.4.2 竞争同步386
13.4.3 合作同步386
13.4.4 评价387
13.5 消息传递387
13.5.1 概述387
13.5.2 同步消息传递的概念388
13.6 Ada并发支持388
13.6.1 基本概念388
13.6.2 合作同步391
13.6.3 竞争同步392
13.6.4 受保护对象393
13.6.5 评价394
13.7 Java线程394
13.7.1 线程类395
13.7.2 优先级397
13.7.3 信号量397
13.7.4 竞争同步397
13.7.5 合作同步398
13.7.6 非阻塞同步401
13.7.7 显式锁401
13.7.8 评价402
13.8 C#线程402
13.8.1 基本线程操作402
13.8.2 同步线程404
13.8.3 评价405
13.9 函数式语言中的并发405
13.9.1 Multi-LISP405
13.9.2 并发ML406
13.9.3 F#406
13.10 语句级并发407
13.10.1 高性能Fortran407
小结409
文献注记410
复习题410
习题411
程序设计练习412
第14章 异常处理和事件处理413
14.1 异常处理概述413
14.1.1 基本概念414
14.1.2 设计问题415
14.2 C++异常处理417
14.2.1 异常处理程序417
14.2.2 异常绑定到处理程序418
14.2.3 延续418
14.2.4 其他设计选择418
14.2.5 示例419
14.2.6 评价420
14.3 Java异常处理420
14.3.1 异常类别421
14.3.2 异常处理程序421
14.3.3 异常绑定到处理程序421
14.3.4 其他设计选择422
14.3.5 示例423
14.3.6 finally子句424
14.3.7 断言425
14.3.8 评价425
14.4 Python和Ruby的异常处理426
14.4.1 Python426
14.4.2 Ruby427
14.5 事件处理概述428
14.6 Java事件处理428
14.6.1 Java Swing GUI组件428
14.6.2 Java事件模型429
14.7 C#事件处理432
小结434
文献注记435
复习题435
习题436
程序设计练习437
第15章 函数式程序设计语言438
15.1 概述438
15.2 数学函数439
15.2.1 简单函数439
15.2.2 函数形式440
15.3 函数式程序设计语言基础441
15.4 第一个函数式程序设计语言:LISP442
15.4.1 数据类型和结构442
15.4.2 第一个LISP解释器442
15.5 Scheme概述444
15.5.1 Scheme的起源444
15.5.2 Scheme解释器444
15.5.3 基本数值函数445
15.5.4 函数定义445
15.5.5 输出函数447
15.5.6 数字谓词函数447
15.5.7 控制流448
15.5.8 列表函数448
15.5.9 符号原子和列表的谓词函数451
15.5.10 Scheme函数示例452
15.5.11 LET454
15.5.12 Scheme语言中的尾递归455
15.5.13 函数形式456
15.5.14 代码编写函数457
15.6 Common LISP458
15.7 ML459
15.8 Haskell463
15.9 F#466
15.10 主要命令式语言对函数式程序设计的支持469
15.11 函数式语言和命令式语言的比较470
小结472
文献注记473
复习题473
习题474
程序设计练习475
第16章 逻辑程序设计语言477
16.1 概述477
16.2 谓词演算简介477
16.2.1 命题478
16.2.2 子句形式479
16.3 谓词演算和定理证明480
16.4 逻辑程序设计概要481
16.5 Prolog起源482
16.6 Prolog基本元素483
16.6.1 项483
16.6.2 事实陈述483
16.6.3 规则语句484
16.6.4 目标语句485
16.6.5 Prolog的推理过程485
16.6.6 简单的计算487
16.6.7 列表结构489
16.7 Prolog的缺点493
16.7.1 解析顺序控制493
16.7.2 封闭世界假设495
16.7.3 否定的问题495
16.7.4 内在的局限性497
16.8 逻辑程序设计应用497
16.8.1 关系数据库管理系统497
16.8.2 专家系统498
16.8.3 自然语言处理498
小结498
文献注记499
复习题499
习题500
程序设计练习500
参考文献501
索引510

教学资源推荐
作者: Bruce Eckel, Chuck Allison
作者: 顾元刚 等
作者: 许畅 陈嘉 朱晓瑞 编著
作者: Jie Wu
参考读物推荐
作者: (美)John Mongan,Noan Suojanen
作者: 刘冰 等编著