来复习一下编译 Objective-C 源文件的过程吧。用下面的命令输出编译源文件的不同阶段:

clang -ccc-print-phases main.m

输出结果如下:

0: input, "main.m", objective-c
1: preprocessor, {0}, objective-c-cpp-output
2: compiler, {1}, ir
3: backend, {2}, assembler
4: assembler, {3}, object
5: linker, {4}, image
6: bind-arch, "x86_64", {5}, image

简单解释一下1-6的处理:

  1. 预处理:处理包括宏替换、头文件导入;
  2. 编译生成IR(中间代码):词法分析、生成AST、静态分析等,然后生成LLVM代码;
  3. 汇编器生成汇编代码;
  4. 汇编器将可读的汇编代码转换为机器代码;
  5. 将多个目标对象文件合并为一个可执行文件;
  6. 生成image文件,即最后的可执行文件;

参考

深入剖析 iOS 编译 Clang LLVM