转自: http://www.cnblogs.com/qoakzmxncb/archive/2013/04/18/3029105.htmlphp
在XCode中,咱们常常会看到这些编译选项(以下图),有些人可能会有些茫然,本文将对GCC4.二、LLVM GCC 4.二、LLVM compliler 2.0三个编译选项进行一个详细的介绍。html
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与其余语言。express
LLVM编程
LLVM 是 Low Level Virtual Machine 的简称,这个库提供了与编译器相关的支持,可以进行程序语言的编译期优化、连接优化、在线编译优化、代码生成。简而言之,能够做为多种语言编译器的后台来使用。若是这样还比较抽象的话,介绍下 Clang 就知道了:Clang 是一个 C++ 编写、基于 LLVM、发布于 LLVM BSD 许可证下的 C/C++/Objective C/Objective C++ 编译器,其目标(之一)就是超越 GCC。安全
LLVM历史iphone
Apple(包括中后期的NeXT) 一直使用GCC做为官方的编译器。GCC做为开源世界的编译器标准一直作得不错,但Apple对编译工具会提出更高的要求。编程语言
一方面,是Apple对Objective-C语言(甚至后来对C语言)新增不少特性,但GCC开发者并不买Apple的账——不给实现,所以索性后来二者分红两条分支分别开发,这也形成Apple的编译器版本远落后于GCC的官方版本。另外一方面,GCC的代码耦合度过高,很差独立,并且越是后期的版本,代码质量越差,但Apple想作的不少功能(好比更好的IDE支持)须要模块化的方式来调用GCC,但GCC一直不给作。甚至最近,《GCC运行环境豁免条款 (英文版)》从根本上限制了LLVM-GCC的开发。 因此,这种不和让Apple一直在寻找一个高效的、模块化的、协议更放松的开源替代品,因而Apple请来了编译器高材生Chris Lattner(2000年,本科毕业的Chris Lattner像中国多数大学生同样,循序渐进地考了GRE,最终前往UIUC(伊利诺伊大学厄巴纳香槟分校),开始了艰苦读计算机硕士和博士的生涯。在这阶段,他不只周游美国各大景点,更是努力学习科学文化知识,翻烂了“龙书”(《Compilers: Principles, Techniques, and Tools》),成了GPA牛人【注:最终学分积4.0满分】,以及不断地研究探索关于编译器的未知领域,发表了一篇又一篇的论文,是中国传统观念里的“三好学生”。他的硕士毕业论文提出了一套完整的在编译时、连接时、运行时甚至是在闲置时优化程序的编译思想,直接奠基了LLVM的基础。LLVM在他念博士时更加成熟,使用GCC做为前端来对用户程序进行语义分析产生IF(Intermidiate Format),而后LLVM使用分析结果完成代码优化和生成。这项研究让他在2005年毕业时,成为小有名气的编译器专家,他也所以早早地被Apple相中,成为其编译器项目的骨干)。模块化
刚进入Apple,Chris Lattner就大展身手:首先在OpenGL小组作代码优化,把LLVM运行时的编译架在OpenGL栈上,这样OpenGL栈可以产出更高效率的图形代码。若是显卡足够高级,这些代码会直接扔入GPU执行。但对于一些不支持所有OpenGL特性的显卡(好比当时的Intel GMA卡),LLVM则可以把这些指令优化成高效的CPU指令,使程序依然可以正常运行。这个强大的OpenGL实现被用在了后来发布的Mac OS X 10.5上。同时,LLVM的连接优化被直接加入到Apple的代码连接器上,而LLVM-GCC也被同步到使用GCC4代码。
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和GCC各有什么优缺点:
Clang特性
固然,GCC 也有其优点:
要选择哪一个
那么三个编译选项,要选择哪个呢?目前不推荐使用老的GCC4.2,由于苹果不会维持它了,并且LLVM-GCC看起来会更好。在项目中途改编译选项但是一个大变更,因此,若是你要改,固然须要通过慎重完整的测试。
对新的项目而言,LLVM-GCC看起來应该是个安全的选择,苹果公司认为它够稳定够成熟,因此才把它当作Xcode 4的预设选项(你或许不会把稳定成熟这两个字眼跟Xcode 4自己画上等号),并且,既然选项使用的是GCC parser,向后兼容性应该没问题。
我说LLVM-GCC是个安全的选项,但我并非指Clang/LLVM比较不安全,只是成熟度还沒那么高效了,我将一些之前的代码拿到Xcode 4上,使用LLVM 2.0编译器从新编译,到目前为止还沒发现任何问题。
参考文档:
http://baike.baidu.com/view/4848.htm
http://hi.baidu.com/zhanghuikl/blog/item/71e8a6018172df0f728da53e.html