LLVM 浅见

LLVM

做iOS的没有不知道的不哔哔了

代码写完首先会经过编译器来进行编译
首先

  1. Frontend 就是编译器先会通过 词法分析 语法分析 语义分析 生成中间代码(语言不同而选择不同的编译器)Clang 是基于LLVM 支持C、C++ 、OC的编译器前端部分
  2. Optimizer 进行优化 比如查找更快 体积更小 (不论什么语言什么平台 都一样 LLVM IR 有点像政府 不论你什么民族都归它管)
  3. Backend 根据平台生成对应的机器码(会根据不同平台而不同)

那直入主题 OC的编译过程
clang -ccc-print-phases main.m
LLVM 浅见

  1. 找到文件
  2. 宏定义 import都给换掉
  3. 编译成中间代码
  4. 交给LLVM 后端生成机器码
  5. 目标代码
  6. 链接动态库
  7. 编译成适合架构的代码

看看预编译的过程
LLVM 浅见
clang -E main.m 编译结果 宏已经被替换了
LLVM 浅见

词法分析

clange -fmodules -E -Xclang -dump-tokens main.m
代码全部拆解分成一个一个的(哪一行的哪一个字符都有标记)
LLVM 浅见

语法分析

clang -fmodules -fsyntax-only -Xclang -ast-dump main.m
生成语法树
LLVM 浅见
中间代码长什么样
生成 .ll文件 clang -S -emit-llvm main.m
LLVM 浅见
全局 @开头 比如函数名
局部 %开头 比如变量
alloc 栈空间分配内存
i32 32bit 4个字节的意思
align 内存对齐
store 写入数据
load 读取数据

生成 .bc文件 clang -c -emit-llvm main.m 二进制文件 看不懂

脑瓜疼歇了改日再继续