参考自:
GCC
GCC,全称 the GNU Compiler Collection,是一套能够将 C、C++等多种高级语言源码编译生成二进制机器码的软件集合。从源码到二进制文件的过程中,GCC 首先将高级语言翻译为 Register Transfer Language(RTL)的统一表示,再通过不同硬件所用的指令集,编译为可在具体机型上运行的二进制文件。
在从源码到 RTL 的过程中,实际是通过 GCC 进行了对代码的目的进行了一次抽象,从而可以对其进行优化,抛弃一些无谓的步骤,完成这部分工作的软件就被称作前端(Frontend)。
从源码中提炼出的 RTL 指明了程序的功能和目标,但还缺少具体的执行步骤,因此需要被称作后端(Backend)的软件来负责把抽象的目标具象为处理器能够理解的指令序列。
GCC 最初只是为了 GNU 系统开发的编译器软件包,只是在发展过程中逐步补充兼容,成为了现今最常用的 C 编译套件。但限于初期的规划和目标,GCC 代码的耦合度较高,经过长时间的维护,代码质量难以保证,一些底层设计也逐渐无法适应计算机软件的功能需求。
LLVM
这时,LLVM(Low Level Virtual Machine)横空出世,其基本思路为:将软件编译过程分为源码,中间表示层,二进制文件三个环节,作为前端,优化器,后端三个子项目独立实现,由此提高整个工具链的灵活性和扩展性。其中核心即在于用以表达功能的中间层(Intermediate Representation,IR),在此的具体实现是被称为 LLVM Core 的优化器(Optimizer)。
LLVM Core 优良的设计令其不仅能够有效处理静态代码,也能够对动态的设计进行有效的优化和翻译,说一种 IR 设计良好,直观理解就是表现力强,更容易在翻译源码时做到信达雅。
LLVM 把完整的编译工具包称作工具链(Tool Chain),想从源码编译可运行的文件,光有 LLVM 还不够。Clang(发音:克朗),作为一种优秀的 LLVM 前端,可以处理 C/C++/Objective-C/Objective-C++等源码,将其转化为 LLVM IR 供后端处理。
LLVM 后端的选择,与二进制文件所需运行的具体环境有关,可选的有 LLVM JIT,LLVM x86 compiler 等多种,我不懂,所以之后有时间学完再说。
以上主要是我对 GCC,LLVM 以及程序编译的粗浅理解,如有不妥还烦请多指教。
最后修改于 2021-12-18