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的设计是`前后端分离`的