编译器背景
GCC
LLVM
LLVM比gcc的优势是模块化,中间端都是统一的,添加新的语言的话,只需要添加一个新的前端就行
Clang
clang是LLVM的子项目,是LLVM架构里C族编译器的前端
对比GCC优点:
- 编译速度快
- 占用内存小,clang生成的语法树(AST)是GCC的五分之一左右
- 诊断信息丰富准确
- 模块化,容易拓展
OC文件的编译过程
#import "Person.h"
#import <UIKit/UIKit.h>
@implementation Person
- (void)test {
UIApplication *app = [UIApplication sharedApplication];
UIView *statusBar = [app valueForKey :@"statusBar"];
NSLog(@"%@", statusBar);
}
@end
终端输入clang -ccc-print-phases Person.m
,可以查看编译过程
找到这个文件
-
预处理,替换import,include,宏定义
终端输入
clang -E Person.m
,可以查看预处理结果 -
词法分析,生成token,后面的loc代表行号和第几个字符
终端输入
clang -fmodules -E -Xclang -dump-tokens Person.m
-
语法分析,token拼接,生成语法树(AST)
终端输入
clang -fmodules -fsyntax-only -Xclang -ast-dump Person.m
-
生成中间代码,IR
LLVM IR有3种表现形式- text,便于阅读的文本格式,类似汇编,拓展名为.ll,
clang -S -emit-llvm main.m
- memory,内存格式
- bitcode,二进制格式,拓展名为.bt,
clang -c -emit-llvm main.m
- text,便于阅读的文本格式,类似汇编,拓展名为.ll,
汇编
链接
转成目标可执行文件