目录 2
第1部分 函数与基本原理 2
第1章 导言 2
1.1 程序设计语言 2
1.2 目标 3
1.2.1 总体目标 3
1.2.2 特殊主题 3
1.3 程序设计语言的历史 4
1.4 组织:概念和语言 5
第2章 可计算性 7
2.1 部分函数与可计算性 7
2.1.1 表达式、错误和非终止符 7
2.1.2 部分函数 8
2.1.3 可计算性 9
2.2 本章小结 11
习题 11
3.2 好的语言设计 13
3.1 Lisp语言的历史 13
第3章 Lisp语言:函数、递归和列表 13
3.3 语言简述 15
3.4 Lisp设计中的创新 18
3.4.1 语句和表达式 18
3.4.2 条件表达式 19
3.4.3 Lisp抽象机 20
3.4.4 把程序作为数据 23
3.4.5 函数表达式 24
3.4.7 高阶函数 25
3.4.6 递归 25
3.4.8 垃圾收集 26
3.4.9 纯Lisp与副作用 29
3.5 本章小结 30
习题 30
第4章 基本原理 38
4.1 编译器和语法 38
4.1.1 一个简单编译器的结构 38
4.1.2 文法和解析树 41
4.1.3 解析和优先级 43
4.2 朗母达演算 44
4.2.1 函数和函数表达式 44
4.2.2 朗母达表达式 45
4.2.3 朗母达演算编程 49
4.2.4 归约、汇合和范式 51
4.2.5 朗母达演算的重要特征 52
4.3 指称语义 52
4.3.1 目标语言和元语言 53
4.3.2 二进制数的指称语义 54
4.3.3 While程序的指称语义 55
4.3.4 透视和非标准语义 58
4.4 函数型语言和命令型语言 60
4.4.1 命令语句和声明语句 60
4.4.2 功能型程序和命令型程序 61
4.5 本章小结 65
习题 66
5.1.1 Algol 60 74
5.1 Algol家族的程序语言 74
第2部分 过程、类型、内存管理与控制 74
第5章 Algol与ML语言 74
5.1.2 Algol 68 76
5.1.3 Pascal 77
5.1.4 Modula 78
5.2 C语言的发展 78
5.3 LCF系统和ML 80
5.4 ML程序设计语言 82
5.4.1 交互会话和运行时环境 82
5.4.2 基本类型和类型构造器 85
5.4.3 模式、声明、函数表达式 89
5.4.4 ML数据类型的声明 92
5.4.5 ML的引用单元与赋值 94
5.4.6 ML小结 97
5.5 本章小结 98
习题 98
6.1.1 程序的组织和文档 105
6.1 程序设计中的类型 105
第6章 类型系统和类型推测 105
6.1.2 类型错误 106
6.1.3 类型与优化 107
6.2 类型安全和类型检查 108
6.2.1 类型安全 108
6.2.2 编译时和运行时的类型检查 108
6.3 类型推测 110
6.3.1 第一个类型推测的示例 110
6.3.2类型推测算法 111
6.4 多态和重载 118
6.4.1 参数多态 118
6.4.2 参数多态的实现 120
6.4.3 重载 122
6.5 类型声明和类型等价性 123
6.5.1 透明的类型声明 123
6.5.2 C语言的声明和结构 124
6.5.3 ML类型声明 125
6.6 本章小结 126
习题 127
第7章 作用域、函数和存储管理 133
7.1 块结构的语言 133
7.2 内嵌块 135
7.2.1 活动记录和局部变量 135
7.2.2 全局变量和控制链 138
7.3 函数和子程序 139
7.3.1 函数的活动记录 139
7.3.2 参数传递 141
7.3.3 全局变量(一阶情况) 144
7.3.4 末端递归(一阶情况) 146
7.4 高阶函数 148
7.4.1 一阶函数 148
7.4.2 将函数传递给函数 149
7.4.3 从嵌套作用域中返回函数 152
7.5 本章小结 154
习题 155
8.1.2 结构化控制 168
8.1.1 意大利面条式的代码 168
第8章 顺序语言中的控制 168
8.1 结构化控制 168
8.2 异常 169
8.2.1 异常机制的目的 169
8.2.2 ML异常 171
8.2.3 C++异常 173
8.2.4 关于异常的更多内容 175
8.3 延续 179
8.3.1 表示“程序其余部分”的函数 179
8.3.2 延续传递形式和末端调用 180
8.3.3 延续的编译 183
8.4 函数和求值顺序 183
8.5 本章小结 186
习题 187
第3部分 模块、抽象与面向对象程序设计 192
第9章 数据抽象和模块化 192
9.1 结构化程序设计 192
9.1.1 数据细化 193
9.1.2 模块化 194
9.2 支持抽象机制的语言 196
9.2.1 抽象 197
9.2.2 抽象数据类型 198
9.2.3 ML抽象数据类型 198
9.2.4 表达无关性 201
9.2.5 数据类型介绍 202
9.3 模块 204
9.3.1 Modula和Ada 205
9.3.2 ML模块 207
9.4 一般抽象 210
9.4.1 C++函数模板 210
9.4.2 标准的ML算符 212
9.4.3 C++标准模板库 215
9.5 本章小结 218
习题 220
10.1 面向对象设计 226
第10章 面向对象语言的概念 226
10.2 面向对象语言中的4个基本概念 227
10.2.1 动态查找 227
10.2.2 抽象 229
10.2.3 子类型 231
10.2.4 继承 232
10.2.5 作为对象的闭包 233
10.2.6 继承不是子类型 234
10.3 编程结构 235
10.4 设计模式 236
10.5 本章小结 239
10.6 展望:Simula、Smalltalk、C++、Java 239
习题 240
第11章 对象的历史:Simula和Smalltalk 246
11.1 Simula面向对象机理 246
11.1.1 对象和仿真 246
11.1.2 Simula的主要概念 247
11.2 Simula中的对象 247
11.2.2 一个点线圆的例子 248
11.2.1 Simula中面向对象的基本特点 248
11.2.3 示例代码和对象表示 250
11.3 Simula中的子类和继承 251
11.3.1 对象类型和子类型 252
11.4 Smalltalk的发展 254
11.5 Smalltalk语言的特点 255
11.5.1 术语 255
11.5.2 类和对象 255
11.5.3 继承 258
11.6.1 动态查找和多态 260
11.5.4 Smalltalk的抽象性 260
11.6 Smalltalk的灵活性 260
11.6.2 布尔变量和块 261
11.6.3 self和super 262
11.6.4 系统扩充:Ingalls测试 263
11.7 子类型与继承的重要性 264
11.7.1 对象类型作为接口 264
11.7.3 子类型和继承 265
11.7.2 子类型 265
11.8 本章小结 267
习题 268
第12章 C++对象与运行效率 277
12.1 设计目标和限制 277
12.1.1 与C的兼容性 277
12.1.2 C++的成功 278
12.2 C++概述 278
12.2.1 增加了C中没有的对象 279
12.2.3 好的决定和问题所在 282
12.2.2 面向对象的特点 282
12.3 类、继承和虚函数 284
12.3.1 C++类和对象 284
12.3.2 C++派生类(继承) 285
12.3.3 虚函数 287
12.3.4 为什么C++的查找比Smalltalk的查找简单 288
12.4 子类型 292
12.4.1 子类型原理 292
12.4.2 公有基类 293
12.4.4 抽象基类 294
12.4.3 public成员的特殊类型 294
12.5 多重继承 295
12.5.1 多重继承的实现 296
12.5.2 命名冲突、继承和虚拟基类 298
12.6 本章小结 301
习题 302
第13章 可移植性和安全性:Java语言 319
13.1.2 设计决策 320
13.1 Java语言概述 320
13.1.1 Java语言的目标 320
13.2 Java的类和继承 322
13.2.1 类和对象 322
13.2.2 包和可视性 325
13.2.3 继承 325
13.2.4 抽象类和接口 327
13.3.1 类型的分类 328
13.3 Java的类型及子类型关系 328
13.3.2 类和接口的子类型关系 329
13.3.3 数组、协变和反协变 330
13.3.4 Java异常类的层次关系 331
13.3.5 子类型多态和通用编程 333
13.4 Java系统架构 336
13.4.1 Java虚拟机 336
13.4.2 类加载器 337
13.4.3 Java链接器、检验器及类型约束 337
13.4.4 字节码解释器和方法查询 338
13.5 安全特性 342
13.5.1 缓冲区泄漏攻击 343
13.5.2 Java沙箱 344
13.5.3 安全和类型安全 346
13.6 本章小结 347
习题 349
第14章 并发和分布式编程 358
第4部分 并发性与逻辑编程 358
14.1 并发的基本概念 359
14.1.1 执行顺序和非确定性 359
14.1.2 通信、协调和原子性 361
14.1.3 互斥和封锁 361
14.1.4 信号量 364
14.1.5 管程 365
14.2 Actor模型 366
14.3.1 线程和通道 369
14.3 并发ML 369
14.3.2 选择式通信和保护命令 371
14.3.3 一流的同步操作:事件 373
14.4 Java的并发性 377
14.4.1 线程、通信与同步 378
14.4.2 同步方法 380
14.4.3 虚拟机与存储模型 382
14.4.4 分布式程序设计与远程方法调用 386
14.5 本章小结 388
习题 390
第15章 逻辑编程范例和Prolog 396
15.1 逻辑编程的历史 396
15.2 逻辑编程范例的简要概述 397
15.2.1 说明性编程 397
15.2.2 交互编程 397
15.3 作为原子动作统一解决的等式 398
15.3.1 项 398
15.3.3 最通用的合一置换 399
15.3.2 置换 399
15.3.4 合一算法 400
15.4 子句作为过程声明的一部分 402
15.4.1 简单子句 402
15.4.2 计算过程 402
15.4.3 子句 404
15.5 Prolog编程 405
15.5.1 单个程序的多重使用 405
15.5.2 逻辑变量 406
15.6 Prolog中的数学 409
15.6.1 数学运算符 410
15.6.2 数学比较关系 410
15.6.3 对算术表达式的赋值 412
15.7 控制、双性语法和元变量 414
15.7.1 剪切 414
15.7.2 双性语法和元变量 415
15.7.3 控制设备 416
15.7.4 失败的否定 418
15.7.5 高阶编程和Prolog中的元编程 419
15.8 Prolog的评价 421
15.9 书目评价 423
15.10 本章小结 423
附录A 程序实例补充 425
A.1 程序和面向对象机制 425
A.1.1 类型的程序:典型案例版本 426
A.1.2 shape程序:面向对象版本 430
附录B 术语表 433