GCC、LLVM、Clang

LLVM是Low Level Virtual Machine的简称。这个库提供了与编译器相关的支持,可以进行程序语言的编译期优化、连接优化、在线编译优化、代码生成。能够做为多种语言编译器的后台来使用。前端

Clang是一个C++编写的基于LLVM、发布于LLVM BSD许可证下的C/C++/Object-C/Object-C++ 编译器。正则表达式

GCC:(GNU Compiler Collection)缩写,一个编程语言编译器,是GNU(自由软件理事会)的关键部分。也是GNU工具链的一部分。GCC常被认为是夸平台编译器的事实标准,特别是它的C语言编译器。GCC本来只能处理C语言。可是面对Clang的竞争,很快做出了扩展,如今已经能够处理C++,Fortran、Pascal、Object-C、Java、Ada,以及Go语言。许多操做系统,包括许多Unix系统,如Linux及BSD家族都采用GCC做为标准编译器。MacOSX也是采用这个编译器。编程

 

       有了GCC在前为什么还有Clang的出现?缘由以下:Apple使用LLVM在不支持所有OpenGL特性的GPU(Intel低端显卡)上生成代码JIT,令程序仍然能正常运行。以后LLVM与GCC的集成过程发生了一些不快,GCC系统庞大儿笨重,而Apple大量使用的Object-C在GCC中优先级很低。此外GCC做为一个纯粹的编译系统,与IDE配合不好。加上许可证方面的要求,Apple没法使用修改版GCC而闭源。因而Apple决定从0开始写C family的前端,也就是基于LLVM的Clang了。后端

Clang的特性:框架

一、快:经过编译OSX上几乎包含了全部C头文件的carbon.h的测试,包括预处理(Pregrocess)、语法(lex)、解析(parse),语义分析(semantic Analysis),抽象语法树生成(Abstract syntax Tree)的时间,Clang是Apple GCC 4.0的2.5x快。编程语言

二、内存占用小:Clang内存占用是源码的130%,AppleGCC则超过10x。模块化

三、诊断信息可读性强:Clang中错误的语法不但有源码提示,还会在错误的调用和相关上下文有~~~~和^提示,GCC看不懂。工具

四、设计清晰简单,容易理解,易于扩展加强。学习容易。学习

五、基于库的模块化设计,易于IDE集成及其余用途的重用。因为历史缘由,GCC是一个单一的可执行程序编译器,其内部完成预处理到代码生成的所有过程,中间诸多信息都没法被其余程序重用。Clang将编译过程分红彼此分离的几个阶段,AST信息可序列化。经过库的支持,程序可以获取到AST级别的信息,将大大加强对代码的操控能力。对于IDE而已,代码补全、重构是重要的功能,然而若是没有底层的支持,只使用tags分析或者正则表达式匹配很难达成。测试

 

固然GCC也有优点:

一、支持JAVA/ADA/Fortran

二、GCC支持平台多

三、GCC更流行,普遍使用,支持完备

四、GCC基于C,不须要C++编译器就能够编译

     相信介绍到这里你们可以对 Clang 和 LLVM 有所了解了。除去 Clang 以外,LLVM 还被用在 Gallium3D 中进行 JIT 优化,Xorg 中的 pixman 也有考虑使用 LLVM 来优化执行速度,llvm-lua使用 LLVM 来编译 Lua 代码,gpuocelot使用 LLVM 能够令 CUDA 程序无需从新编译便可运行在多核 X86CPU、IBM Cell、支持 OpenCL 的设备之上...

 

LLVM是编译器的工具链的集合,Clang是使用LLVM的编译器,Clang必须调用链接器LLDB来产生可执行文件。

LLVM是一个优秀的编译器框架,它也采用经典的三段式设计。前端可使用不一样的编译工具对代码文件作词法分析以造成抽象语法树AST,而后将分析好的代码转换成LLVM的中间表示IR(intermediate representation);中间部分的优化器只对中间表示IR操做,经过一系列的Pass对IR作优化;后端负责将优化好的IR解释成对应平台的机器码。LLVM的优势在于,中间表示IR代码编写良好,并且不一样的前端语言最终都转换成同一种的IR。

LLVM IR 是LLVM的中间表示,优化器就是对IR进行操做的,具体的优化操做由一些列的Pass来完成,当前端生成初级IR后,Pass会依次对IR进行处理,最终生成后端可用的IR。下图能够说明这个过程:

 

相关文章
相关标签/搜索