第1章 程序语言设计问题 1
1.1 为什么学习程序语言 1
1.2 程序语言简史 2
1.2.1 早期语言的发展 3
1.2.2 软件结构的演化 5
1.2.3 应用领域 9
1.3 程序语言的角色 11
1.3.1 如何构成一种好语言 13
1.3.2 语言范例 17
1.3.3 语言标准 20
1.3.4 国际化 22
1.4 编程环境 23
1.4.1 对语言设计的影响 23
1.4.2 环境框架 25
1.4.3 作业控制与过程语言 25
1.5 C简介 26
1.6 进一步阅读的建议 28
1.7 习题 28
第2章 机器体系结构对语言的影响 30
2.1 计算机的操作 30
2.1.1 计算机的硬件结构 30
2.1.2 固件计算机 34
2.1.3 翻译器和软件模拟计算机 35
2.2 虚拟计算机和绑定时间 37
2.2.1 虚拟计算机和语言实现 38
2.2.2 虚拟机的层次 38
2.2.3 绑定和绑定时间 40
2.2.4 Java概览 42
2.3 进一步阅读的建议 44
2.4 习题 44
第3章 语言翻译问题 46
3.1 编程语言语法 46
3.1.1 通用语法标准 46
3.1.2 语言的语法要素 49
3.1.3 主程序-子程序结构 51
3.2 翻译的步骤 53
3.2.1 源程序的分析 54
3.2.2 目标程序的综合 56
3.3 形式编译模式 58
3.3.1 BNF文法 59
3.3.2 有限状态自动机 65
3.3.3 Perl概述 69
3.3.4 下推自动机 71
3.3.5 常规的语法分析策略 72
3.4 递归下降语法分析 73
3.5 Pascal概述 74
3.6 进一步阅读的建议 76
3.7 习题 76
第4章 建立语言属性的模型 79
4.1 语言的形式性质 79
4.1.1 Chomsky层次文法 80
4.1.2 不可判定性 82
4.1.3 算法复杂性 86
4.2 语言的语义 88
4.2.1 属性文法 89
4.2.2 指称语义 91
4.2.3 ML概述 97
4.2.4 程序验证 98
4.2.5 代数数据类型 101
4.3 进一步阅读的建议 104
4.4 习题 104
第5章 基本数据类型 107
5.1 类型和对象的属性 107
5.1.1 数据对象、变量和常量 107
5.1.2 数据类型 110
5.1.3 声明 114
5.1.4 类型检查和类型转换 115
5.1.5 赋值和初始化 119
5.2 标量数据类型 121
5.2.1 数字数据类型 121
5.2.2 枚举类型 126
5.2.3 布尔类型 127
5.2.4 字符型 128
5.3 复合数据类型 129
5.3.1 字符串 129
5.3.2 指针和程序员构造的数据对象 131
5.3.3 文件和输入输出 133
5.4 FORTRAN概述 136
5.5 进一步阅读的建议 137
5.6 习题 138
第6章 封装 141
6.1 结构化数据类型 142
6.1.1 结构化数据对象和数据类型 142
6.1.2 数据结构类型规范 142
6.1.3 数据结构类型的实现 144
6.1.4 数据结构的声明和类型检查 146
6.1.5 向量和数组 147
6.1.6 记录 155
6.1.7 列表 160
6.1.8 集合 163
6.1.9 可执行数据对象 165
6.2 抽象的数据类型 166
6.2.1 数据类型概念的发展 166
6.2.2 信息隐藏 167
6.3 通过子程序实现封装 168
6.3.1 作为抽象操作的子程序 168
6.3.2 子程序定义和调用 170
6.3.3 作为数据对象的子程序定义 174
6.4 类型定义 175
6.4.1 类型相同 176
6.4.2 带有参数的类型定义 179
6.5 C++概述 181
6.6 进一步阅读的建议 182
6.7 习题 183
第7章 继承 188
7.1 再论抽象数据类型 188
7.2 继承 194
7.2.1 派生类 194
7.2.2 方法 197
7.2.3 抽象类 199
7.2.4 Smalltalk概述 200
7.2.5 对象和消息 201
7.2.6 有关抽象的概念 205
7.3 多态 206
7.4 进一步阅读的建议 208
7.5 习题 208
第8章 顺序控制 210
8.1 隐式的和显式的顺序控制 210
8.2 表达式中的顺序 210
8.2.1 树结构表示 211
8.2.2 执行时的表示 217
8.3 语句之间的顺序控制 220
8.3.1 基本语句 220
8.3.2 结构化的顺序控制 224
8.3.3 基本程序 231
8.4 非算术表达式的顺序化 234
8.4.1 Prolog简介 234
8.4.2 模式匹配 236
8.4.3 合一 239
8.4.4 回溯 243
8.4.5 归结 244
8.5 进一步阅读的建议 245
8.6 习题 245
第9章 子程序控制 248
9.1 子程序顺序控制 248
9.1.1 简单的Call-Return子程序 249
9.1.2 递归子程序 254
9.1.3 Pascal的forward声明 254
9.2 数据控制的属性 256
9.2.1 命名和引用环境 257
9.2.2 静态和动态作用域 260
9.2.3 块结构 262
9.2.4 局部数据和局部引用环境 264
9.3 参数传递 267
9.3.1 实际和形式参数 268
9.3.2 参数传递的方法 269
9.3.3 参数传递语义 272
9.3.4 参数传递的实现 272
9.4 显式共同环境 280
9.4.1 动态域 282
9.4.2 静态域和块结构 284
9.5 参考资料 290
9.6 习题 290
第10章 存储管理 295
10.1 需要存储的元素 295
10.2 程序员和系统控制的存储管理 296
10.3 静态的存储管理 297
10.4 堆的存储管理 298
10.4.1 LISP概况 298
10.4.2 固定大小的单元 300
10.4.3 可变长的单元 305
10.5 进一步阅读的建议 308
10.6 习题 308
第11章 分布式处理 311
11.1 子程序控制的变体 311
11.1.1 异常和异常处理程序 311
11.1.2 协同程序 315
11.1.3 子程序调度 316
11.2 并行程序设计 317
11.2.1 并发运行 318
11.2.2 保护命令 319
11.2.3 Ada简介 321
11.2.4 任务 323
11.2.5 任务的同步 324
11.3 硬件的发展 333
11.3.1 处理器设计 333
11.3.2 系统设计 335
11.4 软件体系结构 337
11.4.1 持久性数据和事务系统 337
11.4.2 网络和客户-服务器计算 338
11.5 进一步阅读的建议 340
11.6 习题 340
第12章 网络程序设计 342
12.1 桌面出版 343
12.1.1 LATEX文档处理 343
12.1.2 WYSIWYG编辑器 345
12.1.3 Postscript 345
12.1.4 Postscritp虚拟机 346
12.2 万维网 350
12.2.1 互联网 350
12.2.2 CGI脚本 358
12.2.3 Java小应用程序 360
12.2.4 XML 362
12.3 进一步阅读的建议 363
12.4 习题 363
附录A 语言概要 364
A.1 ADA 364
A.2 C 378
A.3 C++ 387
A.4 FORTRAN 396
A.5 JAVA 404
A.6 LISP 408
A.7 ML 415
A.8 PASCAL 425
A.9 PERL 433
A.10 Postscript语言 436
A.11 Prolog 439
A.12 Smalltalk 444
A.13 进一步阅读的建议 452
参考文献 453