IOS-LLVM
一、LLVM概述
LLVM(Low Level Virtual Machine)是构架编译器(compiler)的框架系统,以C++编写而成,用于优化以任意程序语言编写的程序的编译时间(compile-time)、链接时间(link-time)、运行时间(run-time)以及空闲时间(idle-time),对开发者保持开放,并兼容已有脚本。
LLVM计划启动于2000年,最初由美国UIUC大学的Chris Lattner博士主持开展。2006年Chris Lattner加盟Apple Inc.并致力于LLVM在Apple开发体系中的应用。Apple也是LLVM计划的主要资助者。LLVM已经被Apple、Microsoft、Google、Facebook等各大公司采用。
二、LLVM的设计
当编译器支持多种源语言或者多种硬件架构的时候,LLVM的重大作用就体现出现了,他通过使用通用的IR代码,将源语言(C/C++,java等等)和多种硬件结构(X86、arm64等等)分离,使得他的用途广泛。
2.1 编译的过程大致可以分为三个部分:
1.编译器前端:经过词法分析、语法分析、语义分析,最后生成IR中间代码 2.优化器:对中间代码进行优化 3.编译器后端:生成指定架构模式的二进制文件
三、clang编译器
1.clang编译器是LLVM项目中的一个子项目,他诞生之初是为了取代GCC,提供更快的编译速度 2.他负责C、C++、OC的编译,属于编译器前端。
3.swift是swift编译器编译的
四、编译过程
我们以下面这段代码为例子:
#import <stdio.h> #define A 10 int main(int argc, const char * argv[]) { printf("%d",A + 20); return 0; }
4.1 打印源码的编译阶段:
//打印信息: clang -ccc-print-phases main.m
0.读取源码文件 1.预处理阶段 2.编译阶段,生成ir代码 3.后端, 生成汇编代码 4.通过汇编代码生成目标文件 5.目标文件通过链接,生成镜像 6.通过不同的架构模式,生成该架构模式下的可执行文件
4.2 预处理阶段
//预处理也叫 预编译 ,处理代码里面#开头的代码,替代宏,删除注释,展开头文件 clang -E main.m
4.3 编译阶段
4.3.1 词法分析
//预处理阶段完成后,就会进行词法分析,把代码切割成一个一个Token clang -fmodules -fsyntax-only -Xclang -dump-tokens main.m
4.3.2 语法分析
//词法分析之后就会进行语法分析,主要目的是为了检查代码语法正确,然后会生成抽象语法树(AST) clang -fmodules -fsyntax-only -Xclang -ast-dump main.m
4.3.3 生成中间代码IR
//代码生成器 从上到下遍历抽象语法树,翻译成IR,生成.ll文件 clang -S -fobjc-arc -emit-llvm main.m
OC的代码会在这一步完成runtime的桥接:property合成,ARC处理等。
4.3.3.1 IR的一些基本语法
4.3.3.2 IR的优化
//LLVM的优化级别分为 -O0、-O1、-O2、-O3、-Os clang -Os -S -fobjc-arc -emit-llvm main.m -o main.ll
也可以通过Xcode的optimization Level选择中之间选择:
4.3.3.3 bitCode 是IR的另一种表现形式
//开启bitCode苹果会做进一步优化,生成.bc的中间代码,我们通过优化后的IR代码生成.bc代码 clang -emit-llvm -c main.ll -o main.bc
这里也可以在Xcode 的bitCode中直接获取;一些第三方库不支持bitCode,所以这部分的使用一般都是关闭的。
4.4 生成汇编代码
//我们通过之前步骤生成的.ll 文件或者 .bc文件生成汇编代码 clang -S -fobjc-arc main.bc -o main.s clang -S -fobjc-arc main.ll -o main.s //生成的汇编代码同样可以优化 clang -Os -S -fobjc-arc main.m -o main.s
4.5 生成目标文件
//汇编代码转化为机器代形成目标文件 clang -fmodules -c main.s -o main.o
4.6 链接
//链接器把编译产生的目标文件和库文件(.dylib,.a)生成Mach-O文件 clang main.o -o main
五、总结
编译的基本过程:
源代码->预编译->编译->汇编->链接->可执行文件