LLVM是一系列编译器和工具链技术的集合,模块化,可重用.
专门为编程语言编写的程序编译时,链接时,运行时优化而设计.
传统编译器分为前端、优化器、后端
前端负责解析源代码,检查语法错误,将其翻译为抽象的语法树
优化器对这一中间代码进行优化,试图使代码更高效
后端将优化后的中间代码转为目标机器代码,最大化利用目标机器的特殊指令,提高代码性能
前端解析器 + IR生成器 + LLVM后端
LLVM是编译器工具链技术的一个集合,其中lld项目是内置链接器,编译器将每个文件编译成Mach-O,链接器会将项目多个Mach-O文件合并成一个
目前xcode的前端使用 Clang
iOS系统编译主要过程:
1.你写好代码后,LLVM会进行预处理,如把宏嵌入对应位置
2.预处理完后,LLVM会对代码进行词法分析和语法分析,生成AST.AST是抽象语法树,结构上比代码更精简,遍历起来更快
语义分析,生成中间代码IR,可以是 text型,Memory型,bitcode二进制格式
Clang是一个开源库,LibClang LibTooling
Clang编译原理 源代码 -> 词法分析 -> Token -语法分析 ->AST语法树 -> 语义分析 -> 生成IR代码 ->Pass优化 -> LLVM Bitcode 生成字节码 ->汇编代码 -> 链接器 Linker -> 目标文件
LibClang LibTooling 可以来开发新的语法树 , 实现 OC 转 JS Swift
也可以通过修改语法树 ,才进行静态打点,也可以做到无侵入
滴滴 DynamicCocoa 企鹅 直接做了个编译器 OCS 来实现iOS动态化
《DynamicCocoa:滴滴 iOS 动态化方案的诞生与起航》 《OCS——史上最疯狂的iOS动态化方案》
编写Pass 来实现代码混淆
参考: https://blog.csdn.net/Deft_MKJing/article/details/84943381