GCC
GCC(GNU Compiler Collection,GNU编译器套装),是⼀套由 GNU 开发的编程语⾔编译器。它是⼀套以 GPL 及 LGPL 许可证所发⾏的⾃由软件,也是 GNU计划的关键部分,亦是⾃由的类Unix及苹果电脑 Mac OS X 操作系统的标准编译器。
GCC 原名为 GNU C 语⾔编译器,因为它原本只能处理 C语⾔。GCC 很快地扩展,变得可处理 C++。之后也变得可处理 Fortran、Pascal、Objective-C、Java, 以及 Ada与其他语⾔。
Clang
Clang 是⼀个 C++ 编写、基于 LLVM、发布于 LLVM BSD 许可证下的 C/C++/Objective C/Objective C++ 编译器,其⽬标(之⼀)就是超越GCC。
LLVM
LLVM 是 Low Level Virtual Machine 的简称,这个库提供了与编译器相关的⽀持,能够进⾏程序语⾔的编译期优化、链接优化、在线编译优化、代码⽣成。简⽽⾔之,可以作为多种语⾔编译器的后台来使⽤。
本上都是三段式的,可以分为前端、优化器和后端。前端负责解析源代码,检查语法错误,并将其翻译为抽象的语法树;优化器对这⼀中间代码进⾏优化,试图使代码更⾼效;后端则负责将优化器优化后的中间代码转换为⽬标机器的代码,这⼀过程后端会最⼤化的利⽤⽬标机器的特殊指令,以提⾼代码的性能。基于这个认知,我们可以认为 LLVM 包括了两个概念:⼀个⼴义的 LLVM 和⼀个狭义的 LLVM 。⼴义的LLVM 指的是⼀个完整的 LLVM 编译器框架系统,包括了前端、优化器、后端、众多的库函数以及很多的模块;⽽狭义的 LLVM 则是聚焦于编译器后端功能的⼀系列模块和库,包括代码优化、代码⽣成、JIT 等。Clang历史
Apple吸收Chris Lattner的⽬的要⽐改进GCC代码优化宏⼤得多:
GCC系统庞⼤⽽笨重
⽽Apple⼤量使⽤的Objective-C在GCC中优先级很低。此外GCC作为⼀个纯粹的编译系统,与IDE配合得很差。
加之许可证⽅⾯的要求,Apple⽆法使⽤LLVM 继续改进GCC的代码质量。
于是,Apple决定从零开始写 C、C++、Objective-C语⾔的前端 Clang,完全替代掉GCC。正像名字所写的那样,Clang只⽀持C,C++和Objective-C三种C家族语⾔。
2007年开始开发,C编译器最早完成,
⽽由于Objective-C相对简单,只是C语⾔的⼀个简单扩展,很多情况下甚⾄可以等价地改写为C语⾔对Objective-C运⾏库的函数调⽤,因此在2009年时,已经完全可以⽤于⽣产环境。C++的⽀持也热⽕朝天地进⾏着。
GCC、LLVM-GCC、LLVM Compiler这三个编译选项的不同点对⽐
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 分析或是正则表达式匹配是很难达成的。GCC 优势
⽀持 JAVA/ADA/FORTRANGCC ⽀持更多平台
GCC 更流⾏,⼴泛使⽤,⽀持完备
GCC 基于 C,不需要 C++ 编译器即可编译make
make⼯具相当于⼀个智能的批处理⼯具,本⾝没有编译和链接的功能,⽽是⽤类似于批处理的⽅式通过调⽤makefile⽂件中⽤户指定的命令来进⾏编译和链接。
**⽽makefile⼜是什么? **
它⾥⾯记录了⽤户将要执⾏的⼀系列命令,make根据makefile中的命令对相应的源⽂件进⾏编译和链接的。makefile中可能就有类似的⼀下命令:gcc -o test.c。
makefile⽂件在github源码安装程序中很常见,你下载了⼀个源码包,通常在readme中会有这样的⼀句:$ make all
$ make install # root required
make all即编译所有,当然这个源码包中必须有makefile⽂件才⾏,执⾏make all这个命令后make会根据makefile中的命令进⾏编译。当然这个是“别⼈家”的源码包,这个通常都给你写好了,但是如果你⾃⼰要编译很多源⽂件的时候,也是要⾃⼰写吗?
因篇幅问题不能全部显示,请点此查看更多更全内容