Xcode 的默认编译器是 clang,编译器有两个职责:把 Objective-C 代码转化成低级代码,以及对代码做分析,确保代码中没有任何明显的错误。
clang -ccc-print-phases helloword.m
0: input, "helloword.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
编译器工作的阶段:
- 预处理
预处理首先处理的是宏定义,例如,如果在源文件中出现下述代码:
#import <Foundation/Foundation.h>
预处理器对这行代码的处理是用 Foundation.h 文件中的内容去替换这行代码,如果 Foundation.h 中也使用了类似的宏引入,则会按照同样的处理方式用各个宏对应的真正代码进行逐级替代。
- 词法解析标记
标记源码内容及在源码中的位置,在抽象语法树中的每个节点都标注了其对应源码中的位置,同样的,如果产生了什么问题,clang 可以定位到问题所在处的源码位置。 - 解析
之前生成的标记流将会被解析成一棵抽象语法树 (abstract syntax tree -- AST) - 静态分析
静态的类型检查,检查是否有定义了却没有使用的变量,调用self之前有没有调用super,有没有明显的内存问题 - 代码生成
clang 完成代码的标记,解析和分析后,接着就会生成 LLVM 代码 - 优化
新建文件 helloword.txt
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[])
{
@autoreleasepool
{
NSLog(@"Hello, OC!");
}
return 0;
}
在终端输入命令行
clang -fobjc-arc -framework Foundation HelloWord.m -o HelloWord
就生成了可执行文件,在终端输入执行代码
./HelloWord
或者双击可执行文件即可执行代码
[原文] (https://objccn.io/issue-6-2/)