当我们点击XCode的run的时候,他做了如下流程图的内容:
首先iOS使用的编译器而非解释器,好处的执行效率高,编译后生成机器码直接在CPU上运行. iOS使用的编译器是LLVM,他是一个工具链技术的集合,内置lld链接器.
LLVM中的Clang是编译器前端:它主要是进行预处理、词法分析、语法分析、语义分析、静态分析、生成中间代码。
LLVM的编译器后端:它将中间代码优化生成汇编代码,然后汇编器再将其生成机器代码,最近生成可执行文件.o即Mach-O文件。
链接器:链接器的作用主要有两个,一个是做符号绑定;另一个就是将多个Mach-O文件合并成一个. 符号可以看作是函数名和全局变量名,通关链接器与内存地址进行绑定.
总结一下编译过程就是:1.LLVM处理预处理命令,如嵌入宏;2.LLVM进行词法、语法、语义等的分析;3.生成AST;4.生成IR;5生成机器码即可执行文件Mach-O,链接器将多个Mach-O文件合并成一个.
另外说一下动态链接器dyld,他可以动态加载动态库,比如系统库都是运行是动态加载的.动态库的符号绑定可以在程序启动执行的时候绑定也可以符号第一次被用到的时候绑定.