clang编译过程
clang是一个 C、C++和 Objective-C的编译器, 包含了预处理、语法解析、代码生成、优化、汇编和链接阶段, 尽管clang是高度集成的, 但是理解编译的各个阶段, 仍然很有必要.
过程:
预处理 -> 语法解析 -> 代码生成&优化 -> 汇编 -> 链接
.c -> AST -> .s -> .o -> .out
编译过程
驱动
clang可执行文件实际上是一个小的驱动程序, 控制其他工具(如编译器、汇编器和链接器)的总体执行. 通常你不需要直接和驱动程序交互, 就可以使用clang来运行其他工具.
预处理
这个阶段会对输入的源文件进行标记化处理、宏扩展、#include扩展和其他预处理器指令的处理. 对C输出.i, 对C++输出 .ii, 对 OC 输出 .mi, 对Objective-C++ 输出 .mii, 分别对应如下:
输入: .c、 .cpp、 .m、 .mm
输出: .i、 .ii、 .mi、 .mii
语法分析和语义分析
这个阶段会解析输入文件, 将预处理标记转换为解析树. 一旦以解析树的形式出现, 它也会用语义分析来计算表达式的类型, 确认代码格式是否正确.
该阶段负责生成大多数的编译警告和错误, 输出为 AST(抽象语法树, Abstract Syntax Tree)
输出: AST
代码生成和优化
这个阶段会将AST转换为底层的中间代码(称为 LLVM IR), 再最终转换为机器码.该阶段负责优化生成的代码, 并处理特定目标的代码生成. 输出通常称为 .s 文件或者 汇编文件.
输出: .s、 汇编文件
汇编
这个阶段将编译器的输出转换为目标文件, 输出为 .o 文件 或者 obje