总结面试题有感
# 1.Xcode编译器简单介绍(GCC和Clang+LLVM)
前端(Frontend)--优化器(Optimizer)--后端(Backend)
其中前端负责分析源代码,可以检查语法级错误,并构建针对该语言的抽象语法树(AST)
抽象语法树可以进一步转换为优化,最终转为新的表示方式, 然后再交给让优化器和后端处理
最终由后端生成可执行的机器码
理论上一个语言对应一个编译器,这样就引入了中间优化器,可以接受多种语言,然后输出对应的机器语言,这样前端只负责输入,后端负责输出即可,新增一种语言,就在中间优化层增加逻辑即可。
点击查看
前端
编译器前端的任务是进行:语法分析,语义分析,生成中间代码(intermediate representation )。在这个过程中,会进行类型检查,如果发现错误或者警告会标注出来在哪一行。
后端(优化中间层和后端)
编译器后端会进行机器无关的代码优化,生成机器语言,并且进行机器相关的代码优化。iOS的编译过程,后端的处理如下
LVVM优化器会进行BitCode的生成,链接期优化等等。
LLVM机器码生成器会针对不同的架构,比如arm64等生成不同的机器码。
这里先明白一个概念,Xcode编译过程中,从Cocoapods开始到对应的每个m文件,都会进行各自的编译过程,抛开其他编译发生的事情,每个编译流程大致如下
# 总结:编译流程解释:
编译流程解释: 0 - 输入文件:找到源文件。
1 - 预处理阶段:删除注释、替换宏定义、导入头文件。
2 - 编译阶段:词法分析、语法分析、语义分析、检查源代码是否正确、生成IR代码 .ll 。
3 - 编译后端:LLVM会通过一个个Pass去优化每个Pass做的事,最终生成汇编代码 .s 。
4 - 执行汇编程序:生成目标文件 .o 。
5 - 静态链接阶段:链接需要的动态库和静态库,所有.o黏合最后生成可执行文件。
6 - 根据不同的cpu架构去生成对应的可执行文件 exec 。