内容简介
本书系统地介绍了编译系统的结构、工作流程及编译程序的设计原理和实现技术。全书共分为十章,内容涵盖词法分析、语法分析、语义分析与中间代码生成、优化、目标代码生成等编译过程中的各个阶段。
书中以广泛使用的编译程序构造方法为主线,结合丰富的实例,深入浅出地阐述了编译原理的基本概念、基础理论和实现技巧。每章后均附有习题,便于读者巩固所学知识。
本书可作为高等院校计算机及相关专业本科生和研究生的教材,也可供从事计算机软件开发的工程技术人员参考。
目录
目 录
出版者的话
专家指导委员会
译者序
第1章编译简介
1.1编译器
1.1.1编译的分析-综合模型
1.1.2编译器的前驱与后继
1.2源程序分析
1.2.1词法分析
1.2.2语法分析
1.2.3语义分析
1.2.4文本格式器中的分析
1.3编译器的各阶段
1.3.1符号表管理
1.3.2错误检测与报告
1.3.3各分析阶段
1.3.4中间代码生成
1.3.5代码优化
1.3.6代码生成
出版者的话
专家指导委员会
译者序
第1章编译简介
1.1编译器
1.1.1编译的分析-综合模型
1.1.2编译器的前驱与后继
1.2源程序分析
1.2.1词法分析
1.2.2语法分析
1.2.3语义分析
1.2.4文本格式器中的分析
1.3编译器的各阶段
1.3.1符号表管理
1.3.2错误检测与报告
1.3.3各分析阶段
1.3.4中间代码生成
1.3.5代码优化
1.3.6代码生成
1.4编译器的伙伴
1.4.1预处理器
1.4.2汇编器
1.4.3两遍汇编
1.4.4装配器和连接编辑器
1.5编译器各阶段的分组
1.5.1前端与后端
1.5.2编译器的遍
1.5.3减少编译的遍数
1.6编译器的构造工具
参考文献注释
第2章简单的一遍编译器
2.1概述
2.2语法定义
2.2.1分析树
2.2.2二义性
2.2.3操作符的结合规则
2.2.4操作符的优先级
2.3语法制导翻译
2.3.1后缀表示
2.3.2语法制导定义
2.3.3综合属性
2.3.4深度优先遍历
2.3.5翻译模式
2.3.6翻译的输出
2.4语法分析
2.4.1自顶向下语法分析
2.4.2预测分析法
2.4.3何时使用∈产生式
2.4.4设计一个预测语法分析器
2.4.5左递归
2.5简单表达式的翻译器
2.5.1抽象语法和具体语法
2.5.2调整翻译模式
2.5.3非终结符expr、term和rest的过程
2.5.4翻译器的优化
2.5.5完整程序
2.6词法分析
2.6.1剔除空白符和注释
2.6.2常数
2.6.3识别标识符和关键字
2.6.4词法分析器的接口
2.6.5词法分析器
2.7符号表
2.7.1符号表接口
2.7.2处理保留的关键字
2.7.3符号表的实现方法
2.8抽象堆栈机
2.8.1算术指令
2.8.2左值和右值
2.8.3堆栈操作
2.8.4表达式的翻译
2.8.5控制流
2.8.6语句的翻译
2.8.7输出一个翻译
2.9技术的综合
2.9.1翻译器的描述
2.9.2词法分析器模块lexer.c
2.9.3语法分析器模块parser.c
2.9.4输出模块emitter.c
2.9.5符号表模块symbol.c和init.c
2.9.6错误处理模块error.c
2.9.7编译器的建立
2.9.8程序清单
练习
编程练习
参考文献注释
第3章词法分析
3.1词法分析器的作用
3.1.1词法分析中的问题
3.1.2记号、模式、词素
3.1.3记号的属性
3.1.4词法错误
3.2输入缓冲
3.2.1双缓冲区
3.2.2标志
3.3记号的描述
3.3.1串和语言
3.3.2语言上的运算
3.3.3正规表达式
3.3.4正规定义
3.3.5缩写表示法
3.3.6非正规集
3.4记号的识别
3.4.1状态转换图
3.4.2状态转换图的实现
3.5词法分析器描述语言
3.5.1 Lex说明
3.5.2超前扫描操作
3.6有穷自动机
3.6.1不确定的有穷自动机
3.6.2确定的有穷自动机
3.6.3从NFA到DFA的变换
3.7从正规表达式到NFA
3.7.1从正规表达式构造NFA
3.7.2 NFA的双堆栈模拟
3.7.3时间空间的权衡
3.8设计词法分析器的生成器
3.8.1基于NFA的模式匹配
3.8.2词法分析器的DFA
3.8.3实现超前扫描操作
3.9基于DFA的模式匹配器的优化
3.9.1 NFA的重要状态
3.9.2从正规表达式到DFA
3.9.3最小化DFA的状态数
3.9.4词法分析器的状态最小化
3.9.5表压缩方法
练习
编程练习
参考文献注释
第4章语法分析
4.1语法分析器的作用
4.1.1语法错误的处理
4.1.2错误恢复策略
4.2上下文无关文法
4.2.1符号的使用约定
4.2.2推导
4.2.3分析树和推导
4.2.4二义性
4.3文法的编写
4.3.1正规表达式和上下文无关文法的比较
4.3.2验证文法所产生的语言
4.3.3消除二义性
4.3.4消除左递归
4.3.5提取左因子
4.3.6非上下文无关语言的结构
4.4自顶向下语法分析
4.4.1递归下降语法分析法
4.4.2预测语法分析器
4.4.3预测语法分析器的状态转换图
4.4.4非递归的预测分析
4.4.5 FIRST和FOLLOW
4.4.6预测分析表的构造
4.4.7 LL(1)文法
4.4.8预测分析的错误恢复
4.5自底向上语法分析
4.5.1句柄
4.5.2句柄裁剪
4.5.3用栈实现移动归约分析
4.5.4活前缀
4.5.5移动归约分析过程中的冲突
4.6算符优先分析法
4.6.1使用算符优先关系
4.6.2从结合律和优先级获得算符优先关系
4.6.3处理一元操作符
4.6.4优先函数
4.6.5算符优先分析中的错误恢复
4.7 LR语法分析器
4.7.1 LR语法分析算法
4.7.2 LR文法
4.7.3构造SLR语法分析表
4.7.4构造规范LR语法分析表
4.7.5构造LALR语法分析表
4.7.6 LALR语法分析表的有效构造方法
4.7.7 LR语法分析表的压缩
4.8二义文法的应用
4.8.1使用优先级和结合规则来解决分析动作的冲突
4.8.2悬空else的二义性
4.8.3特例产生式引起的二义性
4.8.4LR语法分析中的错误恢复
4.9语法分析器的生成器
4.9.1语法分析器的生成器Yacc
4.9.2用Yacc处理二义文法
4.9.3用Lex建立Yacc的词法分析器
4.9.4 Yacc的错误恢复
练习
参考文献注释
第5章语法制导翻译
5.1语法制导定义
5.1.1语法制导定义的形式
5.1.2综合属性
5.1.3继承属性
5.1.4依赖图
5.1.5计算顺序
5.2语法树的构造
5.2.1语法树
5.2.2构造表达式的语法树
5.2.3构造语法树的语法制导定义
5.2.4表达式的无环有向图
5.3自底向上计算S属性定义
5.4 L属性定义
5.4.1 L属性定义
5.4.2翻译模式
5.5自顶向下翻译
5.5.1从翻译模式中消除左递归
5.5.2预测翻译器的设计
5.6自底向上计算继承属性
5.6.1删除嵌入在翻译模式中的动作
5.6.2分析栈中的继承属性
5.6.3模拟继承属性的计算
5.6.4用综合属性代替继承属性
5.6.5一个难计算的语法制导定义
5.7递归计算
5.7.1从左到右遍历
5.7.2其他遍历方法
5.8编译时属性值的空间分配
5.8.1在编译时为属性分配空间
5.8.2避免复制
5.9编译器构造时的空间分配
5.9.1从文法中预知生存期
5.9.2不相重叠的生存期
5.10语法制导定义的分析
5.10.1属性的递归计算
5.10.2强无环的语法制导定义
5.10.3环形检测
练习
参考文献注释
第6章类型检查
6.1类型系统
6.1.1类型表达式
6.1.2类型系统
6.1.3静态和动态类型检查
6.1.4错误恢复
6.2一个简单的类型检查器的说明
6.2.1一种简单语言
6.2.2表达式的类型检查
6.2.3语句的类型检查
6.2.4函数的类型检查
6.3类型表达式的等价
6.3.1类型表达式的结构等价
6.3.2类型表达式的名字
6.3.3类型表示中的环
6.4类型转换
6.5函数和运算符的重载
6.5.1子表达式的可能类型的集合
6.5.2缩小可能类型的集合
6.6多态函数
6.6.1为什么要使用多态函数
6.6.2类型变量
6.6.3包含多态函数的语言
6.6.4代换、实例和合一
6.6.5多态函数的检查
6.7合一算法
练习
参考文献注释
第7章运行时环境
7.1源语言问题
7.1.1过程
7.1.2活动树
7.1.3控制栈
7.1.4声明的作用域
7.1.5名字的绑定
7.1.6一些问题
7.2存储组织
7.2.1运行时内存的划分
7.2.2活动记录
7.2.3编译时的局部数据布局
7.3存储分配策略
7.3.1静态存储分配
7.3.2栈式存储分配
7.3.3悬空引用
7.3.4堆式存储分配
7.4对非局部名字的访问
7.4.1程序块
7.4.2无嵌套过程的词法作用域
7.4.3包含嵌套过程的词法作用域
7.4.4动态作用域
7.5参数传递
7.5.1传值调用
7.5.2引用调用
7.5.3复制-恢复
7.5.4传名调用
7.6符号表
7.6.1符号表表项
7.6.2名字中的字符
7.6.3存储分配信息
7.6.4符号表的线性表数据结构
7.6.5散列表
7.6.6表示作用域的信息
7.7支持动态存储分配的语言措施
7.7.1垃圾单元
7.7.2悬空引用
7.8动态存储分配技术
7.8.1固定块的显式分配
7.8.2变长块的显式分配
7.8.3隐式存储释放
7.9 Fortran语言的存储分配
7.9.1 COMMON域中的数据
7.9.2一个简单的等价算法
7.9.3 Fortran语言的等价算法
7.9.4映射数据区
练习
参考文献注释
第8章中间代码生成
8.1中间语言
8.1.1图表示
8.1.2三地址码
8.1.3三地址语句的类型
8.1.4语法制导翻译生成三地址码
8.1.5三地址语句的实现
8.1.6表示方法比较:间址的使用
8.2声明语句
8.2.1过程中的声明语句
8.2.2跟踪作用域信息
8.2.3记录中的域名
8.3赋值语句
8.3.1符号表中的名字
8.3.2临时名字的重用
8.3.3寻址数组元素
8.3.4数组元素寻址的翻译模式
8.3.5赋值语句中的类型转换
8.3.6记录域的访问
8.4布尔表达式
8.4.1翻译布尔表达式的方法
8.4.2数值表示
8.4.3短路代码
8.4.4控制流语句
8.4.5布尔表达式的控制流翻译
8.4.6混合模式的布尔表达式
8.5 case语句
8.6回填
8.6.1布尔表达式
8.6.2控制流语句
8.6.3翻译的实现方案
8.6.4标号和goto
8.7过程调用
8.7.1调用序列
8.7.2一个简单的例子
练习
参考文献注释
第9章代码生成
9.1代码生成器设计中的问题
9.1.1代码生成器的输入
9.1.2目标程序
9.1.3存储管理
9.1.4指令选择
9.1.5寄存器分配
9.1.6计算次序的选择
9.1.7代码生成方法
9.2目标机器
9.3运行时存储管理
9.3.1静态分配
9.3.2栈式分配
9.3.3名字的运行地址
9.4基本块和流图
9.4.1基本块
9.4.2基本块的变换
9.4.3保结构变换
9.4.4代数变换
9.4.5流图
9.4.6基本块的表示
9.4.7循环
9.5下次引用信息
9.5.1计算下次引用信息
9.5.2临时名字的存储分配
9.6一个简单的代码生成器
9.6.1寄存器描述符和地址描述符
9.6.2代码生成算法
9.6.3函数getreg
9.6.4为其他类型的语句生成代码
9.6.5条件语句
9.7寄存器分配与指派
9.7.1全局寄存器分配
9.7.2引用计数
9.7.3外层循环的寄存器指派
9.7.4图染色法寄存器分配
9.8基本块的dag表示法
9.8.1 dag的构造
9.8.2 dag的应用
9.8.3数组、指针和过程调用
9.9窥孔优化
9.9.1冗余加载与保存
9.9.2不可达代码
9.9.3控制流优化
9.9.4代数化简
9.9.5强度削弱
9.9.6机器语言的使用
9.10从dag生成代码
9.10.1重排序
9.10.2对dag的启发式排序
9.10.3树的最优排序
9.10.4标记算法
9.10.5从标记树中产生代码
9.10.6多寄存器操作
9.10.7代数性质
9.10.8公共子表达式
9.11动态规划代码生成算法
9.11.1一种寄存器计算机
9.11.2动态规划的原理
9.11.3邻近计算
9.11.4动态规划算法
9.12代码生成器的生成器
9.12.1采用重写树技术的代码生成
9.12.2借助语法分析的模式匹配
9.12.3用于语义检查的例程
练习
参考文献注释
第10章代码优化
10.1.1代码改进变换的准则
10.1.2性能的提高
10.1.3优化编译器的组织
10.2优化的主要种类
10.2.1保持功能变换
10.2.2公共子表达式
10.2.3复制传播
10.2.4无用代码删除
10.2.5循环优化
10.2.6代码外提
10.2.7归纳变量和强度削弱
10.3基本块的优化
10.4流图中的循环
10.4.1支配节点
10.4.2自然循环
10.4.3内循环
10.4.4前置首节点
10.4.5可约流图
10.5全局数据流分析介绍
10.5.1点和路径
10.5.2到达定义
10.5.3结构化程序的数据流分析
10.5.4对数据流信息的保守估计
10.5.5 in和out的计算
10.5.6处理循环
10.5.7集合的表示
10.5.8局部到达定义
10.5.9引用-定义链
10.5.10计算顺序
10.5.11一般控制流
10.6数据流方程的迭代解
10.6.1到达定义的迭代算法
10.6.2可用表达式
10.6.3活跃变量分析
10.6.4定义-引用链
10.7代码改进变换
10.7.1全局公共子表达式删除
10.7.2复制传播
10.7.3循环不变计算的检测
10.7.4代码外提
10.7.5可选的代码外提方案
10.7.6代码外提后对数据流信息的维护
10.7.7归纳变量删除
10.7.8带有循环不变表达式的归纳变量
10.8处理别名
10.8.1一种简单的指针语言
10.8.2指针赋值的作用
10.8.3利用指针信息
10.8.4过程间的数据流分析
10.8.5带有过程调用的代码模型
10.8.6别名的计算
10.8.7存在过程调用时的数据流分析
10.8.8 change信息的用途
10.9结构化流图的数据流分析
10.9.1深度优先搜索
10.9.2流图的深度优先表示中的边
10.9.3流图的深度
10.9.4区间
10.9.5区间划分
10.9.6区间图
10.9.7节点分裂
10.9.8 T1-T2分析
10.9.9区域
10.9.10寻找支配节点
10.10高效数据流算法
10.10.1迭代算法中的深度优先顺序
10.10.2基于结构的数据流分析
10.10.3对基于结构的算法的一些速度上的改进
10.10.4处理不可约流图
10.11一个数据流分析工具
10.11.1数据流分析框架
10.11.2数据流分析框架的公理
10.11.3单调性和分配性
10.11.4数据流问题的聚合路径解
10.11.5流问题的保守解
10.11.6通用框架的迭代算法
10.11.7一个数据流分析工具
10.11.8算法10.18的性质
10.11.9算法10.18的收敛性
10.11.10初始化的修正
10.12类型估计
10.12.1处理无穷类型集
10.12.2一个简单的类型系统
10.12.3前向方案
10.12.4后向方案
10.13优化代码的符号调试
10.13.1基本块中变量值的推断
10.13.2全局优化的影响
10.1 3.3归纳变量删除
10.13.4全局公共子表达式删除
10.13.5代码外提
练习
参考文献注释
第11章编写一个编译器
11.1编译器设计
11.1.1源语言问题
11.1.2目标语言问题
11.1.3性能标准
11.2编译器开发方法
11.3编译器开发环境
11.4测试与维护
第12章编译器实例
12.1数学排版预处理器EQN
12.2 Pascal编译器
12.3 C编译器
12.4 Fortran H编译器
12.4.1 Fortran H中的代码优化
12.4.2代数优化
12.4.3寄存器优化
12.5 BLISS/1 1编译器
12.6 Modula-2优化编译器
附录一个程序设计项目
参考文献
1.4.1预处理器
1.4.2汇编器
1.4.3两遍汇编
1.4.4装配器和连接编辑器
1.5编译器各阶段的分组
1.5.1前端与后端
1.5.2编译器的遍
1.5.3减少编译的遍数
1.6编译器的构造工具
参考文献注释
第2章简单的一遍编译器
2.1概述
2.2语法定义
2.2.1分析树
2.2.2二义性
2.2.3操作符的结合规则
2.2.4操作符的优先级
2.3语法制导翻译
2.3.1后缀表示
2.3.2语法制导定义
2.3.3综合属性
2.3.4深度优先遍历
2.3.5翻译模式
2.3.6翻译的输出
2.4语法分析
2.4.1自顶向下语法分析
2.4.2预测分析法
2.4.3何时使用∈产生式
2.4.4设计一个预测语法分析器
2.4.5左递归
2.5简单表达式的翻译器
2.5.1抽象语法和具体语法
2.5.2调整翻译模式
2.5.3非终结符expr、term和rest的过程
2.5.4翻译器的优化
2.5.5完整程序
2.6词法分析
2.6.1剔除空白符和注释
2.6.2常数
2.6.3识别标识符和关键字
2.6.4词法分析器的接口
2.6.5词法分析器
2.7符号表
2.7.1符号表接口
2.7.2处理保留的关键字
2.7.3符号表的实现方法
2.8抽象堆栈机
2.8.1算术指令
2.8.2左值和右值
2.8.3堆栈操作
2.8.4表达式的翻译
2.8.5控制流
2.8.6语句的翻译
2.8.7输出一个翻译
2.9技术的综合
2.9.1翻译器的描述
2.9.2词法分析器模块lexer.c
2.9.3语法分析器模块parser.c
2.9.4输出模块emitter.c
2.9.5符号表模块symbol.c和init.c
2.9.6错误处理模块error.c
2.9.7编译器的建立
2.9.8程序清单
练习
编程练习
参考文献注释
第3章词法分析
3.1词法分析器的作用
3.1.1词法分析中的问题
3.1.2记号、模式、词素
3.1.3记号的属性
3.1.4词法错误
3.2输入缓冲
3.2.1双缓冲区
3.2.2标志
3.3记号的描述
3.3.1串和语言
3.3.2语言上的运算
3.3.3正规表达式
3.3.4正规定义
3.3.5缩写表示法
3.3.6非正规集
3.4记号的识别
3.4.1状态转换图
3.4.2状态转换图的实现
3.5词法分析器描述语言
3.5.1 Lex说明
3.5.2超前扫描操作
3.6有穷自动机
3.6.1不确定的有穷自动机
3.6.2确定的有穷自动机
3.6.3从NFA到DFA的变换
3.7从正规表达式到NFA
3.7.1从正规表达式构造NFA
3.7.2 NFA的双堆栈模拟
3.7.3时间空间的权衡
3.8设计词法分析器的生成器
3.8.1基于NFA的模式匹配
3.8.2词法分析器的DFA
3.8.3实现超前扫描操作
3.9基于DFA的模式匹配器的优化
3.9.1 NFA的重要状态
3.9.2从正规表达式到DFA
3.9.3最小化DFA的状态数
3.9.4词法分析器的状态最小化
3.9.5表压缩方法
练习
编程练习
参考文献注释
第4章语法分析
4.1语法分析器的作用
4.1.1语法错误的处理
4.1.2错误恢复策略
4.2上下文无关文法
4.2.1符号的使用约定
4.2.2推导
4.2.3分析树和推导
4.2.4二义性
4.3文法的编写
4.3.1正规表达式和上下文无关文法的比较
4.3.2验证文法所产生的语言
4.3.3消除二义性
4.3.4消除左递归
4.3.5提取左因子
4.3.6非上下文无关语言的结构
4.4自顶向下语法分析
4.4.1递归下降语法分析法
4.4.2预测语法分析器
4.4.3预测语法分析器的状态转换图
4.4.4非递归的预测分析
4.4.5 FIRST和FOLLOW
4.4.6预测分析表的构造
4.4.7 LL(1)文法
4.4.8预测分析的错误恢复
4.5自底向上语法分析
4.5.1句柄
4.5.2句柄裁剪
4.5.3用栈实现移动归约分析
4.5.4活前缀
4.5.5移动归约分析过程中的冲突
4.6算符优先分析法
4.6.1使用算符优先关系
4.6.2从结合律和优先级获得算符优先关系
4.6.3处理一元操作符
4.6.4优先函数
4.6.5算符优先分析中的错误恢复
4.7 LR语法分析器
4.7.1 LR语法分析算法
4.7.2 LR文法
4.7.3构造SLR语法分析表
4.7.4构造规范LR语法分析表
4.7.5构造LALR语法分析表
4.7.6 LALR语法分析表的有效构造方法
4.7.7 LR语法分析表的压缩
4.8二义文法的应用
4.8.1使用优先级和结合规则来解决分析动作的冲突
4.8.2悬空else的二义性
4.8.3特例产生式引起的二义性
4.8.4LR语法分析中的错误恢复
4.9语法分析器的生成器
4.9.1语法分析器的生成器Yacc
4.9.2用Yacc处理二义文法
4.9.3用Lex建立Yacc的词法分析器
4.9.4 Yacc的错误恢复
练习
参考文献注释
第5章语法制导翻译
5.1语法制导定义
5.1.1语法制导定义的形式
5.1.2综合属性
5.1.3继承属性
5.1.4依赖图
5.1.5计算顺序
5.2语法树的构造
5.2.1语法树
5.2.2构造表达式的语法树
5.2.3构造语法树的语法制导定义
5.2.4表达式的无环有向图
5.3自底向上计算S属性定义
5.4 L属性定义
5.4.1 L属性定义
5.4.2翻译模式
5.5自顶向下翻译
5.5.1从翻译模式中消除左递归
5.5.2预测翻译器的设计
5.6自底向上计算继承属性
5.6.1删除嵌入在翻译模式中的动作
5.6.2分析栈中的继承属性
5.6.3模拟继承属性的计算
5.6.4用综合属性代替继承属性
5.6.5一个难计算的语法制导定义
5.7递归计算
5.7.1从左到右遍历
5.7.2其他遍历方法
5.8编译时属性值的空间分配
5.8.1在编译时为属性分配空间
5.8.2避免复制
5.9编译器构造时的空间分配
5.9.1从文法中预知生存期
5.9.2不相重叠的生存期
5.10语法制导定义的分析
5.10.1属性的递归计算
5.10.2强无环的语法制导定义
5.10.3环形检测
练习
参考文献注释
第6章类型检查
6.1类型系统
6.1.1类型表达式
6.1.2类型系统
6.1.3静态和动态类型检查
6.1.4错误恢复
6.2一个简单的类型检查器的说明
6.2.1一种简单语言
6.2.2表达式的类型检查
6.2.3语句的类型检查
6.2.4函数的类型检查
6.3类型表达式的等价
6.3.1类型表达式的结构等价
6.3.2类型表达式的名字
6.3.3类型表示中的环
6.4类型转换
6.5函数和运算符的重载
6.5.1子表达式的可能类型的集合
6.5.2缩小可能类型的集合
6.6多态函数
6.6.1为什么要使用多态函数
6.6.2类型变量
6.6.3包含多态函数的语言
6.6.4代换、实例和合一
6.6.5多态函数的检查
6.7合一算法
练习
参考文献注释
第7章运行时环境
7.1源语言问题
7.1.1过程
7.1.2活动树
7.1.3控制栈
7.1.4声明的作用域
7.1.5名字的绑定
7.1.6一些问题
7.2存储组织
7.2.1运行时内存的划分
7.2.2活动记录
7.2.3编译时的局部数据布局
7.3存储分配策略
7.3.1静态存储分配
7.3.2栈式存储分配
7.3.3悬空引用
7.3.4堆式存储分配
7.4对非局部名字的访问
7.4.1程序块
7.4.2无嵌套过程的词法作用域
7.4.3包含嵌套过程的词法作用域
7.4.4动态作用域
7.5参数传递
7.5.1传值调用
7.5.2引用调用
7.5.3复制-恢复
7.5.4传名调用
7.6符号表
7.6.1符号表表项
7.6.2名字中的字符
7.6.3存储分配信息
7.6.4符号表的线性表数据结构
7.6.5散列表
7.6.6表示作用域的信息
7.7支持动态存储分配的语言措施
7.7.1垃圾单元
7.7.2悬空引用
7.8动态存储分配技术
7.8.1固定块的显式分配
7.8.2变长块的显式分配
7.8.3隐式存储释放
7.9 Fortran语言的存储分配
7.9.1 COMMON域中的数据
7.9.2一个简单的等价算法
7.9.3 Fortran语言的等价算法
7.9.4映射数据区
练习
参考文献注释
第8章中间代码生成
8.1中间语言
8.1.1图表示
8.1.2三地址码
8.1.3三地址语句的类型
8.1.4语法制导翻译生成三地址码
8.1.5三地址语句的实现
8.1.6表示方法比较:间址的使用
8.2声明语句
8.2.1过程中的声明语句
8.2.2跟踪作用域信息
8.2.3记录中的域名
8.3赋值语句
8.3.1符号表中的名字
8.3.2临时名字的重用
8.3.3寻址数组元素
8.3.4数组元素寻址的翻译模式
8.3.5赋值语句中的类型转换
8.3.6记录域的访问
8.4布尔表达式
8.4.1翻译布尔表达式的方法
8.4.2数值表示
8.4.3短路代码
8.4.4控制流语句
8.4.5布尔表达式的控制流翻译
8.4.6混合模式的布尔表达式
8.5 case语句
8.6回填
8.6.1布尔表达式
8.6.2控制流语句
8.6.3翻译的实现方案
8.6.4标号和goto
8.7过程调用
8.7.1调用序列
8.7.2一个简单的例子
练习
参考文献注释
第9章代码生成
9.1代码生成器设计中的问题
9.1.1代码生成器的输入
9.1.2目标程序
9.1.3存储管理
9.1.4指令选择
9.1.5寄存器分配
9.1.6计算次序的选择
9.1.7代码生成方法
9.2目标机器
9.3运行时存储管理
9.3.1静态分配
9.3.2栈式分配
9.3.3名字的运行地址
9.4基本块和流图
9.4.1基本块
9.4.2基本块的变换
9.4.3保结构变换
9.4.4代数变换
9.4.5流图
9.4.6基本块的表示
9.4.7循环
9.5下次引用信息
9.5.1计算下次引用信息
9.5.2临时名字的存储分配
9.6一个简单的代码生成器
9.6.1寄存器描述符和地址描述符
9.6.2代码生成算法
9.6.3函数getreg
9.6.4为其他类型的语句生成代码
9.6.5条件语句
9.7寄存器分配与指派
9.7.1全局寄存器分配
9.7.2引用计数
9.7.3外层循环的寄存器指派
9.7.4图染色法寄存器分配
9.8基本块的dag表示法
9.8.1 dag的构造
9.8.2 dag的应用
9.8.3数组、指针和过程调用
9.9窥孔优化
9.9.1冗余加载与保存
9.9.2不可达代码
9.9.3控制流优化
9.9.4代数化简
9.9.5强度削弱
9.9.6机器语言的使用
9.10从dag生成代码
9.10.1重排序
9.10.2对dag的启发式排序
9.10.3树的最优排序
9.10.4标记算法
9.10.5从标记树中产生代码
9.10.6多寄存器操作
9.10.7代数性质
9.10.8公共子表达式
9.11动态规划代码生成算法
9.11.1一种寄存器计算机
9.11.2动态规划的原理
9.11.3邻近计算
9.11.4动态规划算法
9.12代码生成器的生成器
9.12.1采用重写树技术的代码生成
9.12.2借助语法分析的模式匹配
9.12.3用于语义检查的例程
练习
参考文献注释
第10章代码优化
10.1.1代码改进变换的准则
10.1.2性能的提高
10.1.3优化编译器的组织
10.2优化的主要种类
10.2.1保持功能变换
10.2.2公共子表达式
10.2.3复制传播
10.2.4无用代码删除
10.2.5循环优化
10.2.6代码外提
10.2.7归纳变量和强度削弱
10.3基本块的优化
10.4流图中的循环
10.4.1支配节点
10.4.2自然循环
10.4.3内循环
10.4.4前置首节点
10.4.5可约流图
10.5全局数据流分析介绍
10.5.1点和路径
10.5.2到达定义
10.5.3结构化程序的数据流分析
10.5.4对数据流信息的保守估计
10.5.5 in和out的计算
10.5.6处理循环
10.5.7集合的表示
10.5.8局部到达定义
10.5.9引用-定义链
10.5.10计算顺序
10.5.11一般控制流
10.6数据流方程的迭代解
10.6.1到达定义的迭代算法
10.6.2可用表达式
10.6.3活跃变量分析
10.6.4定义-引用链
10.7代码改进变换
10.7.1全局公共子表达式删除
10.7.2复制传播
10.7.3循环不变计算的检测
10.7.4代码外提
10.7.5可选的代码外提方案
10.7.6代码外提后对数据流信息的维护
10.7.7归纳变量删除
10.7.8带有循环不变表达式的归纳变量
10.8处理别名
10.8.1一种简单的指针语言
10.8.2指针赋值的作用
10.8.3利用指针信息
10.8.4过程间的数据流分析
10.8.5带有过程调用的代码模型
10.8.6别名的计算
10.8.7存在过程调用时的数据流分析
10.8.8 change信息的用途
10.9结构化流图的数据流分析
10.9.1深度优先搜索
10.9.2流图的深度优先表示中的边
10.9.3流图的深度
10.9.4区间
10.9.5区间划分
10.9.6区间图
10.9.7节点分裂
10.9.8 T1-T2分析
10.9.9区域
10.9.10寻找支配节点
10.10高效数据流算法
10.10.1迭代算法中的深度优先顺序
10.10.2基于结构的数据流分析
10.10.3对基于结构的算法的一些速度上的改进
10.10.4处理不可约流图
10.11一个数据流分析工具
10.11.1数据流分析框架
10.11.2数据流分析框架的公理
10.11.3单调性和分配性
10.11.4数据流问题的聚合路径解
10.11.5流问题的保守解
10.11.6通用框架的迭代算法
10.11.7一个数据流分析工具
10.11.8算法10.18的性质
10.11.9算法10.18的收敛性
10.11.10初始化的修正
10.12类型估计
10.12.1处理无穷类型集
10.12.2一个简单的类型系统
10.12.3前向方案
10.12.4后向方案
10.13优化代码的符号调试
10.13.1基本块中变量值的推断
10.13.2全局优化的影响
10.1 3.3归纳变量删除
10.13.4全局公共子表达式删除
10.13.5代码外提
练习
参考文献注释
第11章编写一个编译器
11.1编译器设计
11.1.1源语言问题
11.1.2目标语言问题
11.1.3性能标准
11.2编译器开发方法
11.3编译器开发环境
11.4测试与维护
第12章编译器实例
12.1数学排版预处理器EQN
12.2 Pascal编译器
12.3 C编译器
12.4 Fortran H编译器
12.4.1 Fortran H中的代码优化
12.4.2代数优化
12.4.3寄存器优化
12.5 BLISS/1 1编译器
12.6 Modula-2优化编译器
附录一个程序设计项目
参考文献
重要申明:
本书由书友@锦小书发布分享,仅供学习交流使用,版权归原作者所有。如有侵权,请联系我们删除。
本书由书友@锦小书发布分享,仅供学习交流使用,版权归原作者所有。如有侵权,请联系我们删除。
📖 支持知识自由流动
每一本书的稳定访问,都离不开服务器、存储与带宽的长期维护。

