目录 1
第1章 引言 1
1.1什么是程序设计语言 1
1.2程序设计语言中的抽象 3
1.2.1数据抽象 3
1.2.2控制抽象 4
1.3计算范例 9
1.4语言定义 13
1.5语言翻译 15
1.6语言设计 20
习题 20
注释与参考文献 23
第2章历史 24
2.2 20世纪50年代:第一种程序设计语言 25
2.1早期历史:第一位程序员 25
2.3 20世纪60年代:程序语言的迅猛发展 27
2.4 20世纪70年代:简单性、抽象性、语言研究 29
2.5 20世纪80年代:程序设计的新方向和面向对象语言的产生 30
2.6 20世纪90年代:稳定发展,Internet,库及脚本语言 32
2.7未来的方向 33
习题 34
注释与参考文献 36
第3章语言设计原理 38
3.1 语言的历史和设计标准 39
3.2语言的效率 40
3.3规律性 41
3.4进一步的语言设计原理 43
3.5 C++:语言设计的实例研究 46
3.5.1背景 46
3.5.3 发展 47
3.5.2第一次实现 47
3.5.4 标准化 48
3.5.5 小结 48
习题 48
注释与参考文献 51
第4章语法 52
4.1 程序设计语言的词法结构 52
4.2上下文无关文法和BNF范式 56
4.2.1将13NF规则作为等式 61
4.3语法分析树和抽象语法树 61
4.4二义性、结合性和优先性 63
4.5 EBNF和语法图 67
4.6语法分析的技术和工具 70
4.7语言的词法、语法和语义 80
习题 81
注释与参考文献 88
第5章 基本语义 89
5.1 属性、约束和语义函数 89
5.2声明、块和范围 92
5.3符号表 99
5.4名称解析与重载 109
5.5分配、生命期和环境 115
5.6变量与常量 121
5.6.1变量 121
5.6.2常量 124
5.7别名、悬垂引用和无用单元 127
5.7.1别名 127
5.7.2悬垂引用 129
5.7.3无用单元回收 130
习题 131
注释与参考文献 137
第6章数据类型 139
6.1数据类型和类型信息 141
6.2简单类型 144
6.3类型构造器 146
6.3.1笛卡儿积 146
6.3.2联合 148
6.3.3子集 150
6.3.4数组和函数 151
6.3.5指针和递归类型 156
6.3.6数据类型和环境 159
6.4简单语言中的类型命名法 159
6.4.1 C语言 159
6.4.2 Java语言 160
6.5类型等价 161
6.4.3 Ada语言 161
6.6类型检查 167
6.6.1类型相容性 168
6.6.2隐式类型 169
6.6.3重叠类型和多类型值 169
6.6.4共享操作 170
6.7类型转换 171
6.8多态类型检查 174
6.9显式多态性 181
习题 186
注释与参考文献 192
第7章控制Ⅰ——表达式和语句 194
7.1 表达式 195
7.2条件语句标志 201
7.2.1 if语句 201
7.2.2 case和switch语句 204
7.3 WHILE循环及变量 206
7.4关于GOTO的争论 209
7.5异常处理 211
7.5.1 异常 213
7.5.2异常处理程序 215
7.5.3控制 217
7.5.4异常规范说明和用C++写的例子 219
习题 225
注释与参考文献 230
第8章控制Ⅱ——过程和环境 232
8.1过程定义和活跃状态 233
8.2过程的语义 235
8.3参数传递机制 238
8.3.1按值传递 238
8.3.2按引用传递 239
8.3.3按值-结果传递 240
8.3.4按名传递和延迟计算 241
8.3.5参数传递机制及参数规范 243
8.3.6参数的类型检查 244
8.4过程的环境,活跃状态和存储分配 244
8.4.1全静态环境 244
8.4.2基于栈的运行环境 246
8.4.3动态计算过程和全动态环境 253
8.5动态内存管理 255
8.5.1 自由空间的维护 256
8.5.2存储回收 257
8.6异常处理和环境 258
习题 260
注释与参考文献 267
第9章抽象数据类型和模块 268
9.1抽象数据类型的代数规范 269
9.2.1抽象数据类型机制 273
9.2抽象数据类型机制和模块 273
9.2.2模块 275
9.3 C与C++的命名空间及Java包的独立编译 276
9.3.1 C和C++的独立编译 276
9.3.2 C++的命名空间和Java包 280
9.4 Ada包 282
9.5 ML冲的模块 287
9.6早期语言中的模块 290
9.6.1 Euclid 290
9.6.2 CLU 291
9.6.3 Modula-2 292
9.7抽象数据类型机制中的问题 294
9.7.1模块不是类型 294
9.7.2模块是静态实体 295
9.7.3输出类型的模块未对变量上的操作进行合理控制 296
9.7.4不能总是合理表示对输入类型依赖关系的模块 298
9.7.5 模块定义未包含给定操作的语义规范 300
9.8抽象数据类型的数学基础 301
习题 304
注释与参考文献 308
第10章面向对象的程序设计 309
10.1 软件重用与独立性 309
10.2 Java语言:对象、类和方法 311
10.3 继承 316
1 0.4动态绑定 325
1 0.5 C++语言 328
1 0.6 Smalltalk 338
10.7.1类与类型 343
10.7.2类与模块 343
10.7面向对象语言的设计问题 343
10.7.3继承与多态 344
10.8面向对象语言的实现问题 346
10.8.1对象及方法的实现 346
10.8.2继承和动态约束 347
10.8.3分配和初始化 350
习题 350
注释与参考文献 356
第11章 函数式程序设计 357
11.1 函数和程序 358
11.2用命令式语言进行函数式程序设计 360
11.3 Scheme:LISP的一种“方言” 364
11.3.1 Scheme的元素 364
11.3.2 Scheme中的数据结构 369
11.3.3 Scheme中的编程技巧 371
11.3.4高阶函数 372
11.4 ML:带静态类型的函数式语言 375
11.4.1 ML基础 376
11.4.2 ML中的数据结构 382
11.4.3 ML中的高阶函数和Currying 383
11.5延迟计算 386
11.6 Haskell:一种支持重载的惰性语言 390
11.7函数编程的数学基础Ⅰ:递归函数 396
11.8函数编程的数学基础Ⅱ:lambda演算 399
习题 403
注释与参考文献 408
第12章逻辑式程序设计 410
12.1 逻辑和逻辑程序 411
12.2Horn子句 414
12.3消解与合一 417
12.4 Prolog语言 420
12.4.2 Prolog的执行 421
12.4.1符号和数据结构 421
12.4.3算术运算 422
12.4.4合一 423
12.4.5 Prolog搜索策略 426
12.4.6循环和控制结构 426
12.5逻辑设计的问题 430
12.5.1 合一中的出现—检查问题 430
12.5.2失败与否定 431
12.5.3 Horn子句不表示所有的逻辑 432
12.5.4逻辑程序设计中的控制信息 432
12.6逻辑程序设计的推广.约束式逻辑程序设计和等式系统 434
12.6.1约束式逻辑程序设计 434
12.6.2等式系统 435
习题 436
注释与参考文献 441
第13章形式语义 442
13.1 一种简单语言 443
13.2操作语义 446
13.2.1逻辑推理规则 446
13.2.2整数算术表达式的归约规则 447
13.2.3环境和赋值 449
13.2.4控制 451
13.2.5在程序语言中实现操作语义 453
13.3指称语义 454
1 3.3.1语法域 455
13.3.2语义域 455
13.3.3语义函数 456
13.3.4整数算术表达式的指称语义 457
13.3.5环境和赋值 458
13.3.6控制语句的指称语义 460
13.4公理语义 461
1 3.3.7指称语义的程序语言实现 461
13.4.1 wp的一般性质 464
13.4.2简单语言的公理语义 464
1 3.5程序的正确性证明 467
习题 470
注释与参考文献 473
第14章并行程序设计 474
14.1并行处理简介 475
14.2并行处理与程序设计语言 477
14.2.1 设有明显并行机制的并行编程 478
14.2.2进程的创建和销毁 480
14.2.3语句级并行 481
14.2.4过程级并行 482
14.2.5程序级并行 482
14.3.1 Java中的线程 483
14.3线程 483
14.3.2用Java解决有限缓冲区问题 487
14.4信号量 489
14.4.1 用信号量实现有限缓冲区 491
14.4.2使用信号量的困难 492
14.4.3信号量的实现 492
14.5管程 493
14.5.2 Ada95中的并行和管程 494
14.5.1作为管程的Java同步对象 494
14.6消息传递 497
14.6.1 Ada中的task会合 498
14.7非命令式语言中的并行 502
14.7.1 LISP中的并行性 504
14.7.2 Prolog中的并行性 505
习题 506
注释与参考文献 511
参考文献 512