入门篇
第1章编译器简介(19min)3
1.1编程语言的发展史3
1.2编译器在IT行业里的核心地位3
1.3编译器的代码架构4
第2章词法分析(34min)7
2.1“理想语言”的词法分析7
2.2实际编程语言的词法扩展8
2.2.1编程语言的标志符9
2.2.2关键字9
2.2.3数字10
2.2.4数据结构11
2.3词法分析的数学解释12
第3章语法分析(123min)14
3.1语句类型的划分14
3.2语句的嵌套和递归分析16
3.2.1变量声明语句的分析16
3.2.2类型定义语句的分析17
3.2.3顺序块的分析18
3.2.4表达式的分析18
3.2.5运算符的优先级和结合性19
3.2.6表达式树的构造步骤20
3.2.7完整的抽象语法树20
3.2.8抽象语法树的数据结构21
3.2.9变量和类型的数据结构22
3.2.10变量的语法检查23
3.2.11星号和乘法的区分24
3.3语法的灵活编辑和有限自动机框架24
3.3.1有限自动机的简介24
3.3.2语法的编辑25
3.3.3编程语言的语法图26
3.3.4SCF框架怎么实现“递归”27
3.3.5语法分析框架的模块上下文29
3.3.6for循环的语法分析模块30
3.3.7小括号的多种含义36
3.4语法分析的数学解释36
第4章语义分析(72min)38
4.1类型检查38
4.2语义分析框架40
4.2.1语义分析的回调函数40
4.2.2语义分析中的递归43
4.3运算符重载46
4.3.1运算符重载的实现46
4.3.2函数调用47
4.3.3重载函数的查找47
4.3.4代码实现48
4.3.5SCF编译器的类对象51
4.4new关键字51
4.5多值函数55
4.5.1应用程序二进制接口56
4.5.2语法层面的支持56
4.5.3语义层面的支持57
进阶篇
第5章三地址码的生成(84min)63
5.1回填技术63
5.1.1回填的数据结构63
5.1.2三地址码的数据结构64
5.1.3回填的步骤65
5.2ifelse的三地址码65
5.3循环的入口和出口68
5.4指针与数组的赋值72
5.5new关键字的三地址码74
5.6跳转的优化77
5.6.1跳转的优化简介77
5.6.2逻辑运算符的短路优化78
5.6.3死代码消除80
5.6.4代码实现80
第6章基本块的划分(19min)83
6.1比较、跳转导致的基本块划分83
6.2函数调用84
6.3基本块的流程图84
第7章中间代码优化(100min)86
7.1代码框架86
7.2内联函数88
7.3有向无环图93
7.3.1公共子表达式93
7.3.2数据结构94
7.3.3有向无环图的生成95
7.4图的搜索算法97
7.4.1基本块的数据结构97
7.4.2宽度优先搜索98
7.4.3深度优先搜索99
7.5指针分析100
7.5.1指针解引用的分析100
7.5.2数组和结构体的指针分析106
7.6跨函数的指针分析109
7.7变量活跃度分析114
7.7.1变量的活跃度114
7.7.2单个基本块的变量活跃度分析115
7.7.3基本块流程图上的分析117
7.7.4代码实现118
7.8自动内存管理120
7.9DAG优化125
7.9.1无效运算125
7.9.2相同子表达式的判断126
7.9.3出口活跃变量的优化126
7.9.4后 的优化127
7.9.5逻辑运算符的优化127
7.9.6DAG优化的代码实现128
7.10循环分析133
7.10.1循环的识别133
7.10.2循环的优化138
第8章寄存器分配(23min)143
8.1不同CPU架构的寄存器组143
8.2变量之间的冲突144
8.3图的着色算法148
8.3.1简单着色算法148
8.3.2改进的着色算法150
第9章机器码的生成(103min)155
9.1RISC架构的优势155
9.2寄存器溢出155
9.2.1寄存器的数据结构156
9.2.2寄存器的冲突156
9.2.3寄存器的溢出158
9.3X86_64的机器码生成158
9.3.1X86_64的机器指令158
9.3.2机器码的生成160
9.3.3目标文件176
9.4ARM64的机器码生成180
9.4.1指令特点180
9.4.2机器码生成181
第10章ELF格式和可执行程序的连接(94min)184
10.1ELF格式184
10.1.1文件头184
10.1.2节头表186
10.1.3程序头表188
10.1.4ELF格式的实现190
10.2连接器198
10.2.1连接198
10.2.2静态连接202
10.2.3动态连接205
10.2.4编译器的主流程215
10.3可执行文件的运行219
10.3.1进程创建219
10.3.2程序的加载和运行220
10.3.3动态库函数的加载221
10.3.4源代码的编译、连接、运行222
第11章Naja字节码和虚拟机(67min)224
11.1Naja字节码224
11.2虚拟机229
11.2.1虚拟机的数据结构229
11.2.2虚拟机的运行230
11.2.3动态库函数的加载236
第12章信息编码的数学哲学239
12.1信息编码格式的转换239
12.2多项式时间的算法241
12.3自然指数e和梯度下降算法241
12.4复杂问题的简单解法242