GCC与LLVM工具链

参考自:

compiler construction - What is the difference between clang (and LLVM) and gcc / g++? - Stack Overflow

GCC

GCC, 全称the GNU Compiler Collection, 是一套能够将C, C++等多种高级语言源码编译生成二进制机器码的软件集合. 从源码到二进制文件的过程中, GCC首先将高级语言翻译为Register Transfer Language(RTL)的统一表示, 再通过不同硬件所用的指令集, 编译为可在具体机型上运行的二进制文件.

graph LR
Source_Code --"Frontend"--> RTL --"Backend"--> Binary_File

在从源码到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以及程序编译的粗浅理解, 如有不妥还烦请多指教.

tag(s): LLVM, C/C++
show comments · back · home
本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。知识共享许可协议
Say something...