LLVM编译过程
Clang
Clang是一个由Apple主导编写,基于LLVM的C/C++/Objective-C编译器
2013年4月,Clang已经全面支持C++11标准,并开始实现C++1y特性(也就是C++14,这是C++的下一个小更新版本)。Clang将支持其普通lambda表达式、返回类型的简化处理以及更好的处理constexpr关键字。
Clang是一个C++编写、基于LLVM、发布于LLVM BSD许可证下的C/C++/Objective-C/Objective-C++编译器。它与GNU C语言规范几乎完全兼容(当然,也有部分不兼容的内容,包括编译命令选项也会有点差异),并在此基础上增加了额外的语法特性,比如C函数重载(通过attribute((overloadable))来修饰函数),其目标(之一)就是超越GCC
内部设计与实现:
一个不可移植的代码库;一个为C语言、Objective-C、C++、Objective-C++设计的非通用(Non general-purpose)的语法解析器;与C/C++/Objective-C及它们的衍生语言具有高度一致性;
GCC(GNU Compiler Collection,GNU编译器套件)是由GNU开发的编程语言编译器。GNU编译器套件包括C、C++、 Objective-C、 Fortran、Java、Ada和Go语言前端,也包括了这些语言的库(如libstdc++,libgcj等。)
GCC的初衷是为GNU操作系统专门编写的一款编译器。GNU系统是彻底的自由软件。此处,“自由”的含义是它尊重用户的自由。
Clang 的特性:
-
快:通过编译 OS X 上几乎包含了所有 C 头文件的 carbon.h 的测试,包括预处理 (Preprocess),语法 (lex),解析 (parse),语义分析 (Semantic Analysis),抽象语法树生成 (Abstract Syntax Tree) 的时间,Clang 是 Apple GCC 4.0 的 2.5x 快。(2007-7-25)
-
内存占用小:Clang 内存占用是源码的 130%,Apple GCC 则超过 10x。
-
诊断信息可读性强:我不会排版,推荐去网站观看。其中错误的语法不但有源码提示,还会在错误的调用和相关上下文的下方有~~~~~和 ^ 的提示,相比之下 GCC 的提示很天书。
-
GCC 兼容性。
-
设计清晰简单,容易理解,易于扩展增强。与代码基础古老的 GCC 相比,学习曲线平缓。
-
基于库的模块化设计,易于 IDE 集成及其他用途的重用。由于历史原因,GCC 是一个单一的可执行程序编译器,其内部完成了从预处理到最后代码生成的全部过程,中间诸多信息都无法被其他程序重用。Clang 将编译过程分成彼此分离的几个阶段,AST 信息可序列化。通过库的支持,程序能够获取到 AST 级别的信息,将大大增强对于代码的操控能力。对于 IDE 而言,代码补全、重构是重要的功能,然而如果没有底层的支持,只使用 tags 分析或是正则表达式匹配是很难达成的。
LLVM
LLVM是一个编译器(确切的说是一套框架+基于框架的一些编译器实现,如clang),是当下很先进的一套编译系统。特别对于C/C++/Objective-C等语言而言,更是如此。
当然它也不止于此,它也支持JIT,以及很多非C家族的语言。
LLVM之所以优秀,在于以下几点:
-
1、LLVM的中间表达(IR)是可以dump出来成为可阅读的文本形式的(语法有点像汇编),看起来微不足道,但是其他很多编译器却只有内存中的数据结构,使得学习调试难度大增。
-
2、模块化的设计比较好,这一方面是后发优势,吸收了很多前人经验,也和设计者的架构功力息息相关。
-
3、虽然始于学术项目,但LLVM一直受到工业界的支持(Apple),所以不仅好用,而且开源可定制。