跳至主要內容

编译原理

西风逍遥游大约 2 分钟

编译原理

编译器作为一个程序猿每日都会用到的工具,对很多人来说只是一个简单的黑盒子,源代码送进去,而编译后的程序吐出来,却很少具体设计编译过程的细节。但作为程序员三大浪漫梦想之一,开发一门属于自己的编程语言,却一直驱动着众多爱好者不断的努力,当然,我也是其中之一。 那么本教程,就用通俗的语言,来帮您完整理解一个编译器的工作原理,并且轻松看懂很多复杂算法的具体原理。

如果我们打开这个黑匣子,会发现一般现代编译器都会有这样几个大的部分组成:

编译器前端概述

  1. 词法分析 - 将输入字符串切分成token
    1. 正则表达式 - 用正则表达式来描述token
    2. 自动机理论 - 用自动机来实现正则表达式
  2. 语法分析 - token序列构造成语法树
  3. 语义分析 - 遍历语法树,进行语义检查
  4. 中间代码生成 - 生成中间代码

编译器中端概述

  1. ValueNumbering - 消除表达式中的冗余计算
  2. 数据流分析 - 通过数据流分析,发现数据是如何传递的
  3. 静态单赋值形式 - 通过SSA形式,简化数据流分析
  4. 循环展开 - 通过展开循环来优化性能
  5. 函数内联 - 内联函数提升性能
  6. 别名分析 - 通过别名分析来发现哪些指针指向同样的数据

编译器后端概述

  1. 指令选择 - 通过指令选择来最优化性能
  2. 指令调度 - 优化指令序列来最优化延迟
  3. 寄存器分配 - 合理分配有限的寄存器资源
  4. 窥孔优化 - 通过窥孔优化来优化指令序列