维基百科解释
LLVM是一个自由软件项目,它是一种编译器基础设施,以C++写成。它是为了任意一种编程语言而写成的程序,利用虚拟技术创造出编译时期、链接时期、运行时期以及“闲置时期”的最优化。它最早以C/C++为实现对象,而目前它已支持包括ActionScript、Ada、D语言、Fortran、GLSL、Haskell、Java字节码、Objective-C、Swift、Python、Ruby、Rust、Scala以及C#等语言。
个人理解
LLVM的全称是Low Level Virtual Machine,翻译过来是底层虚拟机.是项目早期的一个目标,如果大家通过这个思路去理解LLVM的话,会带来一定的困扰.而经十几年的发展项目早就远远超出了当时初期的目标.而现在的LLVM更多的是一个项目的名字,一个品牌与其字面意思没有太多的关系.
更准确的说LLVM是一个编译器框架,也是一个项目包含了我们熟知的工具,比如LLVM Core,Clang,LLDB,libc++和 libc++ ABI,compiler-rt等子项目.
最为一个iOS开发者,接触最多的应该GCC和LLVM两个编译器.历史上苹果首先使用的是GCC,是由GNU一个开源的非赢利组织开发的,随着iOS不断发展难以满足苹果日益庞大的需求.这个时候苹果决定自己干.然后就慢慢使用LLVM替代了GCC.
大致的过程为:
Xcode3之前,用的是GCC;
Xcode3,GCC仍然保留,但是也推出了LLVM,苹果推荐LLVM-GCC混合编译器,但还不是默认编译器;
Xcode4,LLVM-GCC成为默认编译器,但GCC仍保留;
Xcode4.2,LLVM3.0成为默认编译器,纯用GCC不复可能;
Xcode4.6,LLVM升级到4.2版本;
Xcode5,LLVM-GCC被遗弃,新的编译器是LLVM5.0,从GCC过渡到LLVM的时代正式完成。
广义的编译器概念就是将一种语言翻译成另一种语言.而我们接触的最多的就是将OC代码最终翻译成可执行的二进制代码.
那编译器是怎么做的呢?现代编译器主要分为三个部分,前端就是我们总是提到的Clang,优化器也是LLVM比较核心的优势 LLVM Core(也称opt),后端.
LLVM不止可以对OC代码在x86和arm架构上进行编译,凡是符合框架的组件都是可以使用LLVM进行编译.
预编译
词法分析
语法分析->生成AST语法树
语义分析->生成IR
优化 -> 输出IR
生成汇编
生成目标文件
一段代码
代码块
int square(int num) {
return num * num;
}
int main() {
int result = square(2);
}
执行命令
代码块
clang -Xclang -ast-dump -fsyntax-only test.c
得到输出
代码块
|-FunctionDecl 0x7fba89859e30 line:1:5 used square 'int (int)'
| |-ParmVarDecl 0x7fba89814960 col:16 used num 'int'
| `-CompoundStmt 0x7fba89859fb8
| `-ReturnStmt 0x7fba89859fa8
| `-BinaryOperator 0x7fba89859f80 'int' '*'
| |-ImplicitCastExpr 0x7fba89859f50 'int'
| | `-DeclRefExpr 0x7fba89859f10 'int' lvalue ParmVar 0x7fba89814960 'num' 'int'
| `-ImplicitCastExpr 0x7fba89859f68 'int'
| `-DeclRefExpr 0x7fba89859f30 'int' lvalue ParmVar 0x7fba89814960 'num' 'int'
`-FunctionDecl 0x7fba8985a020 line:5:5 main 'int ()'
`-CompoundStmt 0x7fba8985a1f8
`-DeclStmt 0x7fba8985a1e0
`-VarDecl 0x7fba8985a0d0 col:6 result 'int' cinit
`-CallExpr 0x7fba8985a1b0 'int'
|-ImplicitCastExpr 0x7fba8985a198 'int (*)(int)'
| `-DeclRefExpr 0x7fba8985a130 'int (int)' Function 0x7fba89859e30 'square' 'int (int)'
`-IntegerLiteral 0x7fba8985a150 'int' 2
参考https://www.eryige.com/forum.php?mod=viewthread&tid=457&page=1&extra=#pid1997