上篇 程序设计语言的设计 1
第1章 绪论 1
1.1 引言 1
1.2 强制式语言 2
1.2.1 程序设计语言的分类 3
1.2.2 冯·诺依曼体系结构 3
1.2.3 绑定和绑定时间 4
1.2.4 变量 5
1.2.5 虚拟机 9
1.3 程序单元 11
1.4 程序设计语言发展简介 12
1.4.1 早期的高级语言 13
1.4.2 早期语言的发展阶段 15
1.4.3 概念的集成阶段 16
1.4.4 再一次突破 16
1.4.5 大量的探索 18
1.4.6 Ada语言 18
1.4.7 第四代语言 19
1.4.8 网络时代的语言 19
1.4.9 新一代程序设计语言 20
习题1 22
第2章 数据类型 23
2.1 引言 23
2.2 内部类型 24
2.3 用户定义类型 25
2.3.2 有限映像 26
2.3.1 笛卡儿积 26
2.3.3 序列 27
2.3.4 递归 27
2.3.5 判定或 28
2.3.6 幂集 28
2.4 Pascal语言数据类型结构 30
2.4.1 非结构类型 30
2.4.2 聚合构造 31
2.4.3 指针 35
2.5 Ada语言数据类型结构 37
2.5.1 标量类型 37
2.5.2 组合类型 38
2.6.1 非结构类型 42
2.6 C语言数据类型结构 42
2.6.2 聚合构造 44
2.6.3 指针 47
2.6.4 空类型 47
2.7 抽象数据类型 48
2.7.1 SIMULA 67语言的类机制 50
2.7.2 CLU语言的抽象数据类型 53
2.7.3 Ada语言的抽象数据类型 54
2.7.4 Modula-2语言的抽象数据类型 57
2.7.5 C++++语言的抽象数据类型 59
2.8 类型检查 62
2.9 类型转换 63
2.10 类型等价 64
2.11 实现模型 65
2.11.1 内部类型和用户定义的非结构类型实现模型 65
2.11.2 结构类型实现模型 66
习题2 71
第3章 控制结构 72
3.1 引言 72
3.2 语句级控制结构 72
3.2.1 顺序结构 72
3.2.2 选择结构 73
3.2.3 重复结构 76
3.2.4 语句级控制结构分析 78
3.2.5 用户定义控制结构 79
3.3 单元级控制结构 80
3.3.1 显式调用从属单元 80
3.3.2 隐式调用单元——异常处理 84
3.3.3 SIMULA 67语言协同程序 88
3.3.4 并发单元 90
习题3 97
第4章 程序语言的设计 100
4.1 语言的定义 100
4.1.1 语法 100
4.1.2 语义 105
4.2 文法 106
4.2.1 文法的定义 106
4.2.2 文法的分类 108
4.2.3 文法产生的语言 109
4.2.4 语法树 111
4.3 语言的设计 113
4.3.1 表达式的设计 113
4.3.2 语句的设计 114
4.3.3 程序单元的设计 116
4.3.4 程序的设计 117
4.4 语言设计实例 118
4.5 一些设计准则 119
习题4 120
第5章 非过程式程序设计语言 122
5.1 引言 122
5.2 函数式程序设计语言 124
5.2.1 函数 124
5.2.2 数学函数与程序设计语言函数 125
5.2.3 一种简单的纯函数式语言 126
5.2.4 LISP语言概述 130
5.2.5 APL语言概述 132
5.2.6 作用式语言和命令式语言的比较 136
5.3 逻辑程序设计语言 137
5.3.1 逻辑程序设计 137
5.3.2 Prolog语言概述 139
5.3.3 逻辑程序设计展望 146
5.4 面向对象程序设计语言 147
5.4.1 面向对象的基本概念 147
5.4.2 Smalltalk语言概述 150
5.4.3 对面向对象语言的评价 157
5.5 小结 157
习题5 158
第6章 形式语义学简介 160
6.1 引言 160
6.2 形式语义学分类 161
6.3 公理语义学简介 162
6.4 指称语义学简介 166
习题6 169
下篇 程序设计语言的实现(编译) 171
第7章 编译概述 171
7.1 引言 171
7.1.1 翻译和编译 171
7.1.2 解释 172
7.2 参数传递 172
7.2.1 数据参数传递 173
7.2.2 子程序参数传递 175
7.3 编译步骤 176
习题7 178
8.1.1 词法分析器的功能 179
8.1.2 词法分析器的输出形式 179
第8章 词法分析 179
8.1 词法分析概述 179
8.2 词法分析器的结构 180
8.2.1 扫描缓冲区 180
8.2.2 符号的识别 181
8.3 状态转换图 182
8.4 词法分析器的设计 183
习题8 186
第9章 自上而下的语法分析 187
9.1 引言 187
9.2 回溯分析法 187
9.2.1 提取产生式的公因子 188
9.2.2 消除左递归 189
9.3 递归下降分析法 190
9.3.1 递归下降分析器的构造 191
9.3.2 扩充的BNF 192
9.4 预测分析法 194
9.4.1 预测分析过程 194
9.4.2 FIRST集和FOLLOW集 195
9.4.3 LL(1)文法 197
9.4.4 预测分析表的构造 198
9.4.5 非LL(1)文法 198
习题9 199
10.1 引言 201
1O.1.1 分析树 201
第10章 自下而上的语法分析 201
10.1.2 规范归约、短语和句柄 203
10.2 算符优先分析法 203
10.2.1 算符优先文法 204
10.2.2 算符优先分析算法 205
10.2.3 算符优先分析表的构造 207
10.3 LR分析法 209
10.3.1 LR分析过程 209
10.3.2 活前缀 211
10.3.3 LR(0)项目集规范族 211
10.3.4 LR(0)分析表的构造 215
10.3.5 SLR(1)分析表的构造 216
习题10 217
11.1.2 语法制导翻译 219
11.1.1 语义分析的任务 219
11.1 语义分析概论 219
第11章 语义分析和中间代码生成 219
11.1.3 中间代码 220
11.1.4 语义函数和语义变量 221
11.2 赋值语句的翻译 221
11.2.1 表达式的翻译 221
11.2.2 只含简单变量的赋值语句的翻译 222
11.3 控制语句的翻译 223
11.3.1 布尔表达式的翻译 223
11.3.2 无条件转移语句的翻译 223
11.3.3 条件语句的翻译 224
11.3.4 while语句的翻译 226
11.3.5 循环语句的翻译 227
11.4 过程诵用的翻译 228
11.5 说明语句的翻译 229
习题11 230
第12章 代码优化和目标代码生成 232
12.1 局部优化 232
12.1.1 优化的定义 232
12.1.2 基本块的划分 232
12.1.3 程序流图 234
12.1.4 基本块内的优化 234
12.2 全局优化 236
12.2.1 循环的定义 236
12.2.2 必经结点集 237
12.2.3 循环的查找 237
12.2.4 循环的优化 238
12.3 目标代码生成 240
12.3.1 一个计算机模型 241
12.3.2 简单的代码生成方法 241
12.3.3 循环中的寄存器分配 242
习题12 243
第13章 运行时存储空间的组织 246
13.1 程序的存储空间 246
13.1.1 代码空间 246
13.1.2 数据空间 246
13.1.3 活动记录 247
13.1.4 变量的存储分配 248
13.1.5 存储分配模式 249
13.2 静态分配 250
13.3.1 只含半静态变量的栈式分配 253
13.3 栈式分配 253
13.3.2 半动态变量的栈式分配 255
13.3.3 非局部环境 256
13.3.4 非局部环境的引用 257
13.4 符号表 259
13.4.1 符号表的组织 260
13.4.2 常用的符号表结构 261
习题13 262
附录A Java语言概述 264
A.1 什么是Java 264
A.2 Java语言的特性 264
A.3 Java语言的数据类型 266
A.4 Java语言的控制结构 268
A.5 Java程序实例 271
参考文献 273