豆瓣读书:https://book.douban.com/subject/26852653/
最近看的编译相关的书籍有这几本:
- 编译器设计【编译器】
- 2019.08 阅读,挺厚的一本书(592 页),几乎涵盖了编译器相关的方方面面(前端、优化、后端)
- 比较偏算法,介绍了很多实用的技巧
- Parsing Techniques【编译器前端】
- 2019.09 阅读,英文厚书(662 页),深入介绍了编译器前端相关的解析技术
- 针对各种文法全面介绍了各种解析方法,教会大家怎样对特定文法进行通用解析(解析器生成器)
- Static Program Analysis【数据流分析】
- 2020.03 阅读(175 页,薄薄的一本)
- 一本偏理论的 静态分析 书籍,通过引入 代数格 和最小不动点,得到了 静态分析 的一个统一框架
- 对众多静态分析场景进行了说明
- LLVM 编译器实战教程【LLVM 用法】
- 2020.04 阅读(200 页,不厚)
- 介绍了 LLVM 生态 偏实用,学习一下怎么用 近代知名的开放式编译器架构 也是很有收获的
看完以上几本书之后,比较欠缺的一点是,没有一本书把 编译 这一整块块事情,从头到尾梳理一遍。
我们可能并不想知道那么高深的算法,也不想学习那些深奥难懂的理论知识。
只是想知道一套 “堪比” 工业级可用的编译系统包含哪些部分。
本书的名字中包含的是 “编译系统”,而不是 “编译器”,
这是因为 一套完整的编译系统,需要考虑从源代码,到可执行文件的整个流程,
包括了 高级语言的编译、汇编和链接。而大部分资料欠缺的正是汇编和链接相关的内容。
汇编器和连接器的实现,相关的资料更是少之又少。如果对这方面感兴趣的话,这本书将是一个不错的选择。
本书虽然不厚(290 页),但通过详尽的实例,把 编译系统(不是编译器) 从头到尾串联了一遍。
看到在《序》中介绍,作者从本科毕业设计开始,就着手写编译器的实现代码,
毕业设计结束时,完成了一个最简单的 C 语言子集的编译器。
研究生期间,又完成了 汇编和链接 两大模块的实现,然后又用了两年时间来写书。
我觉得能保持这种 平静的心态 研究技术,是非常难得的。
书中大多数应用细节,都有代码实现的讲解,能给人一种身临其境的感觉。
整个 编译系统 设计中,本书的技术选型是这样的:
- 实现语言
- C++
- 源语言
- C 语言的一个子集【这个子集可不小】
- 类型:int char void,一维指针,一维数组类型
- 常量:字符常量,字符串常量,2/8/10进制整数
- 表达式:算术运算,关系运算
- 语句:赋值,循环,函数调用
- 声明和定义:extern,函数(声明,定义),变量
- C 语言的一个子集【这个子集可不小】
- 源代码编译
- 前端
- 词法分析:硬编码方式的词法分析(虽然介绍了 DFA)
- 语法分析:递归下降分析(理论联系实际 介绍了 消除左递归,提取左公因子,SELECT 集合)
- 语义分析:语法制导(解析的过程中建立符号表,进行作用域分析,语义检查,代码生成)
- 中间代码生成:选用了 四元式(还包括了数据段的生成)
- 优化
- 采用了数据流分析(包括流图的生成【这一块介绍的比较少】,数据流框架)
- 数据流分析框架的应用:常量传播,复写传播,死代码消除
- 寄存器分配(介绍了图着色算法)
- 窥孔优化
- 后端
- 指令选择:生成 Inter x86 指令【这里介绍的比较详细】
- 目标文件格式:Linux ELF 文件
- 前端
- 汇编器
- 词法分析,语法分析,符号表管理(与源代码分析大同小异)
- 表信息生成(两遍扫描)
- 汇编文件段信息 -> 段表
- 符号信息 -> 符号表,重定位表
- 指令生成,目标文件生成
- 链接器
- 分析 ELF 文件(段数据,符号引用信息)
- 地址空间分配(段加载起始地址,段拼接,段对齐)
- 符号解析(符号重定义,符号未定义)
- 重定位,程序入口点和运行时库,生成可执行文件
读完这本书从很 实用的角度 走完 编译系统的 方方面面。
一些编译原理的教程会更偏向于通用性的技术方案,例如介绍 DFA 和 LR,
但实际工业级编译器(例如 TypeScript)大多是硬编码的词法分析和 LL(k) 递归下降解析。
所以读过本书之后,可以帮助我们看清实际情况,很多理论知识只是能起到指导作用,
实际生产环境中,由于要涉及多人混合编程和协作,开发一个编译系统所用到的前置知识都不是那么多的。
是一本不错的书,值得推荐。