IOS
IOS的编译过程分为前段和后端两个部分
前端
预处理(Pre-process):他的主要工作就是将宏替换,删除注释展开头文件,生成.i文件。
词法分析(Lexical Analysis):将代码切成一个个 token,比如大小括号,等于号还有字符串等。是计算机科学中将字符序列转换为标记序列的过程。
语法分析(Semantic Analysis):验证语法是否正确,然后将所有节点组成抽象语法树 AST 。Clang 中 Parser 和 Sema 配合完成
静态分析(Static Analysis):使用它来表示用于分析源代码以便自动发现错误。
中间代码生成(Code Generation):开始IR中间代码的生成了,CodeGen 会负责将语法树自顶向下遍历逐步翻译成 LLVM IR,IR 是编译过程的前端的输出后端的输入。
后端
优化(Optimize):LLVM 会去做些优化工作,在 Xcode 的编译设置里也可以设置优化级别-01,-03,-0s,还可以写些自己的 Pass,官方有比较完整的 Pass 教程: Writing an LLVM Pass — LLVM 5 documentation 。如果开启了 bitcode 苹果会做进一步的优化,有新的后端架构还是可以用这份优化过的 bitcode 去生成。
生成目标文件(Assemble):苹果平台生成Mach-O
链接(Link):生成 Executable 可执行文件。
安卓
安卓的编译过程,最开始是编译成.class,用虚拟机执行
之后经历了JIT AOT 等阶段,但是都有对应的不足
目前使用了一种折中的方法
安卓最开始是一种解释型语言,边解释边执行,目前使用折中方式
IOS比较纯粹,编译成机器语言执行