《程序设计语言原理(原书第12版)》是由机械工业出版社出版的一本关于程序设计方面的书籍,作者是罗伯特,主要介绍了关于程序设计、语言原理方面的知识内容,目前在程序设计类书籍综合评分为:8.7分。
书籍介绍
内容简介
本书从为什么学习程序设计语言、常用程序设计语言的演化史、评估程序设计语言结构的标准,以及这些语言基本的实现方法开始讲起,通过不局限于特定语言种类地分析语言结构的设计问题,检测设计选择,以及比较设计可选方案来讲述程序设计语言基本原理。
作者简介
罗伯特·W.塞巴斯塔(RobertW.Sebesta)科罗拉多大学斯普林斯分校计算机科学系荣休副教授,拥有40多年计算机科学课程教学经验,研究兴趣包括程序设计语言的设计和评估以及Web程序设计。
目录
- 译者序
- 第12版的变化
- 前言
- 致谢
- 第1章预备知识1
- 1.1掌握程序设计语言概念的必要性1
- 1.2程序设计领域3
- 1.2.1科学计算应用3
- 1.2.2商业应用3
- 1.2.3人工智能4
- 1.2.4Web软件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.1Zuse研制的Plankalkül语言23
- 2.1.1历史背景23
- 2.1.2语言概述25
- 2.2伪代码25
- 2.2.1短码26
- 2.2.2快码26
- 2.2.3UNIVAC编译系统27
- 2.2.4相关工作27
- 2.3IBM704和Fortran27
- 2.3.1历史背景27
- 2.3.2设计过程28
- 2.3.3FortranI概述28
- 2.3.4FortranII29
- 2.3.5FortranIV、77、90、95、2003和200829
- 2.3.6评价30
- 2.4函数式程序设计语言:LISP31
- 2.4.1人工智能的开端和列表处理31
- 2.4.2LISP的设计过程32
- 2.4.3语言概述32
- 2.4.4评价33
- 2.4.5LISP的两种后继语言34
- 2.4.6相关语言34
- 2.5迈向成熟的步:ALGOL6035
- 2.5.1历史背景35
- 2.5.2早期设计过程35
- 2.5.3ALGOL58概述36
- 2.5.4ALGOL58报告的接受度37
- 2.5.5ALGOL60的设计过程37
- 2.5.6ALGOL60概述37
- 2.5.7评价38
- 2.6商业处理语言:COBOL39
- 2.6.1历史背景39
- 2.6.2FLOW-MATIC40
- 2.6.3COBOL的设计过程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.1APL的起源及特征49
- 2.9.2SNOBOL的起源和特征50
- 2.10数据抽象的开端:SIMULA6750
- 2.10.1设计过程50
- 2.10.2语言概述50
- 2.11正交设计:ALGOL6850
- 2.11.1设计过程51
- 2.11.2语言概述51
- 2.11.3评价51
- 2.12ALGOL系列语言的早期继承者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.5Ada95和Ada200558
- 2.15面向对象程序设计:Smalltalk59
- 2.15.1设计过程59
- 2.15.2语言概述60
- 2.15.3评价60
- 2.16结合命令式和面向对象的特性:C61
- 2.16.1设计过程61
- 2.16.2语言概述62
- 2.16.3评价62
- 2.16.4Swift: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.1Perl的起源与特点66
- 2.18.2JavaScript的起源与特点67
- 2.18.3PHP的起源与特点69
- 2.18.4Python的起源与特点69
- 2.18.5Ruby的起源与特点70
- 2.19.NET旗帜语言:C#70
- 2.19.1设计过程70
- 2.19.2语言概述71
- 2.19.3评价71
- 2.20混合标记程序设计语言72
- 2.20.1XSLT72
- 2.20.2JSP73
- 小结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.1Backus-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.2LL文法类129
- 4.5自底向上的语法分析131
- 4.5.1自底向上的语法分析器的语法分析问题131
- 4.5.2移进-归约算法133
- 4.5.3LR语法分析器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.3F#的联合类型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.4C和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.1C泛型函数285
- 9.10.2Java5.0泛型方法286
- 9.10.3C#2005泛型方法287
- 9.10.4F#泛型函数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.1C中的抽象数据类型320
- 11.4.2Java中的抽象数据类型325
- 11.4.3C#中的抽象数据类型326
- 11.4.4Ruby中的抽象数据类型327
- 11.5参数化抽象数据类型330
- 11.5.1C330
- 11.5.2Java5.0331
- 11.5.3C#2005333
- 11.6封装结构333
- 11.6.1概述334
- 11.6.2C中的封装334
- 11.6.3C中的封装334
- 11.6.4C#程序集335
- 11.7命名封装336
- 11.7.1C命名空间336
- 11.7.2Java包337
- 11.7.3Ruby模块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.1Smalltalk349
- 12.4.2C350
- 12.4.3Java359
- 12.4.4C#362
- 12.4.5Ruby363
- 12.5面向对象结构的实现366
- 12.5.1存储示例数据366
- 12.5.2方法调用与方法的动态绑定366
- 12.6反射368
- 12.6.1概述368
- 12.6.2什么是反射368
- 12.6.3Java中的反射369
- 12.6.4C#中的反射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.6Ada并发支持388
- 13.6.1基本概念388
- 13.6.2合作同步391
- 13.6.3竞争同步392
- 13.6.4受保护对象393
- 13.6.5评价394
- 13.7Java线程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.8C#线程402
- 13.8.1基本线程操作402
- 13.8.2同步线程404
- 13.8.3评价405
- 13.9函数式语言中的并发405
- 13.9.1Multi-LISP405
- 13.9.2并发ML406
- 13.9.3F#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.2C异常处理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.3Java异常处理420
- 14.3.1异常类别421
- 14.3.2异常处理程序421
- 14.3.3异常绑定到处理程序421
- 14.3.4其他设计选择422
- 14.3.5示例423
- 14.3.6finally子句424
- 14.3.7断言425
- 14.3.8评价425
- 14.4Python和Ruby的异常处理426
- 14.4.1Python426
- 14.4.2Ruby427
- 14.5事件处理概述428