程序设计语言原理(原书第7版)
作者 : Robert W. Sebesta
译者 : 张 勤 王方矩
丛书名 : 计算机科学丛书
出版日期 : 2007-06-01
ISBN : 7-111-20853-2
定价 : 65.00元
教辅资源下载
扩展信息
语种 : 简体中文
页数 : 496
开本 : 16开
原书名 : Concepts of Programming Languages, Seventh Edition
原出版社: Addison-Wesley
属性分类: 教材
包含CD :
绝版 :
图书简介

本书的主旨是为读者提供对现有的和将来的程序设计语言进行客观评估所需的工具,增强读者学习新语言的能力并加深对语言实现的重要性的理解。本书第7版从为什么学习程序设计语言、常用的程序设计语言的演化史、评估程序设计语言结构的标准,以及这些语言基本的实现方法开始讲起,通过比较各种程序设计语言的特点、分析各种语言结构的设计问题,来讲述程序设计语言的基本概念。本书并非讲授如何使用一种语言,而是讨论语言的结构与特征及其在各种情景中的不同设计与实现,以及如何根据给定的任务选择合适的语言。

本书特点及新增内容:
  ● 通过C#、Java、JavaScript、Perl和PHP来讨论各种语言结构以及设计选择方案。
  ● 将面向对象程序设计与非面向对象的命令式语言结合起来讨论。
  ● 新增使用公理化语义进行编程证明的内容。
  ● 新增有关标记/程序设计混合式语言的内容,讨论了XSLT、JSP。
  ● 收录了James Gosling、Larry Wall、Alan Cooper、Bjarne Strostrup等人的访谈。
  ● 以Prolog语言为例,剖析了逻辑程序设计语言。
  ● 提供产生现有语言的特定设计选择的历史背景。
  ● 讨论了包括Scheme和ML在内的函数式程序设计语言。

图书特色

图书前言

第7版的变化
  本书的目的、总体结构以及写作方式与前面的6个版本保持了一致。其主要目的是介绍当代程序设计语言的主要结构,并为读者提供对已有的程序设计语言和未来的程序设计语言进行客观评估所必需的工具;还有一个目的是通过提供对程序设计语言的深入讨论,以及通过表述一种描述语法的形式化方法,为读者学习编译器的设计做准备。
  本书第7版采用一些较新语言的素材取代了较老的程序设计语言内容,从而保持内容上的新颖。例如,第1章与第2章中都增加了以XSLT和JSP为例讨论标记与程序设计混合式语言的内容,还增加了使用公理语义进行程序验证的内容,并包括了一种新的验证方式。第4章通过增加一个新的语法分析程序和包括一套使用递归下降算法的完整语法分析,增强了关于递归下降语法分析的内容。本书多处加入了介绍Java 5.0语言版本中最有趣特征的材料,包括该语言版本中新的迭代语句、枚举类以及它的通用性。最后,为了增强本书表述的清晰程度,书中的大部分章节都进行了细微的修正。
  全书概貌
  本书通过讨论各种语言结构的设计问题,讨论最常用语言中这些结构的设计选择,并客观比较各种设计选择,来描述程序设计语言的基本概念。
  要对程序设计语言进行认真研究,需要讨论以下相关课题,其中包括描述程序设计语言的语法和语义的形式方法,该课题被概括进本书的第3章。本书还考虑了各种语言结构的实现技术,第4章讨论词法分析和语法分析,第10章讨论子程序链接的实现。其他一些语言结构的实现问题,也在本书的各个不同部分进行讨论。
  下面简略说明第7版包括的内容。
  章节概述
  第1章从学习程序设计语言的目的开始,讨论用于评估程序设计语言及语言结构的标准,以及影响语言设计的主要因素,设计中常用到的权衡方法及其基本的实现。
  第2章概述书中讨论的大部分重要语言的演化过程。虽然没有完整地描述某一种语言,但对于每一种语言的起源、发展和它的贡献都进行了分析。这种历史回顾十分有价值:它为人们理解当代语言设计的实践和理论基础提供了必要的背景,也为进一步学习语言的设计以及评估提供了动力。除此之外,因为书中的其他章节都不依赖第2章,因而可以将这一章作为完全独立的部分来阅读。
  第3章讨论描述程序设计语言语法的主要形式方法,即巴科斯-诺尔范式(BNF)。接着是关于属性文法的描述,该文法描述了语言的静态语义及语法。然后讲解语义描述这一有难度的主题,这里包括对三种最常用语义描述方法的简略介绍,即操作语义、公理语义和指称语义。
  第4章介绍词法分析和语法分析。这一章是为那些没有设置编译器设计课程的学校准备的。与第2章相似,这一章也是独立的,可以不依赖书中的其他章节独立学习。
  第5章到第14章详细地描述命令式语言主要结构的设计问题。对其中每一种结构,作者列举和评估了几种范例语言的设计选择。具体讲,第5章包括变量的多种特性,第6章包括数据类型;而第7章则解释表达式及赋值语句,第8章描述控制语句,第9章和第10章讨论子程序及其实现问题,第11章研究数据抽象的机制,第12章提供了关于支持面向对象程序设计语言特征(继承和动态方法绑定)的深入讨论,第13章讨论并发程序单元,第14章介绍异常处理以及事件处理。
  最后两章(第15章和第16章)描述两种最重要的、不同的程序设计范型:函数式程序设计及逻辑程序设计。第15章介绍Scheme语言,包括它的一些基本功能、特殊形式、函数形式,并给出用Scheme语言编写的简单函数示例。接下来,简略地介绍 COMMON LISP、ML和 Haskell语言,以说明不同形式的函数式语言。第16章介绍逻辑程序设计以及逻辑程序设计语言:Prolog。
  写给教师
  在位于科罗拉多州斯普林的科罗拉多大学的初级程序设计语言课堂上,我们是这样来使用本书的:我们通常会详细地讲授第1章与第3章。由于第2章没有很难的技术内容,我们只花费很少的课时来讲解,而且如我们在前面提到的,后面所有章节的内容都不依赖于第2章,所以这一章的内容完全可以自学完成。此外,我们单独设置编译器设计课程,所以第4章也不在本课程里讲授。
  对于具有丰富的C++、Java和C#语言程序设计经验的学生,第5章到第9章是相对容易的。第10章到第14章则有些挑战性,因而需要进行比较详细地讲授。
  对大多数的低年级学生而言,第15章和第16章是全新的。理想情况下,应该对那些学习这两章内容的学生提供 Scheme 和 Prolog的语言处理器。书中提供了充足的资料,指导学生写出简单的程序。
  本科生的课程中可以不讲解最后两章的全部内容,但在研究生的课程中则可以讨论这两章的所有内容,此时可以跳过前面几章关于命令式语言的内容。
  教辅资料
  本书的所有读者都可以从网址www.aw.com/cssupport得到下列的教辅资料:
  ·一套教学幻灯片,片中把每一章都作为一个独立文件。
  ·这里也提供书中所有图片的PowerPoint幻灯片,使读者可以自己动手制作教学课件。
  ·为了便于增强课堂教学的效果、配合课程中动手实验、帮助远程教学中学习的学生,我们在网站www.aw.com/sebesta放置了以下资源与大家共享:
  ·提供几种语言的小型学习手册(大约100页的辅导材料)。我们希望借助这套手册,给予学生足够的信息来完成书中章节里有关各种语言的练习,使学生们知道如何在其他的语言中编写程序。在作者提供的相关网站上包括C++、C、Java以及Smalltalk 语言的手册。
  ·实行自我评分。借助于Addison-Wesley软件引擎,学生们可以通过完成多项选择以及填空练习来检测自己对于学完章节的理解程度。
  在此声明练习题的答案只提供给教师。请采用本书作为教材的教师按书后的教学支持说明表中提供的联系方式联络Pearson公司北京办事处索取相关教辅资料。
  可用的语言处理器
  书中讨论的一些程序设计语言的处理器,以及一些关于程序设计语言的信息,能够通过下列网址获得:
  C# microsoft.com
  Java java.sun.com
  Haskell haskell.org
  Scheme www.cs.rice.edu/CS/PLT/packages/drscheme/
  Perl www.perl.com
  网站上提供了JavaScript脚本语言、PHP供读者参考。
  致谢
  许多学校为此书的再版提供了宝贵的支持,在此向这些学校表示感谢:
  * Liang Cheng,利哈尔大学
  * Amer Diwan,科罗拉多大学
  * Nigel Gwee,路易斯安那州立大学
  * John V. Harrison,拉斯维加斯内华达大学
  * Leon Jololian,新泽西城市大学
  * K.N. King,佐治亚州立大学
  * Donald Kraft,路易斯安那州立大学
  * Simon H. Lin,加利福尼亚州立大学Northridge分校
  * Meilu Lu,加利福尼亚州立大学萨克拉门托分校
  * Amar Raheja,加利福尼亚科技大学
  * Hossein Saiedian,堪萨斯大学
  * Raghvinder Sangwan,佩恩州立大学
  * Young Park,布雷德利大学
  * Steve J. Phelps,加利福尼亚州立大学富勒顿分校
  * Yang Wang,西南密苏里州立大学
  * Franck Xia,罗拉密苏里大学
  * Salih Yurttas,得克萨斯州 A & M大学
  还有许多其他人也对本书前几个版本提出过宝贵意见,我也向他们致以深深的谢意:Vicki Allan、Henry Bauer、Carter Bays、Manuel E. Bermudez、Peter Brouwer、Margaret Burnett、Paosheng Chang、John Crenshaw、Charles Dana、Barbara Ann Griem、Mary Lou Haag、Eileen Head、Ralph C. Hilzer、Eric Joanis、Hikyoo Koh、Donald Kraft、Jiang B. Liu、Meiliu Lu、Jon Mauney、Bruce R. Maxim、Robert McCoard、Dennis L Mumaugh、Michael G. Murphy、Andrew Oldroyd、Rebecca Parsons、Jeffery Popyack、Steven Rapkin、Hamilton Richard、Tom Sager、Joseph Schell、Sibylle Schupp、Mary Louise Soffa、Neelam Soundarajan、Ryan Stansifer、Steve Stevenson、Virginia Teller、Yang Wang、John M. Weiss和Salih Yurttas。
  编辑Matt Goldstein, 项目编辑Katherine Harutunian和Addison-Wesley出版社的生产主管Pat Mahtani以及在Argosy的Daniel Rausch和Edalin Michael,我也感谢他们对本书出版所做的努力。
  最后,我要感谢我的孩子Jake和Darcie,因为写作本书的第7版本占用了我大量时间,因此冷落了他们,他们对此毫无怨言并一直支持我。
  Robert W. Sebesta

作者简介

Robert W. Sebesta:Robert W. Sebesta : 科罗拉多大学科罗拉多斯普林斯分校计算机科学系的副教授和系主任。Sebesta教授在科罗拉多大学博尔德分校获得应用数学学士学位,在宾夕法尼亚州立大学获得计算机科学硕士和博士学位。他有三十多年的教授计算机科学的经验。他的专业兴趣是设计和评估程序设计语言、编译器设计以及软件测试方法和工具。他是ACM和IEEE计算机学会的成员。

译者简介

张 勤 王方矩:暂无简介

译者序

本书是一本在美国、加拿大得到广泛使用的大学教材,适用于计算机科学或计算机工程专业本科二、三年级开设的程序设计语言课程。本书已升级至第7版,多次再版的事实足以说明其受欢迎的程度。一本书的市场价值往往能够反映出它在技术上的价值,本书就是如此。
  计算机科学的各个方面都离不开程序设计语言。计算机工作者一生中必然会接触好几种语言:当一种新的语言问世并被广泛接受时,你需要学习这种语言以更新技能;当接手一个新项目时,你必须为这个项目选择一种最合适的实现语言;甚至你可能会为它专门设计并实现一种新的语言。本书并不教授如何使用一种语言,而是讨论程序设计语言的结构与特性、这些结构与特性在不同语言中的设计与实现以及这些结构与特性带给语言的优点与缺点。掌握了这些知识,会让读者在学习新的语言时有一种“似曾相识”的感觉,并很快掌握该语言中的许多特性。当读者需要选择一种语言时,可以根据各种语言的适用性及它们的优缺点做到知“语”善用;当其需要构造一种新语言时,也会知道应该从何处着手来选择出最优的设计实现方案。另外,本书所提供的关于语言“内部”结构的设计与实现的知识,正是大多数介绍语言使用方法的书籍所欠缺的。这种知识能够让读者将一种语言的优点充分地发挥出来,并且避免该语言本身的缺点可能带来的种种问题。
  本书的主要内容可分为四部分。第一部分包括第1章和第2章,第二部分包括第3章和第4章,第三部分从第5章到第14章,第四部分包括第15章和第16章。
  在第一部分中,第1章介绍一些预备性的基础知识。第2章是对程序设计语言的历史进行有趣而引人入胜的回顾,这一章介绍了一种在第二次世界大战期间由德国开发的功能十分齐全、但鲜为人知的语言—Plankalk焞语言,还介绍了Fortran语言的巨大成功及其深远的影响,还包括ALGOL、COBOL、Pascal、Ada、C、C++、Java、C#等语言,所有重要的语言几乎都涉及了,本章为程序设计语言描绘了一个完整的家谱,在这里,各种语言的来龙去脉变成了一幅清晰的画卷。
  在第二部分中,第3章是关于语法和语义的描述,语法和语义是语言中的两大要素,这一章讨论对程序设计语言的语法和语义进行形式描述的方法。第4章简明地介绍了程序设计语言的编译原理,这一章是专门为不开设编译技术课程的学校而编写的。然而实际上,即使你打算去啃一本编译技术的大部头书,或者是准备学习一门编译课程,这一章也很值得读一读。它会让你事先获得编译技术的概貌,而不至于一头扎入大量的技术细节当中,导致“不识庐山真面目”。
  第三部分集中了本书精华的部分。这一部分详细地剖析语言的各个组成部分设计的实现。程序设计语言的主要组成部分包括变量、类型、表达式、赋值语句、控制结构、子程序、并发、异常处理等。对于语言的每一个组成部分,本书首先是讨论其必要性,接着分析设计中必须解决的问题,然后列出了各种不同的解决方法,并评价了各种方法的优缺点,讨论了一些重要语言中具体的设计实现。在读完这一部分之后,一门语言将不再是一个黑盒子,而像是在硬件高手面前打开了盖子的一台计算机。各个部分的特征、优劣以及对整体性能的影响都变得清清楚楚,这些与语言有关的知识对于编写可靠高效的程序将是极有帮助的。例如,如果一位程序员了解他所使用的语言中调用子程序的代价,他就能根据对程序速度和程序模块化的特定要求来决定是否使用递归子程序。同样,如果一位程序员熟悉他所使用的语言中的变量引用环境,他的程序中由于变量引用错误而产生的“疑难病症”就会少得多。有时,这些知识还能帮助你判断出编译器内部的错误,使你从盲目地挑剔那些无辜程序的思维中解放出来。
  第四部分介绍两种“另类”的语言:以LISP为代表的函数式语言以及逻辑程序设计语言Prolog语言,它们都是人工智能语言,而此前所讨论的语言都属于命令式语言。命令式语言的程序向机器发出一条条可执行的命令语句。然而,在函数式和逻辑程序设计语言中,程序设计却遵循一种完全不同的思维方式,连算法设计都大相径庭。在这些语言里,没有我们熟悉的、必不可少的赋值语句、循环语句等。使用这些语言时,程序设计不再能够先画框图,然后将每一个框图翻译成一条或几条命令语句。函数式程序设计通过函数调用来解决问题,逻辑程序设计则是通过逻辑推理来解决问题。在这两章中,作者举了几个很好的例子,让你很容易转换思维,接受这两种不同的方式;另外还给出了十分巧妙的算法来解决传统的问题,它们会帮助你拓宽解决问题的思路。也许在下一个项目中,这两种程序设计的知识能够使你在解决问题时另辟蹊径,获取出人意料的成功。
  本书还收录了与一批著名的计算机科学家进行的有趣而生动的访谈,其中还有C++、Java、PHP、Perl等语言的作者,他们在程序设计语言上的卓越贡献对计算机事业的发展产生了巨大的影响。从这些访谈之中,我们可以了解到这些科学家们丰富的成长经历、独特的思维方式、对问题的深刻见解,以及他们对未来的科学展望。与这些科学家们进行的这些访谈,向读者们打开了另一扇奇妙的窗子,其形式生动活泼、妙趣横生;希望这些内容能够激励读者,尤其是年轻的读者,走上一条成功的道路。
  这是一本适用面很广的书,既可用作大学程序设计语言课程的教材,也可用作自学语言的读物,毕业多年的经验丰富的计算机工作者也可以读一读来更新知识。

  译  者
  2007年1月

图书目录

出版者的话
专家指导委员会
译者序
前言
第1章  基本概念 1
1.1  学习程序设计语言原理的缘由 1
1.2  程序设计应用领域 3
1.3  语言评估标准 4
1.4  影响语言设计的因素 13
1.5  语言分类 15
1.6  语言设计中的权衡 16
1.7  实现方法 16
1.8  程序设计环境 21
小结*复习题*练习题 21
第2章  主要程序设计语言的发展 24
2.1  Zuse的Plankalk焞语言 24
2.2  最小硬件的程序设计:伪代码 26
2.3  IBM 704计算机与Fortran 28
2.4  函数式程序设计:LISP语言 32
2.5  迈向成熟的第一步:ALGOL 60 36
2.6  商务记录计算机化:COBOL 41
2.7  分时操作的开始:BASIC 44
2.8  用途广泛的语言:PL/I 48
2.9  两种早期的动态语言:APL和SNOBOL 51
2.10  数据抽象的开始:SIMULA 67 52
2.11  正交性语言的设计:ALGOL 68 52
2.12  早期ALGOL 系列语言的后代产品 54
2.13  基于逻辑的程序设计:Prolog 59
2.14  历史上规模最大的语言设计:Ada 60
2.15  面向对象的程序设计:Smalltalk 64
2.16  结合命令式与面向对象的特性:C++ 66
2.17  一种基于命令式的面向对象语言:Java 69
2.18  脚本语言:JavaScript、PHP及Python 71
2.19  一种基于C的新世纪语言:C# 74
2.20  标志与程序设计混合式语言 76
小结*文献注释*复习题*练习题 78
第3章  描述语法和语义 81
3.1  概述 81
3.2  描述语法的普遍问题 81
3.3  描述语法的形式方法 83
3.4  属性文法 92
3.5  描述程序的意义:动态语义 96
小结*文献注释*复习题*练习题 110
第4章  词法分析和语法分析 114
4.1  概述 114
4.2  词法分析 115
4.3  语法分析问题 118
4.4  递归下降语法分析 120
4.5  自底向上语法分析 125
小结*复习题*练习题*程序设计练习题 131
第5章  名字、绑定、类型检测和
作用域 134
5.1  概述 134
5.2  名字 134
5.3  变量 136
5.4  绑定概念 138
5.5  类型检测 145
5.6  强类型化 145
5.7  类型兼容 147
5.8  作用域 149
5.9  作用域与生存期 154
5.10  引用环境 155
5.11  命名常量 156
小结*复习题*练习题*程序设计练习题 158
第6章  数据类型 164
6.1  概述 164
6.2  基本数据类型 165
6.3  字符串类型 167
6.4  用户定义的序数类型 170
6.5  数组类型 173
6.6  关联数组 182
6.7  记录类型 185
6.8  联合类型 188
6.9  指针类型与引用类型 191
小结*文献注释*复习题*练习题*程序
设计练习题 200
第7章  表达式与赋值语句 204
7.1  概述 204
7.2  算术表达式 204
7.3  重载操作符 210
7.4  类型转换 212
7.5  关系表达式和布尔表达式 214
7.6  短路求值 215
7.7  赋值语句 217
7.8  混合模式赋值 219
小结*复习题*练习题*程序设计练习题 220
第8章  语句层次的控制结构 223
8.1  概述 223
8.2  选择语句 224
8.3  循环语句 230
8.4  无条件分支 240
8.5  守卫的命令 241
8.6  结论 243
小结*复习题*练习题*程序设计练习题 244
第9章  子程序 247
9.1  概述 247
9.2  子程序的基本原理 247
9.3  子程序的设计问题 251
9.4  局部引用环境 252
9.5  参数传递方法 253
9.6  子程序名作为参数 267
9.7  重载子程序 269
9.8  通用子程序 269
9.9  函数的设计问题 274
9.10  用户定义的重载操作符 275
9.11  协同程序 275
小结*复习题*练习题*程序设计练习题 277
第10章  实现子程序 281
10.1  调用与返回的一般语义 281
10.2  实现“简单”子程序 281
10.3  实现具有栈动态局部变量的子
程序 283
10.4  嵌套子程序 287
10.5  块 293
10.6  实现动态作用域 294
小结*复习题*练习题 296
第11章  抽象数据类型和封装结构 300
11.1  抽象概念 300
11.2  数据抽象介绍 300
11.3  抽象数据类型的设计问题 302
11.4  语言示例 305
11.5  有参数的抽象数据类型 313
11.6  封装结构 315
11.7  命名封装 317
小结*复习题*练习题*程序设计练习题 320
第12章  支持面向对象的程序设计 323
12.1  概述 323
12.2  面向对象程序设计 323
12.3  面向对象语言的设计问题 325
12.4  Smalltalk对面向对象程序设计的支持 328
12.5  C++对面向对象程序设计的支持 330
12.6  Java对面向对象程序设计的支持 338
12.7  C#对面向对象程序设计的支持 340
12.8  Ada 95对面向对象程序设计的支持 341
12.9  JavaScript的对象模型 344
12.10  面向对象结构的实现 346
小结*复习题*练习题*程序设计练习题 349
第13章  并发 352
13.1  概述 352
13.2  子程序层次并发的介绍 354
13.3  信号量 357
13.4  管理 360
13.5  消息传递 362
13.6  Ada对并发的支持 362
13.7  Java线 371
13.8  C#线 376
13.9  语句层次的并发 378
小结*文献注释*复习题*练习题*程序
设计练习题 379
第14章  异常处理 383
14.1  异常处理介绍 383
14.2  Ada中的异常处理 387
14.3  C++中的异常处理 392
14.4  Java中的异常处理 395
14.5  Java的事件处理 402
14.6  Java的事件处理 403
小结*文献注释*复习题*练习题 407
第15章  函数式程序设计语言 411
15.1  概述 411
15.2  数学函数 412
15.3  函数式程序设计语言的基础 413
15.4  第一种函数式程序设计语言:
LISP 414
15.5  Scheme概述 416
15.6  COMMON LISP 428
15.7  ML 429
15.8  Haskell 431
15.9  函数式语言的应用 434
15.10  函数式语言和命令式语言的
比较 434
小结*文献注释*复习题*练习题*程序
设计练习题 435
第16章  逻辑程序设计语言 438
16.1  概述 438
16.2  谓词演算的简短介绍 438
16.3  谓词演算与定理证明 441
16.4  逻辑程序设计概述 442
16.5  Prolog的起源 443
16.6  Prolog的基本元素 444
16.7  Prolog的缺陷 454
16.8  逻辑程序设计的应用 458
小结*文献注释*复习题*练习题*程序设
计练习题 460
参考文献 462
索引 471

教学资源推荐
作者: [美]戴维 I. 施奈德(David I. Schneider) 著
作者: (美)H.M.Deitel
作者: (美)Robert W.Sebesta
参考读物推荐