目 录 1
出版者的话 1
专家指导委员会 1
译者序 1
前言 1
第1章基本概念 1
1.1学习程序设计语言原理的缘由 2
1.2程序设计领域 3
1.2.1科学应用 4
1.2.2商务应用 4
1.2.3人工智能 4
1.2.4系统程序设计 4
1.2.5脚本语言 5
1.2.6专用语言 5
1.3语言评估标准 5
1.3.1可读性 6
1.3.2可写性 10
1.3.3可靠性 11
1.3.4代价 12
1.4影响语言设计的因素 13
1.4.1计算机体系结构 13
1.4.2程序设计方法学 14
1.5语言分类 15
1.6语言设计中的权衡 15
1.7实现方法 16
1.7.1编译方法 17
1.7.2单纯解释 19
1.7.3混合实现系统 20
1.8程序设计环境 20
本章小结 21
复习题 21
练习题 22
第2章主要程序设计语言的发展 23
2.1.2语言概述 25
2.1.1历史背景 25
2.1 Zuse的Plankalkül语言 25
2.2最小硬件的程序设计:伪代码 26
2.2.1短代码 26
2.2.2快速编码 27
2.2.3 UNIVAC“编译”系统 27
2.2.4相关的工作 27
2.3 IBM704计算机和FORTRAN语言 27
2.3.1历史背景 27
2.3.3 FORTRAN Ⅰ概况 28
2.3.2设计过程 28
2.3.4 FORTRAN Ⅱ概况 29
2.3.5 FORTRAN Ⅳ、FORTRAN 77和FORTRAN 90 29
2.3.6评估 30
2.4函数式程序设计:LISP语言 31
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相关的语言 35
2.5迈向成熟的第一步:ALGOL 60 35
2.5.1历史背景 35
2.5.2早期设计过程 36
2.5.3 ALGOL58概况 36
2.5.4 ALGOL58报告的接受 36
2.5.6 ALGOL 60语言概述 37
2.5.5 ALGOL60的设计过程 37
2.5.7 ALGOL60的评估 38
2.6商务记录的计算机化:COBOL 39
2.6.1历史背景 39
2.6.2 FLOW-MATIC语言 39
2.6.3 COBOL的设计过程 40
2.6.4评估 40
2.7分时操作的开始:BASIC 42
2.7.3评估 43
2.7.2语言概述 43
2.7.1设计过程 43
2.8用途广泛的语言:PL/I 44
2.8.1历史背景 44
2.8.2设计过程 45
2.8.3语言概述 45
2.8.4评估 46
2.9.1APL的起源与特征 47
2.9.2 SNOBOL的起源与特征 47
2.9两种早期的动态语言:APL和SNOBOL 47
2.10数据抽象的开始:SIMULA 67 48
2.10.1设计过程 48
2.10.2语言概述 48
2.1 1正交性语言的设计:ALGOL68 48
2.1 1.1设计过程 49
2.11.2语言概述 49
2.11.3评估 49
2.12.1为简单性而设计的语言:Pasca1 50
2.12 ALGOL系列语言的重要后代语言 50
2.12.2可移植的系统语言:C 51
2.12.3 ALGOL的其他后代语言 53
2.13基于逻辑的程序设计:Prolog 54
2.13.1设计过程 54
2.13.2语言概述 54
2.13.3评估 55
2.14历史上最大规模的语言设计:Ada 55
2.14.1历史背景 55
2.14.2设计过程 55
2.14.3语言概述 57
2.14.4评估 57
2.14.5 Ada 95 58
2.15面向对象的程序设计:Smalltalk 59
2.15.1设计过程 59
2.15.2语言概述 60
2.15.3评估 60
2.16.1设计过程 61
2.1 6结合命令式与面向对象的特性:C++ 61
2.16.2语言概述 62
2.16.3评估 62
2.16.4一种相关语言:Eiffel 62
2.17万维网程序设计:Java 63
2.17.1设计过程 63
2.17.2语言概述 63
2 17.3评估 64
本章小结 65
文献注释 65
复习题 66
练习题 67
第3章描述语法和语义 69
3.3.3语法图 69
3.2描述语法的普遍问题 70
3.3.1巴科斯-诺尔范式与上下文无关文法 71
3.3描述语法的形式方法 71
3.2.1语言识别器 71
3.2.2语言生成器 71
3.3.2扩展的BNF 79
3.1介绍 79
3.3.4文法与识别器 80
3.4属性文法 80
3.4.1静态语义 81
3.4.2基本概念 81
34.3属性文法定义 81
3.4.5属性文法的例子 82
3.4.4内在属性 82
3.4.6计算属性值 83
3.4.7评估 83
3.5描述程序的意义:动态语义 84
3.5.1操作语义 84
3.5.2公理语义 86
3.5.3指称语义 93
本章小结 96
复习题 97
练习题 97
文献注释 97
第4章词法分析和语法分析 101
4.1介绍 102
4.2词法分析 102
4.3语法分析问题 105
4.3.1语法分析介绍 105
4.3.3自底向上语法分析器 106
4.3.4语法分析的复杂性 106
4.3.2自顶向下语法分析器 106
4.4递归下降语法分析 107
4.4.1递归下降语法分析过程 107
4.4.2 LL文法类 109
4.5自底向上语法分析 110
4.5.1自底向上语法分析器的语法分析问题 110
4.5.2移进-归约算法 112
4.5.3 LR语法分析器 112
本章小结 115
复习题 116
练习题 117
第5章名字、绑定、类型检测和作用域 119
5.1介绍 120
5.2名字 120
5.2.1设计问题 120
5.2.2名字形式 120
5.2.3特殊字 121
5.3.2地址 122
5.3.1名字 122
5.3变量 122
5.3.3类型 123
5.3.4值 123
5.4绑定概念 123
5.4.1属性-变量绑定 124
5.4.2类型绑定 124
5.4.3存储绑定与生存期 126
5.5类型检测 128
5.6强类型化 129
5.7类型兼容性 130
5.8作用域 132
5.8.1静态作用域 132
5.8.2块 134
5.8.3静态作用域的评估 134
5.8.4动态作用域 136
5.8.5动态作用域的评估 137
5.9作用域与生存期 137
5.10引用环境 138
5.11命名常量 139
5.12变量初始化 141
本章小结 141
复习题 142
练习题 142
第6章数据类型 147
6.1介绍 148
6.2.1数值类型 149
6.2基本数据类型 149
6.2.2布尔类型 150
6.2.3字符类型 150
6.3字符串类型 151
6.3.1设计问题 151
6.3.2字符串及操作 151
6.3.3串长度的选择 152
6.3.5字符串类型的实现 153
6.3.4评估 153
6.4用户定义的序数类型 154
6.4.1枚举类型 154
6.4.2子范围类型 155
6.4.3实现用户定义的序数类型 156
6.5数组类型 156
6.5.1设计问题 157
6..5.2数组和下标 157
6.5.3下标绑定和数组类别 158
6.5.4数组中的下标数目 159
6.5.6数组操作 160
6.5.5数组初始化 160
6.5.7片 161
6.5.8评估 162
6.5.9数组类型的实现 162
6.6相关数组 165
6.6.1结构和操作 165
6.6.2实现相关数组 166
6.7记录类型 166
6.7.1记录的定义 166
6.72对记录域的引用 167
6.7.3记录操作 168
6.7.4评估 168
6.7.5记录类型的实现 169
6 8联合类型 169
6.8.1设计问题 169
6.8.2自由联合 169
6.8.3 Pascal联合类型 169
6.8.4 Ada联合类型 171
6.8.6联合类型的实现 172
6.8.5评估 172
6.9集合类型 173
6.9.1 Pascal中的集合 173
6.92评估 173
6.9.3集合类型的实现 174
6.10指针类型 174
6.10 .1设计问题 175
6.10.2指针操作 175
6.10.4 Pascal语言中的指针 176
6.10.3指针的一些问题 176
6.10.5Ada中的指针 177
6.10.6 C和C++中的指针 177
6.10.7 FORTRAN 90中的指针 178
6.10.8引用类型 179
6.10.9评估 179
6.10.10指针类型和引用类型的实现 180
本章小结 183
复习题 184
文献注释 184
练习题 185
第7章 表达式与赋值语句 187
7.1介绍 188
7.2算术表达式 188
7.2.1操作符求值顺序 188
7.2.2操作数求值顺序 192
7.3重载操作符 193
7.4.1表达式中的强制转换 195
7 4类型转换 195
7.4 2显式类型转换 196
7.4 3表达式中的错误 196
7.5关系表达式和布尔表达式 197
7.5.1关系表达式 197
7.5.2布尔表达式 197
7 6短路求值 198
7.7赋值语句 199
7.7.4复合赋值操作符 200
7 7.3条件目标 200
7.7.2多目标 200
7.7.1简单赋值 200
7.7.5一元赋值操作符 201
7.7.6赋值作为表达式 201
7.8混合模式赋值 202
本章小结 203
复习题 203
练习题 203
第8章语句层次的控制结构 207
8.1介绍 208
8.2复合语句 208
8.3选择语句 209
8.3.1双向选择语句 209
8.3.2多向选择结构 212
8.4循环语句 217
8.4.1计数器控制的循环 217
8.4.2逻辑控制的循环 223
8.4.3用户定位的循环控制机制 224
8.4.4基于数据结构的重复 226
8.5无条件转移 227
8.5.1无条件转移中的问题 227
8 5.2标号形式 228
8.6受保护命令 228
8.7结论 230
本章小结 231
复习题 231
练习题 232
第9章子程序 235
9.1介绍 236
9.2子程序的基本原理 236
9.2.1子程序的共同特征 236
9.2.2基本定义 236
9.2.3参数 237
9.2.4过程与函数 238
9.3子程序的设计问题 239
9.4局部引用环境 240
9.5参数传递方法 241
9.5.1参数传递的语义模型 241
9.5.2参数传递的实现模型 242
9.5.3主要语言中的参数传递 245
9.5.4参数类型检测 246
9.5.5实现参数传递方法 247
9.5.6多维数组作为参数 248
9.5.8参数传递的例子 251
9.5.7设计考虑 251
9.6子程序名作为参数传递 254
9.7重载子程序 256
9.8通用子程序 257
9.8.1Ada中的通用子程序 257
9.8.2 C++中的通用函数 258
9.9分别编译与独立编译 260
9.1 1.1 FORTRAN COMMON块 261
9.11访问非局部环境 261
9.10.2返回值的类型 261
9.10.1函数的副作用 261
9.10函数的设计问题 261
9.11.2外部声明和模块 262
9.12用户定义的重载操作符 263
9.13协同程序 263
本章小结 265
复习题 265
练习题 266
第10章实现子程序 269
10.1调用与返回的一般语义 270
10.2实现FORTRAN 77子程序 270
10.3在类ALGOL语言中实现子程序 272
10.3.1更复杂的活动记录 272
10.3.2一个没有递归及非局部引用的例子 273
10.3.3递归 275
10.3.4实现非局部引用的机制 275
10.4块 285
10.5.1深访问 286
10 5实现动态作用域 286
10 5.2浅访问 287
10.6子程序名参数的实现 288
10.6.1静态链方法 288
10.6.2显示 288
10.6.3再次讨论引用环境的混乱 288
本章小结 290
文献注释 290
复习题 290
练习题 291
第11章抽象数据类型 293
1 1.1抽象的概念 294
11.2封装 294
11.3数据抽象的介绍 295
11.3.1浮点数作为抽象数据类型 295
11.3.2用户定义的抽象数据类型 296
11.3.3一个例子 296
11.51SIMULA 67中的类 297
11.4设计问题 297
11.5语言示例 297
11.5.2 Ada中的抽象数据类型 298
11.5.3 C++中的抽象数据类型 301
11.6有参数的抽象数据类型 305
11.6.1Ada 305
11.6.2 C++ 305
本章小结 306
练习题 307
复习题 307
第12章支持面向对象的程序设计 309
12.1介绍 310
12.2面向对象程序设计 310
12.2.1介绍 310
12.2.2继承 310
12.2.3多态与动态绑定 312
12.2.4面向对象语言的计算 312
12.3.3实现继承与接口继承 313
12.3.2子类是子类型吗 313
12.3.1纯对象模型 313
12.3面向对象语言的设计问题 313
12.3.4类型检测与多态 314
12.3.5单继承与多继承 314
12.3.6对象的分配与解除分配 315
12.3.7动态绑定与静态绑定 315
12.4 Smalltalk概况 315
12.4.1一般特征 316
12.4.2 Smalltalk环境 316
12.5 Smalltalk语言介绍 316
12.5.1表达式 316
12.5.2方法 318
12.5.3赋值语句 319
12.5.4块与控制结构 320
12.5.5类 322
12.5.6方法的更多方面 323
12.6.1简单表格处理 324
12.6 Smalltalk程序示例 324
12.6.2 LOGO风格的图形 325
12.7 Smalltalk的轮廓特性 329
12.7.1类型检测与多态 329
12.7.2继承 329
12.8 Smalltalk的评估 329
12.9 C++对面向对象程序设计的支持 330
12.9.1一般特征 330
12.9.2继承 330
12.9.3动态绑定 333
12.9.4评估 334
12.10 Java对面向对象程序设计的支持 335
12.10.1一般特征 335
12.10.2继承 336
12.10.3动态绑定 336
12.10.4封装 336
12.11.1一般特征 337
12.1 1 Ada 95对面向对象程序设计的支持 337
12.10.5评估 337
12.11 2继承 338
12.11.3动态绑定 338
12.11.4评估 339
12.12 Eiffel对面向对象程序设计的支持 339
12.12.1一般特征 340
12.12.2继承 340
12.13 JavaScript的对象模型 341
12.13.1一般特征 341
12 12.4评估 341
12.12.3动态绑定 341
12.13.2 JavaScript对象 342
12.13.3对象的创建与修改 342
12.13.4评估 343
12.14面向对象结构的实现 343
12.14.1存储实例数据 343
12.14.2消息对方法的动态绑定 344
复习题 345
本章小结 345
练习题 346
第13章并发 349
13.1介绍 350
13.1.1多处理器体系结构 350
13.1 .2并发的种类 351
1 3.1.3学习并发的动机 351
13.2子程序层次并发的介绍 351
13.2.1基本概念 351
13.2 2为并发而设计的语言 353
13.2.3设计问题 354
13.3信号量 354
13.3.1介绍 354
13.3.2合作同步 354
13.3.3竞争同步 356
13.4管程 357
13.4.1介绍 357
13.3.4评估 357
13.4.2竞争同步 358
13.4.3合作同步 358
13.4.4评估 361
13.5消息传递 361
13.5.1介绍 361
13.5.2同步消息传递的概念 361
13.5.3 Ada 83的消息传递模型 361
13.5.5竞争同步 365
13.5.4合作同步 365
13.5.6任务的终止 367
13.5.7优先级 367
13.5.8二元信号量 367
13.5.9评估 368
13.6 Ada 95中的并发 368
13.6.1保护的对象 368
13.6.2异步消息 369
13.7.1 Thread类 370
13.7.2优先级 370
13.7 Java线程 370
13.7.3竞争同步 371
13.7.4合作同步 371
13.7.5评估 373
13.8语句层次的并发 373
本章小结 375
文献注释 376
复习题 376
练习题 376
第14章异常处理 379
14.1异常处理介绍 380
14.1.1基本概念 380
14.1.2设计问题 381
14.1.3历史 383
14.2.2异常与异常处理程序的绑定 384
14.2.3继续 384
14.2.4其他设计选择 384
14.2.1异常处理程序 384
14.2 PL/I中的异常处理 384
14.2.5示例 385
14.2.6评估 386
14.3 Ada中的异常处理 387
14.3.1异常处理程序 387
14.3.2异常与异常处理程序的绑定 387
14.3.3继续 388
14.3.4其他设计选择 389
14.3.5示例 390
14.3.6评估 391
14.4 C++中的异常处理 391
14.4 1异常处理程序 391
14.4.2异常与异常处理程序的绑定 391
14.4.3继续 392
14.4.4其他设计选择 392
14.4.5示例 393
14.4.6评估 393
14.5.3异常与异常处理程序的绑定 394
14.5.2异常处理程序 394
14.5.1异常类 394
14.5 Java中的异常处理 394
14.5.4继续 395
14.5.5其他设计选择 396
14.5.6示例 396
14.5.7 final1y子句 397
14.5.8评估 398
文献注释 399
复习题 399
本章小结 399
练习题 400
第15章函数式程序设计语言 403
15.1介绍 404
15.2数学函数 404
15.2.1简单函数 404
15.2.2函数形式 405
15.3函数式程序设计语言的基础 406
15.4第一种函数式程序设计语言:LISP 406
15.4.2第一个LISP解释器 407
15.4.1数据类型和结构 407
15.5 Scheme介绍 408
15.5.1 Scheme的起源 409
15.5.2原始函数 409
15.5.3构造函数的函数 410
15.5.4谓词函数 412
15.5.5控制流程 414
15.5.6 Scheme示例函数 415
15.5.7函数形式 418
15.5.9 Scheme的命令式特性 419
15.5.8产生代码的函数 419
15.6 COMMON LISP 420
15.7 ML 422
1 5.8Haskell 423
15.9函数式语言的应用 425
15.10函数式语言和命令式语言的比较 426
本章小结 426
练习题 427
义献注释 427
复习题 427
第16章逻辑程序设计语言 429
16.1介绍 430
16.2谓词演算的简短介绍 430
16.2.1命题 430
16.2.2 子句形式 431
16.3谓词演算与定理证明 432
16.4逻辑程序设计概述 434
16.5 Prolog的起源 435
16.6 Prolog的基本元素 435
16.6.1项 435
16.6.2事实语句 435
16.6.3规则语句 436
16.6.4 目标语句 437
16.6.5 Prolog的推理过程 437
16.6.6简单算术 439
16.6.7链表结构 441
16.7.1归结次序控制 444
16.7 Prolog的缺陷 444
16.7.2封闭世界假设 446
16.7.3否定问题 446
16.7.4内在的限制 448
16.8逻辑程序设计的应用 448
16.8.1关系数据库管理系统 448
16.8.2专家系统 448
16.9结论 449
16.8.3自然语言处理 449
16.8.4教育 449
本章小结 450
文献注释 450
复习题 450
练习题 451
参考文献 453
索引 465