https://www.jianshu.com/p/96058bf1ecc2
https://www.jianshu.com/p/1d8d1c079e4e
https://blog.csdn.net/talentedlas/article/details/51945569
一>clang编译过程
clang + LLVM clang作为编译前端,LLVM作为编译后端,
1.查看编译的步骤
clang -ccc-print-phases main.m
aofeilindeMacBook-Pro:ocDemo aofeilin$ 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
2.预处理完成后就会进行词法分析,这里会把代码切成一个个 Token,比如大小括号,等于号还有字符串等。
clang -fmodules -fsyntax-only -Xclang -dump-tokens main.m
3.然后是语法分析,验证语法是否正确,然后将所有节点组成抽象语法树 AST 。
clang -fmodules -fsyntax-only -Xclang -ast-dump main.m
4.这里 LLVM 会去做些优化工作,在 Xcode 的编译设置里也可以设置优化级别-01,-03,-0s,还可以写些自己的 Pass,官方有比较完整的 Pass 教程: Writing an LLVM Pass — LLVM 5 documentation 。
clang -O3 -S -fobjc-arc -emit-llvm main.m -o main.ll
5.Pass 是 LLVM 优化工作的一个节点,一个节点做些事,一起加起来就构成了 LLVM 完整的优化和转化。
如果开启了 bitcode 苹果会做进一步的优化,有新的后端架构还是可以用这份优化过的 bitcode 去生成。
clang -emit-llvm -c main.m -o main.bc
6.生成汇编
clang -S -fobjc-arc main.m -o main.s
7.生成目标文件
clang -fmodules -c main.m -o main.o
二>LLVM 会进行机器无关的代码优化,生成机器语言,代码优化。
https://blog.csdn.net/hitfyb/article/details/50876207
https://segmentfault.com/a/1190000003101087
View->Navigators->Show report Navigator—by time 打开日志查看执行过程
1.执行Xcode build的流程
下面是完整步骤:
1.编译信息写入辅助文件,创建文件架构 .app 文件
2.处理文件打包信息
3.执行 CocoaPod 编译前脚本,checkPods Manifest.lock
4.编译.m文件,使用 CompileC 和 clang 命令
5.链接需要的 Framework
6.编译 xib
7.拷贝 xib ,资源文件
8.编译 ImageAssets
9.处理 info.plist
10.执行 CocoaPod 脚本
11.拷贝标准库
12.创建 .app 文件和签名
编译器后端进行与机器无关的代码优化,生成机器语言,后端的处理。