LLVM的探索
编译器的作用就是将源码编译成可以运行的程序。
终端按顺下敲入
vim hello.py
python hello.py
vim hello.c
clang hello.c
./a.out
vim main.m
#imclude<stdio.h>
int main(int argc, char *argv[]){
printf("hello word!");
};
LLVM概述
从写代码->LLVM 的动态流程 ->APP运行:
源代码- 预编译 - 编译 - 链接.o - 可执行文件(静态连接和动态连接)- 可执行文件 - dyld - libsystem
Frontend 编译器前端
Optimizer 优化器
优化器负责进行各种优化。改善代码的运行时间,例如消除多余的计算等
backend 后端/ CodeGenerator代码生成器
将代码映射到目标的指令集。声称机器语言,并且进行机器相关的代码优化。
iOS的编译器架构
Objective C/C/C++使用的编译器前端是Clang,Swift是Swift,后端都是LLVM
编译流程
通过命令可以打印源码的编译阶段
clang -ccc-print-phases main.m
clang -fmodules -fsyntax-only -Xclang -dump-tokens main.m
会把代码切成一段段的如下:
clang -s -fobjc-arc -emit-llvm main.m
生成的main.II如图 :
bitCode
xcode7 以后开启bitCode苹果会做进一步的优化。生成.bc的中间代码。
我们通过优化后的IR代码生成.bc代码
clang -emit-llvm -c main.ll -o main.bc
生成汇编代码
我们通过最终的.bc或者.ll代码生成汇编代码
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
生成目标文件(汇编器)
目标文件的生成,是汇编器以汇编代码作为输入,将汇编代码转换为机器代码,最后输出目标文件。
clang -fmodules -main.s -o main.o
生成可执行文件(连接)
连接器把编译产生的.o文件和(.dylib.a)文件,生成一个mach-o文件。
clang main.o -o main