本书围绕编译程序分析、设计和实现方面的主题,介绍上下文无关文法、有限自动机的基础知识,以及构造程序设计语言编译程序的一般原理、设计方法和实现技术,包括词法分析、语法分析、语义分析、中间代码生成、目标代码生成、运行时刻环境和代码优化;设计了一个案例语言,给出该语言翻译器的分析、设计和实现的完整过程;介绍了开源编译器GCC的逻辑结构、典型中间代码形式和存储管理策略,也围绕目标文件介绍了汇编和链接。
样章试读
目录
- 目录
第1章 引论 1
1.1 编译器 1
1.2 编译器的结构 2
1.2.1 词法分析 3
1.2.2 语法分析 3
1.2.3 语义分析 4
1.2.4 中间代码生成 4
1.2.5 代码优化 5
1.2.6 目标代码生成 5
1.2.7 编译器的组织 5
1.3 GCC概述 6
1.3.1 GCC的语言处理过程 6
1.3.2 GCC的逻辑结构 7
1.4 编译程序的发展 8
1.4.1 程序设计语言的发展 8
1.4.2 编译技术的发展 8
习题 9
第2章 上下文无关文法和分析 10
2.1 概述 10
2.2 符号串及运算 11
2.3 文法 12
2.3.1 上下文无关文法的定义 12
2.3.2 推导和归约 13
2.3.3 文法定义的语言 14
2.3.4 文法的分类 15
2.3.5 文法在应用中的说明 17
2.4 语法树 18
2.4.1 语法树的定义 18
2.4.2 文法的二义性 20
2.4.3 短语和句柄 21
习题 22
第3章 词法分析 25
3.1 正规表达式 25
3.2 有限自动机 26
3.2.1 确定的有限自动机 27
3.2.2 非确定的有限自动机 28
3.2.3 含e的非确定的有限自动机 28
3.2.4 非确定有限自动机的确定化 29
3.2.5 确定有限自动机的最小化 31
3.3 正规表达式和有限自动机 32
3.3.1 从正规表达式到有限自动机 32
3.3.2 从有限自动机到正规表达式 33
3.4 有限自动机和正规文法 35
3.5 词法分析程序 36
3.5.1 DFA的实现 36
3.5.2 词法分析程序实现应考虑的问题 37
习题 39
第4章 语法分析 42
4.1 自顶向下的语法分析 42
4.1.1 确定的自顶向下语法分析 42
4.1.2 LL(1)文法 46
4.1.3 左递归和左公因子的消除 49
4.1.4 递归下降的语法分析 51
4.1.5 表驱动的语法分析 53
4.2 自底向上的语法分析 55
4.2.1 移进-归约的语法分析 55
4.2.2 LR语法分析 57
4.2.3 项目和项目集 60
4.2.4 LR(0)分析表构造 62
4.2.5 SLR(1)分析表构造 64
4.2.6 LR(1)分析表构造 66
4.2.7 LALR(1)分析表构造 68
4.3 语法错误的恢复 71
4.3.1 递归下降分析中的语法错误的恢复 71
4.3.2 LL分析中的语法错误的恢复 73
4.3.3 LR语法分析中的语法错误的恢复 74
习题 75
第5章 语义分析 77
5.1 语义分析概述 77
5.2 属性文法 78
5.2.1 属性文法及相关概念 78
5.2.2 语法制导定义 80
5.3 属性计算 81
5.3.1 依赖图 81
5.3.2 属性的计算顺序 83
5.3.3 S属性和L属性的语法制导定义 83
5.4 语法制导翻译 85
5.4.1 自顶向下语法分析中属性计算 85
5.4.2 自底向上语法分析中综合属性计算 92
5.4.3 自底向上语法分析中继承属性计算 94
5.5 符号表 98
5.5.1 符号表的作用 98
5.5.2 符号的属性和存储方法 99
5.5.3 符号表的设计 103
5.5.4 符号表的管理 105
5.5.5 嵌套作用域的管理 105
5.6 声明 109
5.7 类型检查 110
5.7.1 类型表达式 110
5.7.2 类型检查规则 112
5.7.3 类型转换 112
习题 113
第6章 中间代码生成 119
6.1 中间代码概述 119
6.1.1 线性中间代码 119
6.1.2 树型中间代码 121
6.1.3 图式中间代码 121
6.2 赋值语句的翻译 122
6.2.1 简单赋值语句的翻译 123
6.2.2 数组引用的翻译 125
6.3 布尔表达式的翻译 127
6.3.1 直接对布尔表达式求值 128
6.3.2 通过控制流翻译布尔表达式 129
6.4 典型控制结构的翻译 132
6.5 GCC的中间代码 134
6.5.1 GENERIC 134
6.5.2 GIMPLE 135
6.5.3 RTL 136
习题 137
第7章 运行时刻环境 139
7.1 存储组织 139
7.1.1 程序运行时的内存映像 139
7.1.2 存储分配策略 139
7.2 活动记录 141
7.2.1 活动记录的一般结构 141
7.2.2 变长数据的分配 143
7.3 基于栈的过程管理 143
7.3.1 过程调用和返回 143
7.3.2 过程间的值传递 145
7.4 非局部变量的访问 147
7.4.1 无嵌套过程的非局部变量 148
7.4.2 过程嵌套定义的非局部变量 148
7.5 GCC的存储管理策略 151
7.5.1 程序运行时的内存映像 151
7.5.2 x86-64栈结构 152
7.5.3 函数和参数 153
习题 156
第8章 代码优化 160
8.1 基本块和流图 160
8.1.1 基本块 160
8.1.2 流图 161
8.1.3 循环 161
8.2 数据流分析 163
8.2.1 数据流分析模式 163
8.2.2 到达定值分析 163
8.2.3 活跃变量分析 166
8.2.4 可用表达式分析 167
8.3 窥孔优化 170
8.4 基本块的优化 171
8.4.1 基本块的有向无环图表示 172
8.4.2 基于DAG的代码重建 175
8.5 循环优化 175
8.5.1 代码外提 175
8.5.2 归纳变量相关的优化 178
习题 179
第9章 目标代码生成 182
9.1 代码生成的主要问题 182
9.1.1 指令选择 182
9.1.2 寄存器分配 183
9.1.3 指令调度 183
9.2 一个简单的代码生成器 184
9.2.1 目标语言 184
9.2.2 一个目标代码生成算法 186
9.2.3 表达式优化代码的生成 189
9.3 基于图着色的寄存器分配 191
9.4 目标文件 192
9.4.1 目标文件格式 193
9.4.2 汇编 195
9.4.3 链接 197
习题 199
第10章 简单语言的翻译程序 202
10.1 源语言及其定义 202
10.1.1 语法定义 202
10.1.2 其他约束 204
10.2 词法分析的实现 205
10.2.1 词法记号 205
10.2.2 词法单元的定义 206
10.2.3 单词的识别 206
10.3 语法分析的实现 208
10.3.1 文法的分析和变换 208
10.3.2 递归下降的语法分析程序 209
10.4 符号表的实现 210
10.4.1 符号表的设计 210
10.4.2 符号表的管理 212
10.5 中间代码生成 213
10.5.1 中间代码的定义 214
10.5.2 生成中间代码的构造 215
10.5.3 中间代码生成和优化 220
10.6 目标代码生成 221
10.6.1 虚拟目标机 221
10.6.2 运行时刻环境 223
10.6.3 从中间代码到目标代码的转换 224
10.6.4 虚拟机解释程序 225
10.7 课程设计 226
参考文献 229