内容介绍
本书将带领读者使用Python语言动手构建编译器,通过循序渐进的方法,在设计和实现编译器的过程中了解基本概念、算法和数据结构等相关知识。本书将每章作为构建编译器的一个基本“步骤”,逐步为编译器添加功能。全书涵盖变量、寄存器、条件、循环、元组、函数、动态类型、通用类型等内容。本书适合作为高等院校编译原理等课程的教材,也适合相关技术人员参考。
编译器设计实战:基于PYTHON的增量式设计
编译器向来被视为最难教授和理解的程序之一。大多数编译书籍按阶段逐章讲解,这种结构掩盖了语言特性如何驱动设计选择的逻辑。相比之下,这本创新教材采用增量式方法,让学生能够亲自编写每一行代码。书中引导读者为一种小型但功能强大的编程语言构建自己的编译器,并随着章节推进逐步添加复杂的语言特性。作者阐释了现代编译器背后的核心概念、算法和数据结构,为读者学习后续高级主题奠定了基础。 本书特色: 将编译器构建的复杂挑战分解为易于掌握的小块内容。 通过将语言特性与编译器设计选择联系起来,增强学习效果。 采用“做中学”方法,加深读者对程序如何映射到计算机硬件的理解。 经过课堂验证,在GitHub上配有源代码。
目录
●译者序
前言
第1章 预备知识 1
1.1 抽象语法树 1
1.2 语法 3
1.3 模式匹配 5
1.4 递归函数 6
1.5 解释器 7
1.6 编译器示例:部分求值器 10
第2章 整数与变量 12
2.1 LVar语言 12
2.1.1 通过方法覆盖来扩展解释器 13
2.1.2 LVar的定义性解释器 14
2.2 x86Int汇编语言 16
2.3 规划x86汇编之旅 20
2.4 移除复杂操作数 21
2.5 选择指令 23
2.6 分配变量存储 24
2.7 修补指令 25
2.8 生成起始和收尾代码 26
2.9 挑战:LVar的部分求值器 26
第3章 语法分析 28
3.1 词法分析和正则表达式 28
3.2 文法和解析树 30
3.3 二义性文法 32
3.4 从解析树到抽象语法树 33
3.5 Earley算法 34
3.6 LALR(1)算法 39
3.7 进一步阅读 42
第4章 寄存器分配 43
4.1 寄存器和调用约定 44
4.2 活跃性分析 46
4.3 构建干涉图 49
4.4 利用数独进行图着色 50
4.5 修补指令 55
4.6 生成起始和收尾代码 56
4.7 挑战:传送偏置 57
4.8 进一步阅读 59
第5章 布尔值和条件表达式 61
5.1 LIf语言 62
5.2 LIf 程序的类型检查 64
5.3 CIf中间语言 67
5.4 x86If 语言 68
5.5 收缩LIf语言 70
5.6 移除复杂操作数 70
5.7 详细控制 71
5.8 选择指令 77
5.9 寄存器分配 78
5.9.1 活跃性分析 78
5.9.2 构建干涉图 79
5.10 修补指令 79
5.11 生成起始和收尾代码 79
5.12 挑战:优化块和移除跳转 81
5.12.1 优化块 81
5.12.2 移除跳转 82
5.13 进一步阅读 83
第6章 循环和数据流分析 84
6.1 LWhile语言 84
6.2 循环控制流和数据流分析 86
6.3 移除复杂操作数 89
6.4 详细控制 89
6.5 寄存器分配 90
第7章 元组和垃圾回收 91
7.1 LTup语言 91
7.2 垃圾回收 94
7.2.1 双空间复制收集器 94
7.2.2 通过Cheney算法进行图的复制 96
7.2.3 数据表示 97
7.2.4 垃圾回收器的实现 98
7.3 显露分配 99
7.4 移除复杂操作数 101
7.5 详细控制和CTup语言 101
7.6 选择指令和x86Global语言 102
7.7 寄存器分配 106
7.8 生成起始和收尾代码 106
7.9 挑战:数组 107
7.9.1 数据表示 110
7.9.2 重载解析 111
7.9.3 边界检查 111
7.9.4 显露分配 111
7.9.5 移除复杂操作数 112
7.9.6 详细控制 112
7.9.7 选择指令 112
7.10 进一步阅读 112
第8章 函数 114
8.1 LFun语言 114
8.2 x86汇编下的函数 118
8.2.1 调用约定 118
8.2.2 高效的尾调用 120
8.3 收缩LFun语言 121
8.4 揭示函数和LFunRef语言 121
8.5 函数 122
8.6 移除复杂操作数 122
8.7 详细控制和CFun语言 123
8.8 选择指令和语言 124
8.9 寄存器分配 126
8.9.1 活跃性分析 127
8.9.2 构建干涉图 127
8.9.3 分配寄存器 127
8.10 修补指令 127
8.11 生成起始和收尾代码 128
8.12 翻译举例 129
第9章 词法作用域函数 131
9.1 Lλ语言 132
9.2 赋值和词法作用域函数 136
9.3 专享化变量 137
9.4 赋值转换 138
9.5 闭包转换 140
9.6 显露分配 142
9.7 详细控制和CClos 143
9.8 选择指令 143
9.9 挑战:优化闭包 144
9.10 进一步阅读 146
第10章 动态类型 147
10.1 LDyn语言 147
10.2 标记值的表示 151
10.3 LAny语言 151
10.4 强制转换插入:编译LDyn为
LAny 154
10.5 揭示强制转换 155
10.6 赋值转换 156
10.7 闭包转换 156
10.8 移除复杂操作数 156
10.9 详细控制和CAny 156
10.10 选择指令 157
10.11 LAny语言的寄存器分配 159
第11章 渐变类型 161
11.1 类型检查L? 162
11.2 解释LCast 166
11.3 重载解析 170
11.4 插入强制转换 170
11.5 低层类型转换 171
11.6 区分代理 172
11.7 揭示强制转换 174
11.8 闭包转换 174
11.9 选择指令 174
11.10 进一步阅读 176
第12章 泛型 178
12.1 编译泛型 183
12.2 解析实例化 184
12.3 擦除泛型类型 185
附录 x86指令集快速参考 188
参考文献 190
内容介绍
本书将带领读者使用Python语言动手构建编译器,通过循序渐进的方法,在设计和实现编译器的过程中了解基本概念、算法和数据结构等相关知识。本书将每章作为构建编译器的一个基本“步骤”,逐步为编译器添加功能。全书涵盖变量、寄存器、条件、循环、元组、函数、动态类型、通用类型等内容。本书适合作为高等院校编译原理等课程的教材,也适合相关技术人员参考。
微信支付
支付宝
扫一扫购买