iOS编译流程
四个阶段:
1. 预处理(preprocessing)
2. 编译(compliation)
3. 汇编(assembly)
4. 链接(linking)
细分七个阶段:
1. 预处理
2. 词法分析
3. 语法分析
4. 生成中间代码
5. 生成目标代码
6. 汇编
7. 链接
流程
源文件
预处理阶段
宏替换
导入头文件
编译阶段:
【生成中间代码IR】
【.ll 或者 .bc 文件】
词法分析
语法分析
后端:
【生成 .s 文件】
生成目标文件
【生成 .o 目标文件】
链接
【.o 文件与 .dyld, .a 文件链接】
静态库
动态库
绑定
生成 mach-o 可执行文件
流程结构1
源码
前端编译
中间产物IR
后端编译
执行文件
流程结构2
Source Code
源码
Frontend
前端
Optimizer
优化器
Backend 后端
代码生成器 CodeGenerator
Machine Code
机器码
细分流程
创建项目,编写代码
前端 Frontend
编译器前端的`任务`是`解析源代码`(编译阶段),它会进行 `词法分析、语法
分析、语义分析、检查源代码是否存在错误`,然后构建`抽象语法树
`(Abstract Syntax Tree `AST`),`LLVM`的前端还会生成`中间代码
`(intermediate representation,简称`IR`),可以理解为`llvm`是`编译器
+ 优化器`, 接收的是`IR`中间代码,输出的还是`IR`,给**后端Backend**,
经过后端翻译成目标指令集
优化器 Optimizer
优化器负责进行各种优化,改善代码的运行时间,例如消除冗余计算等
IR文件在OC中是可以进行优化的,Optimization Level 设置不同优化级别
clang -Os -S -fobjc-arc -emit-llvm main.m -o main.ll
bitcode
开启`bitcode`,苹果会做进一步优化,生成`.bc`的中间代码,我们通过优化后
的IR代码生成`.bc`代码
clang -emit-llvm -c main.ll -o main.bc
后端 Backend
代码生成器 Code Generator
将`代码映射到目标指令集,生成机器代码`,并且进行机器代码相关的代码优化
我们通过最终的`.bc或者.ll代码`生成`汇编代码`
生成汇编代码也可以进行优化
clang -Os -S -fobjc-arc main.m -o main.s
生成的`xxx.s`文件的格式为`汇编代码`
生成目标文件
汇编器以`汇编代码作为插入`,将汇编代码`转换为机器代码`,最后输出目标文
件
clang -fmodules -c main.s -o main.o
链接
链接需要的动态库和静态库,生成可执行文件
静态库会和可执行文件合并
动态库是独立的(iOS会复制一份和app打包在一起)
连接器把编译生成的`.o文件和 .dyld .a`文件链接,生成一个`mach-o文件`
clang main.o -o main
最终生成的mian文件就是可执行文件
绑定
绑定主要是通过不同的架构,生成对应的mach-o格式可执行文件
iOS 采用 Clang(发音为/ˈklæŋ/) 作为前端编译器
Clang属于整个LLVM架构中的 `编译器前端`
LLVM的设计是`前后端分离`的