豆瓣读书:https://book.douban.com/subject/26852653/
    image.png


    最近看的编译相关的书籍有这几本:

    • 编译器设计【编译器】
      • 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,函数(声明,定义),变量
    • 源代码编译
      • 前端
        • 词法分析:硬编码方式的词法分析(虽然介绍了 DFA)
        • 语法分析:递归下降分析(理论联系实际 介绍了 消除左递归,提取左公因子,SELECT 集合)
        • 语义分析:语法制导(解析的过程中建立符号表,进行作用域分析,语义检查,代码生成)
        • 中间代码生成:选用了 四元式(还包括了数据段的生成)
      • 优化
        • 采用了数据流分析(包括流图的生成【这一块介绍的比较少】,数据流框架)
        • 数据流分析框架的应用:常量传播,复写传播,死代码消除
        • 寄存器分配(介绍了图着色算法)
        • 窥孔优化
      • 后端
        • 指令选择:生成 Inter x86 指令【这里介绍的比较详细】
        • 目标文件格式:Linux ELF 文件
    • 汇编器
      • 词法分析,语法分析,符号表管理(与源代码分析大同小异)
      • 表信息生成(两遍扫描)
        • 汇编文件段信息 -> 段表
        • 符号信息 -> 符号表,重定位表
      • 指令生成,目标文件生成
    • 链接器
      • 分析 ELF 文件(段数据,符号引用信息)
      • 地址空间分配(段加载起始地址,段拼接,段对齐)
      • 符号解析(符号重定义,符号未定义)
      • 重定位,程序入口点和运行时库,生成可执行文件

    读完这本书从很 实用的角度 走完 编译系统的 方方面面。
    一些编译原理的教程会更偏向于通用性的技术方案,例如介绍 DFA 和 LR,
    但实际工业级编译器(例如 TypeScript)大多是硬编码的词法分析和 LL(k) 递归下降解析。

    所以读过本书之后,可以帮助我们看清实际情况,很多理论知识只是能起到指导作用,
    实际生产环境中,由于要涉及多人混合编程和协作,开发一个编译系统所用到的前置知识都不是那么多的。


    是一本不错的书,值得推荐。