LLVM 浅见
LLVM
做iOS的没有不知道的不哔哔了
代码写完首先会经过编译器来进行编译
首先
- Frontend 就是编译器先会通过 词法分析 语法分析 语义分析 生成中间代码(语言不同而选择不同的编译器)Clang 是基于LLVM 支持C、C++ 、OC的编译器前端部分
- Optimizer 进行优化 比如查找更快 体积更小 (不论什么语言什么平台 都一样 LLVM IR 有点像政府 不论你什么民族都归它管)
- Backend 根据平台生成对应的机器码(会根据不同平台而不同)
那直入主题 OC的编译过程
clang -ccc-print-phases main.m
- 找到文件
- 宏定义 import都给换掉
- 编译成中间代码
- 交给LLVM 后端生成机器码
- 目标代码
- 链接动态库
- 编译成适合架构的代码
看看预编译的过程
clang -E main.m 编译结果 宏已经被替换了
词法分析
clange -fmodules -E -Xclang -dump-tokens main.m
代码全部拆解分成一个一个的(哪一行的哪一个字符都有标记)
语法分析
clang -fmodules -fsyntax-only -Xclang -ast-dump main.m
生成语法树
中间代码长什么样
生成 .ll文件 clang -S -emit-llvm main.m
全局 @开头 比如函数名
局部 %开头 比如变量
alloc 栈空间分配内存
i32 32bit 4个字节的意思
align 内存对齐
store 写入数据
load 读取数据
生成 .bc文件 clang -c -emit-llvm main.m 二进制文件 看不懂
脑瓜疼歇了改日再继续