深入理解LLVM:代码生成
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

第2章 IR基础知识

目前流行的编译器通常采用三段式设计,分为前端、中端和后端,编译器的典型架构如图2-1所示。

图2-1 编译器架构示意图

前端:对程序进行解析,确保程序符合语言规定的词法、语法、语义规则。前端完成后通常将程序变换成另一种表示,这种新的表示一般更便于进行编译优化或者目标代码生成。

中端:目的是对程序进行优化。为了便于进行优化,通常使用IR来描述程序,不同的语言可以翻译成统一的IR,这样针对IR进行的优化可以做到语言无关。中端常见的优化有常量传播(Constant Propagation,CP)、死代码消除(Dead Code Elimination,DCE)、循环不变代码外提(Loop Invariant Code Motion,LICM)、循环展开(Loop Unrolling,LU)等。

后端:目的是将程序翻译成目标机器可以识别的机器码。后端的工作通常包括指令选择、指令调度、寄存器分配和机器码生成。

注意

通常我们提到的优化都是指语言无关、架构无关的编译优化,但现实中也存在一些语言相关、架构相关的优化技术,这些优化技术都是对特定问题的分析和解决,不在本书的讨论范围内。

IR是编译优化的基础,本章将主要讨论IR相关知识。