简介LLVM

 

LLVM到底是什么?

维基百科解释

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进行编译.

LLVM到底都干了什么?

前端

预编译

词法分析

语法分析->生成AST语法树

语义分析->生成IR

优化器

优化 -> 输出IR

后端

生成汇编

生成目标文件

什么是AST语法树?

一段代码

代码块

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

你可能感兴趣的:(编译,LLVM,Clang)