译者序
前言
第1章 预备知识
1.1 抽象语法树
1.2 语法
1.3 模式匹配
1.4 递归函数
1.5 解释器
1.6 编译器示例:部分求值器
第2章 整数与变量
2.1 LVar语言
2.1.1 通过方法覆盖来扩展解释器
2.1.2 LVar的定义性解释器
2.2 x86Int汇编语言
2.3 规划x86汇编之旅
2.4 移除复杂操作数
2.5 选择指令
2.6 分配变量存储
2.7 修补指令
2.8 生成起始和收尾代码
2.9 挑战:LVar的部分求值器
第3章 语法分析
3.1 词法分析和正则表达式
3.2 文法和解析树
3.3 二义性文法
3.4 从解析树到抽象语法树
3.5 Earley算法
3.6 LALR(1)算法
3.7 进一步阅读
第4章 寄存器分配
4.1 寄存器和调用约定
4.2 活跃性分析
4.3 构建干涉图
4.4 利用数独进行图着色
4.5 修补指令
4.6 生成起始和收尾代码
4.7 挑战:传送偏置
4.8 进一步阅读
第5章 布尔值和条件表达式
5.1 LIf语言
5.2 LIf程序的类型检查
5.3 CIf中间语言
5.4 x86If语言
5.5 收缩LIf语言
5.6 移除复杂操作数
5.7 详细控制
5.8 选择指令
5.9 寄存器分配
5.9.1 活跃性分析
5.9.2 构建干涉图
5.10 修补指令
5.11 生成起始和收尾代码
5.12 挑战:优化块和移除跳转
5.12.1 优化块
5.12.2 移除跳转
5.13 进一步阅读
第6章 循环和数据流分析
6.1 LWhile语言
6.2 循环控制流和数据流分析
6.3 移除复杂操作数
6.4 详细控制
6.5 寄存器分配
第7章 元组和垃圾回收
7.1 LTup语言
7.2 垃圾回收
7.2.1 双空间复制收集器
7.2.2 通过Cheney算法进行图的复制
7.2.3 数据表示
7.2.4 垃圾回收器的实现
7.3 显露分配
7.4 移除复杂操作数
7.5 详细控制和CTup语言
7.6 选择指令和x86Global语言
7.7 寄存器分配
7.8 生成起始和收尾代码
7.9 挑战:数组
7.9.1 数据表示
7.9.2 重载解析
7.9.3 边界检查
7.9.4 显露分配
7.9.5 移除复杂操作数
7.9.6 详细控制
7.9.7 选择指令
7.10 进一步阅读
第8章 函数
8.1 LFun语言
8.2 x86汇编下的函数
8.2.1 调用约定
8.2.2 高效的尾调用
8.3 收缩LFun语言
8.4 揭示函数和LFunRef语言
8.5 限制函数
8.6 移除复杂操作数
8.7 详细控制和CFun语言
8.8 选择指令和语言
8.9 寄存器分配
8.9.1 活跃性分析
8.9.2 构建干涉图
8.9.3 分配寄存器
8.10 修补指令
8.11 生成起始和收尾代码
8.12 翻译举例
第9章 词法作用域函数
9.1 Lλ语言
9.2 赋值和词法作用域函数
9.3 唯一化变量
9.4 赋值转换
9.5 闭包转换
9.6 显露分配
9.7 详细控制和CClos
9.8 选择指令
9.9 挑战:优化闭包
9.10 进一步阅读
第10章 动态类型
10.1 LDyn语言
10.2 标记值的表示
10.3 LAny语言
10.4 强制转换插入:编译LDyn为LAny
10.5 揭示强制转换
10.6 赋值转换
10.7 闭包转换
10.8 移除复杂操作数
10.9 详细控制和CAny
10.10 选择指令
10.11 LAny语言的寄存器分配
第11章 渐变类型
11.1 类型检查L?
11.2 解释LCast
11.3 重载解析
11.4 插入强制转换
11.5 低层类型转换
11.6 区分代理
11.7 揭示强制转换
11.8 闭包转换
11.9 选择指令
11.10 进一步阅读
第12章 泛型
12.1 编译泛型
12.2 解析实例化
12.3 擦除泛型类型
附录 x86指令集快速参考
参考文献
展开