编译器设计实战:基于Racket的增量式设计 / 计算机科学丛书
定价:¥89.00
作者: [美]杰里米·G. 希克(Jeremy G. Siek)
出版时间:2025-10-23
出版社:机械工业出版社
- 机械工业出版社
- 9787111791027
- 1-1
- 2025-10-23
- 256
内容简介
本书将带领读者使用Racket语言动手构建编译器,通过循序渐进的方法,在设计和实现编译器的过程中了解基本概念、算法和数据结构等相关知识。本书将每章作为构建编译器的一个基本“步骤”,逐步为编译器添加功能。全书涵盖变量、寄存器、条件、循环、元组、函数、动态类型、通用类型等内容。本书适合作为高等院校编译原理等课程的教材,也适合相关技术人员参考。
目录
目 录
Essentials of Compilation: An Incremental Approach in Racket
译者序
前言
第1章 预备知识 1
1.1 抽象语法树 1
1.2 语法 3
1.3 模式匹配 5
1.4 递归函数 6
1.5 解释器 7
1.6 编译器示例:部分求值器 9
第2章 整数与变量 11
2.1 LVar语言 11
2.1.1 通过方法覆盖来扩展解释器 12
2.1.2 LVar语言的定义性解释器 14
2.2 x86Int汇编语言 16
2.3 规划x86汇编语言之旅 19
2.4 唯一化变量 23
2.5 移除复杂操作数 24
2.6 详细控制 26
2.7 选择指令 28
2.8 分配变量存储 29
2.9 修补指令 30
2.10 生成起始和收尾代码 31
2.11 挑战:LVar的部分求值器 31
第3章 寄存器分配 33
3.1 寄存器和调用约定 34
3.2 活跃性分析 36
3.3 构建干涉图 39
3.4 利用数独进行图着色 41
3.5 修补指令 46
3.6 起始和收尾代码 47
3.7 挑战:传送偏置 49
3.8 延伸阅读 52
第4章 布尔值和条件表达式 54
4.1 LIf语言 55
4.2 LIf程序的类型检查 57
4.3 CIf中间语言 60
4.4 x86If语言 61
4.5 收缩LIf语言 63
4.6 唯一化变量 63
4.7 移除复杂操作数 63
4.8 详细控制 64
4.8.1 详细尾部和赋值处理 67
4.8.2 创建块 67
4.8.3 谓词详细处理 68
4.8.4 详细控制和收缩之间的相互
作用 70
4.9 选择指令 71
4.10 寄存器分配 72
4.10.1 活跃性分析 72
4.10.2 构建干涉图 73
4.11 修补指令 73
4.12 挑战:优化块和去除跳转 75
4.12.1 优化块 75
4.12.2 去除跳转 77
4.13 延伸阅读 78
第5章 循环和数据流分析 79
5.1 LWhile语言 79
5.2 循环控制流和数据流分析 82
5.3 可变变量和移除复杂操作数 85
5.4 揭示get! 87
5.5 移除复杂操作数 88
5.6 详细控制和C? 89
5.7 选择指令 90
5.8 寄存器分配 91
第6章 元组和垃圾回收 92
6.1 LTup语言 92
6.2 垃圾回收 96
6.2.1 双空间复制收集器 97
6.2.2 通过Cheney算法进行图复制 98
6.2.3 数据表示 99
6.2.4 垃圾回收器的实现 101
6.3 显露分配 102
6.4 移除复杂操作数 103
6.5 详细控制和CTup语言 104
6.6 选择指令和x86Global语言 105
6.7 寄存器分配 109
6.8 起始和收尾代码 109
6.9 挑战:简单结构 110
6.10 挑战:数组 112
6.10.1 数据表示 115
6.10.2 重载解析 116
6.10.3 边界检查 116
6.10.4 显露分配 116
6.11 揭示get! 117
6.11.1 移除复杂操作数 117
6.11.2 详细控制 117
6.11.3 选择指令 117
6.12 挑战:分代收集 117
6.13 延伸阅读 119
第7章 函数 120
7.1 LFun语言 120
7.2 x86汇编下的函数 124
7.2.1 调用约定 124
7.2.2 高效尾调用 126
7.3 收缩LFun语言 127
7.4 揭示函数和LFunRef语言 127
7.5 限制函数 127
7.6 移除复杂操作数 128
7.7 详细控制和CFun语言 129
7.8 选择指令和语言 130
7.9 寄存器分配 133
7.9.1 活跃性分析 133
7.9.2 构建干涉图 133
7.9.3 分配寄存器 133
7.10 修补指令 134
7.11 起始和收尾代码 134
7.12 转换举例 135
第8章 词法作用域函数 137
8.1 Lλ语言 139
8.2 赋值和词法作用域函数 141
8.3 赋值转换 142
8.4 闭包转换 144
8.5 转换举例 146
8.6 显露分配 146
8.7 详细控制和CClos语言 147
8.8 选择指令 147
8.9 挑战:优化闭包 148
8.10 延伸阅读 151
第9章 动态类型 152
9.1 LDyn语言 152
9.2 标记值的表示 156
9.3 LAny语言 156
9.4 强制转换插入:编译LDyn为LAny 160
9.5 揭示强制转换 161
9.6 移除复杂操作数 162
9.7 详细控制和CAny 162
9.8 选择指令 163
9.9 LAny的寄存器分配 166
第10章 渐变类型 168
10.1 类型检查L? 169
10.2 解释LCast 174
10.3 插入强制转换 178
10.4 低层类型转换 179
10.5 区分代理 180
10.6 揭示强制转换 182
10.7 闭包转换 183
10.8 选择指令 183
10.9 延伸阅读 186
第11章 泛型 187
11.1 编译泛型 192
11.2 解析实例化 193
11.3 擦除泛型类型 194
附 录 197
参考文献 200
Essentials of Compilation: An Incremental Approach in Racket
译者序
前言
第1章 预备知识 1
1.1 抽象语法树 1
1.2 语法 3
1.3 模式匹配 5
1.4 递归函数 6
1.5 解释器 7
1.6 编译器示例:部分求值器 9
第2章 整数与变量 11
2.1 LVar语言 11
2.1.1 通过方法覆盖来扩展解释器 12
2.1.2 LVar语言的定义性解释器 14
2.2 x86Int汇编语言 16
2.3 规划x86汇编语言之旅 19
2.4 唯一化变量 23
2.5 移除复杂操作数 24
2.6 详细控制 26
2.7 选择指令 28
2.8 分配变量存储 29
2.9 修补指令 30
2.10 生成起始和收尾代码 31
2.11 挑战:LVar的部分求值器 31
第3章 寄存器分配 33
3.1 寄存器和调用约定 34
3.2 活跃性分析 36
3.3 构建干涉图 39
3.4 利用数独进行图着色 41
3.5 修补指令 46
3.6 起始和收尾代码 47
3.7 挑战:传送偏置 49
3.8 延伸阅读 52
第4章 布尔值和条件表达式 54
4.1 LIf语言 55
4.2 LIf程序的类型检查 57
4.3 CIf中间语言 60
4.4 x86If语言 61
4.5 收缩LIf语言 63
4.6 唯一化变量 63
4.7 移除复杂操作数 63
4.8 详细控制 64
4.8.1 详细尾部和赋值处理 67
4.8.2 创建块 67
4.8.3 谓词详细处理 68
4.8.4 详细控制和收缩之间的相互
作用 70
4.9 选择指令 71
4.10 寄存器分配 72
4.10.1 活跃性分析 72
4.10.2 构建干涉图 73
4.11 修补指令 73
4.12 挑战:优化块和去除跳转 75
4.12.1 优化块 75
4.12.2 去除跳转 77
4.13 延伸阅读 78
第5章 循环和数据流分析 79
5.1 LWhile语言 79
5.2 循环控制流和数据流分析 82
5.3 可变变量和移除复杂操作数 85
5.4 揭示get! 87
5.5 移除复杂操作数 88
5.6 详细控制和C? 89
5.7 选择指令 90
5.8 寄存器分配 91
第6章 元组和垃圾回收 92
6.1 LTup语言 92
6.2 垃圾回收 96
6.2.1 双空间复制收集器 97
6.2.2 通过Cheney算法进行图复制 98
6.2.3 数据表示 99
6.2.4 垃圾回收器的实现 101
6.3 显露分配 102
6.4 移除复杂操作数 103
6.5 详细控制和CTup语言 104
6.6 选择指令和x86Global语言 105
6.7 寄存器分配 109
6.8 起始和收尾代码 109
6.9 挑战:简单结构 110
6.10 挑战:数组 112
6.10.1 数据表示 115
6.10.2 重载解析 116
6.10.3 边界检查 116
6.10.4 显露分配 116
6.11 揭示get! 117
6.11.1 移除复杂操作数 117
6.11.2 详细控制 117
6.11.3 选择指令 117
6.12 挑战:分代收集 117
6.13 延伸阅读 119
第7章 函数 120
7.1 LFun语言 120
7.2 x86汇编下的函数 124
7.2.1 调用约定 124
7.2.2 高效尾调用 126
7.3 收缩LFun语言 127
7.4 揭示函数和LFunRef语言 127
7.5 限制函数 127
7.6 移除复杂操作数 128
7.7 详细控制和CFun语言 129
7.8 选择指令和语言 130
7.9 寄存器分配 133
7.9.1 活跃性分析 133
7.9.2 构建干涉图 133
7.9.3 分配寄存器 133
7.10 修补指令 134
7.11 起始和收尾代码 134
7.12 转换举例 135
第8章 词法作用域函数 137
8.1 Lλ语言 139
8.2 赋值和词法作用域函数 141
8.3 赋值转换 142
8.4 闭包转换 144
8.5 转换举例 146
8.6 显露分配 146
8.7 详细控制和CClos语言 147
8.8 选择指令 147
8.9 挑战:优化闭包 148
8.10 延伸阅读 151
第9章 动态类型 152
9.1 LDyn语言 152
9.2 标记值的表示 156
9.3 LAny语言 156
9.4 强制转换插入:编译LDyn为LAny 160
9.5 揭示强制转换 161
9.6 移除复杂操作数 162
9.7 详细控制和CAny 162
9.8 选择指令 163
9.9 LAny的寄存器分配 166
第10章 渐变类型 168
10.1 类型检查L? 169
10.2 解释LCast 174
10.3 插入强制转换 178
10.4 低层类型转换 179
10.5 区分代理 180
10.6 揭示强制转换 182
10.7 闭包转换 183
10.8 选择指令 183
10.9 延伸阅读 186
第11章 泛型 187
11.1 编译泛型 192
11.2 解析实例化 193
11.3 擦除泛型类型 194
附 录 197
参考文献 200












