LLVM入门

LLVM是模块化、可重用的编译器以及工具链的集合,有些人把LLVM当成是一个低层的虚拟机(low level virtual machine),但官方给出的解释是这样的:

The name “LLVM” itself is not an acronym; it is the full name of the project.

也就是说LLVM并不是一个缩写,而是整个项目的全名。
LLVM和传统的编译器(GCC)是有差别的

传统的编译器架构

img

传统的编译器架构主要分为三个部分

  • Frontend:前端
    包括词法分析、语法分析、语义分析、中间代码生成
  • Optimizer:优化器
    主要是对编译前端对生成的中间代码的优化
  • Backend:后端
    翻译中间代码为native机器码

LLVM编译器架构

img

LLVM编译器套件与传统编译器架构的不同之处主要在于

  • LLVM编译器的前端其它层(优化器、后端)是分离的,LLVM专门有一个Clang子项目用来对源码进行编译,生成IR(intermediate representation)中间字节码;而传统编译器的代表(GCC)由于编译前后端耦合度太高,增加一个前端语言支持或者一个后端平台支持将会变得异常复杂。相比之下LLVM由于是分离式架构,其组件复用性就很高,增加语言/平台支持也相对容易,增加一个新的编程语言,就增加一个新的前端组件,增加一个新的平台支持,就增加一个新的后端组件。
  • LLVM编译器不同的前端统一使用相同的中间码,不像GCC有各种风格(intel&ATT)
  • LLVM经常被用于一些解释型语言的动态编译(优化)。类似的JAVA虚拟机(JVM)的JIT(好像现在就有厂在做基于LLVM的JAVA JIT编译器,负责将高层字节码(java-bytecode)解析成相对底层的IR中间码,之后编译成相应平台的机器码执行。
  • LLVM也经常被用于一些语言的静态编译,类似的Objective-c就是使用Clang进行编译(之前其实也是使用GCC的,但现在连Xcode的内置编译器都换成Clang了),据说编译时间是GCC的1/3,语法树占用内存是GCC的1/5,而且诊断信息可读性强,不像GCC是一大坨不容易识别的那种。

0x2 狭义的LLVM和广义的LLVM

img

广义的LLVM通常指LLVM编译器的整体架构,而狭义的LLVM通常指不包含前端,只实现中间代码优化和native码生成的部分。IR中间码需要多个pass进行一系列优化后再进行翻译。

等看完加密与解密这章再更