前言
第1章引言 1
1.1语言设计的艺术
1.2程序设计语言的谱系
1.3为什么研究程序设计语言
1.4编译和解释
1.5程序设计环境
1.6编译概览
1.6.1词法和语法分析
1.6.2语义分析和中间代码生成
1.6.3目标代码生成
1.6.4代码改进
1.7总结和注记
1.8复习
1.9练习
1.10有关参考文献
第2章程序设计语言的语法 31
2.1描述语法:正则表达式和上下文无关文法
2.1.1单词和正则表达式
2.1.2上下文无关文法
2.1.3推导和语法分析树
2.2识别语法:扫描器和语法分析器
2.2.1扫描
2.2.2自上而下和自下而上的语法分析
2.2.3递归下降
2.2.4语法错误
2.2.5表格驱动的自上而下语法分析
2.2.6自下而上的语法分析
2.3*理论基础
2.3.1有穷自动机
2.3.2下推自动机
2.3.3文法和语言类
2.4总结和注记
2.5复习
2.6练习
2.7有关参考文献
第3章名字,作用域和约束 105
3.1约束时间的概念
3.2对象生存期和存储管理
3.2.1基于堆栈的分配
3.2.2堆分配
3.2.3废料收集
3.3作用域规则
3.3.1静态作用域
3.3.2动态作用域
3.3.3符号表
3.3.4关联表和中心引用表列
3.4引用环境的约束
3.4.1子程序闭包
3.4.2一级和二级子程序
3.5重载和相关概念
3.6语言设计中与名字有关的缺陷
3.6.1作用域规则
3.6.2分别编译
3.7总结和注记
3.8复习
3.9练习
3.10有关参考文献
第4章语义分析 165
4.1语义分析器所扮演的角色
4.2属性文法
4.3属性流
4.4动作例程
4.5属性的空间管理
4.5.1自下而上求值
4.5.2自上而下求值
4.6语法树的标注
4.7总结和注记
4.8复习
4.9练习
4.10有关参考文献
第5章汇编层计算机体系结构 203
5.1工作站的微体系结构
5.2存储器层次结构
5.3数据表示
5.3.1整数算术
5.3.2浮点算术
5.4指令集的体系结构
5.4.1寻址模式
5.4.2条件分支
5.5处理器体系结构的演化
5.5.1两个实例体系结构:680x0和MIPS
5.5.2伪汇编记法形式
5.6为新型处理器做编译
5.6.1维持流水线满
5.6.2寄存器分配
5.7总结和注记
5.8复习
5.9练习
15.10有关参考文献
第6章控制流 249
6.1表达式求值
6.1.1优先级和结合性
6.1.2赋值
6.1.3表达式里的顺序
6.1.4短路求值
6.2结构化和非结构化的流程
6.3顺序复合
6.4选择
6.4.1短路条件
6.4.2分情况/开关语句
6.5迭代
6.5.1枚举控制的循环
6.5.2组合循环
6.5.3迭代器
6.5.4逻辑控制的循环
6.6递归
6.6.1迭代和递归
6.6.2应用序和正则序求值
6.7非确定性
6.8总结和注记
6.9复习
6.10练习
6.11有关参考文献
第7章数据类型 319
7.1类型系统
7.1.1类型的定义
7.1.2类型的分类
7.2类型检查
7.2.1类型等价
7.2.2类型变换和转换
7.2.3类型相容和强制
7.2.4类型推理
7.2.5ML的类型系统
7.3记录(结构)与变体(联合)
7.3.1语法和操作
7.3.2存储布局和紧缩
7.3.3With语句
7.3.4变体记录
7.4数组
7.4.1语法和操作
7.4.2维数.c上下界和分配
7.4.3数组的布局
7.5字符串
7.6集合
7.7指针和递归类型
7.7.1语法和操作
7.7.2悬空引用
7.7.3废料收集
7.8表
7.9文件和输入/输出
7.9.1交互式I/O
7.9.2基于文件的I/O
7.9.3正文I/O
7.10相等检测和赋值
7.11总结和注记
7.12复习
7.13练习
7.14有关参考文献
第8章子程序和控制抽象 427
8.1重温堆栈布局
8.2调用序列
8.2.1实例研究:在MIPS上实现C
8.2.2实例研究:在680x0上实现Pascal
8.2.3在线展开
8.3参数传递
8.3.1参数模式
8.3.2专用的参数
8.3.3函数返回
8.4通用型过程和模块
8.5异常处理
8.5.1异常的定义
8.5.2异常的传播
8.5.3实例:递归下降语法分析中的短语层恢复
8.5.4异常的实现
8.6协作程序
8.6.1堆栈分配
8.6.2转移
8.6.3迭代器
8.6.4实例:离散事件模拟
8.7总结和注记
8.8复习
8.9练习
8.10有关参考文献
第9章构造可运行程序 491
9.1后端编译器结构
9.1.1一个实例
9.1.2阶段和遍
9.2中间形式
9.2.1Diana
9.2.2GNU的RTL
9.3代码生成
9.3.1一个属性文法实例
9.3.2寄存器分配
9.4地址空间组织
9.5汇编
9.5.1指令发射
9.5.2为名字指定地址
9.6连接
9.6.1重定位和名字解析
9.6.2类型检查
9.7动态连接
9.7.1与定位无关的代码
9.7.2完全动态连接(惰性连接)
9.8总结和注记
9.9复习
9.10练习
9.11有关参考文献
第10章数据抽象和面向对象 529
10.1面向对象的程序设计
10.2封装和继承
10.2.1模块
10.2.2类
10.2.3类型扩展
10.3初始化和终结处理
10.3.1构造函数的选择
10.3.2引用和值
10.3.3执行顺序
10.3.4废料收集
10.4动态方法约束
10.4.1虚函数和非虚函数
10.4.2抽象类
10.4.3成员查找
10.4.4相关概念
10.5多重继承
10.5.1语义歧义性
10.5.2复本式继承
10.5.3共享继承
10.5.4混入式继承
10.6重温面向对象的程序设计
10.6.1Smalltalk的对象模型
10.7总结和注记
10.8复习
10.9练习
10.10有关参考文献
第11章非命令式程序设计模型:函数式和逻辑式语言 589
11.1历史渊源
11.2函数式程序设计
11.2.1Scheme简介
11.2.2重温求值顺序
11.2.3高阶函数
11.2.4理论基础
11.2.5函数式程序设计展望
11.3逻辑式程序设计
11.3.1Prolog
11.3.2理论基础
11.3.3逻辑式程序设计的展望
11.4总结和注记
11.5复习
11.6练习
11.7有关参考文献
第12章并发 659
12.1基础和动力
12.1.1简单历史
12.1.2多线程程序的不同情况
12.1.3多处理器体系结构
12.2并发程序设计基础
12.2.1通信和同步
12.2.2语言和库
12.2.3创建线程的语法
12.2.4线程的实现
12.3共享存储器
12.3.1忙等待同步
12.3.2调度器的实现
12.3.3基于调度的同步
12.3.4隐式同步
12.4消息传递
12.4.1通信对方的命名
12.4.2传送
12.4.3接收
12.4.4远程过程调用
12.5总结和注记
12.6复习
12.7练习
12.8有关参考文献
第13章代码改进 733
13.1代码优化的阶段
13.2窥孔优化
13.3基本块内的冗余删除
13.4全局冗余删除和数据流分析
13.4.1静态单赋值形式和全局值编号
13.4.2全局公共子表达式删除
13.5循环改进 I
13.5.1循环不变量
13.5.2归纳变量
13.6指令调度
13.7循环改进 II
13.7.1循环展开和软件流水线
13.7.2循环重排
13.8寄存器分配
13.9总结和注记
13.10复习
13.11练习
13.12有关参考文献
附录A本书中提到的程序设计语言 787
附录B语言设计和语言实现 795
参考书目 801
索引 827
|