`
jenth
  • 浏览: 32555 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

关于XCode编译和GCC编译的区别(转)

阅读更多

在XCode中,我们经常会看到这些编译选项(如下图),有些人可能会有些茫然,本文将对GCC4.2、LLVM GCC 4.2、LLVM compliler 2.0三个编译选项进行一个详细的介绍。

2011-03-20-002

 

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与其他语言。

 

LLVM

     LLVM 是 Low Level Virtual Machine 的简称,这个库提供了与编译器相关的支持,能够进行程序语言的编译期优化、链接优化、在线编译优化、代码生成。简而言之,可以作为多种语言编译器的后台来使用。如果这样还比较抽象的话,介绍下 Clang 就知道了:Clang 是一个 C++ 编写、基于 LLVM、发布于 LLVM BSD 许可证下的 C/C++/Objective C/Objective C++ 编译器,其目标(之一)就是超越 GCC。

 

LLVM历史

    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这三个编译选项的不同点:

CompilerOptions

 

对比    

    作为一种新的编译器,我们来看Clang和GCC各有什么优缺点:

 

    Clang特性

  1. 快:通过编译 OS X 上几乎包含了所有 C 头文件的 carbon.h 的测试,包括预处理 (Preprocess),语法 (lex),解析 (parse),语义分析 (Semantic Analysis),抽象语法树生成 (Abstract Syntax Tree) 的时间,Clang 是 Apple GCC 4.0 的 2.5x 快。(2007-7-25)
  1. 内存占用小:Clang 内存占用是源码的 130%,Apple GCC 则超过 10x。
  2. 诊断信息可读性强:我不会排版,推荐去网站观看。其中错误的语法不但有源码提示,还会在错误的调用和相关上下文的下方有~~~~~和^的提示,相比之下 GCC 的提示很天书。
  3. GCC 兼容性。
  4. 设计清晰简单,容易理解,易于扩展增强。与代码基础古老的 GCC 相比,学习曲线平缓。
  5. 基于库的模块化设计,易于 IDE 集成及其他用途的重用。由于历史原因,GCC 是一个单一的可执行程序编译器,其内部完成了从预处理到最后代码生成的全部过程,中间诸多信息都无法被其他程序重用。Clang 将编译过程分成彼此分离的几个阶段,AST 信息可序列化。通过库的支持,程序能够获取到 AST 级别的信息,将大大增强对于代码的操控能力。对于 IDE 而言,代码补全、重构是重要的功能,然而如果没有底层的支持,只使用 tags 分析或是正则表达式匹配是很难达成的。

     当然,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

http://www.programmer.com.cn/9436/

分享到:
评论

相关推荐

    Linux gcc 安装包

    用于Linux操作系统的c语言编译程序,作为GUN的成员,gcc可是大有名头,他被许多集成开发环境所应用,比如Mac的Xcode,很好使。

    sushi:Xcode,Visual Studio和Ninja项目生成器

    Xcode和Visual Studio项目文件为maki文件(.sushi项目文件)建立初始文件格式sushi.xcodeproj和sushi.vsproj由maki生成忍者当前仅支持静态构建(概念验证) 需要工具链搜索,可配置的前缀和交叉编译支持去做可配置...

    garrysmod_common:基于Garry Mod的编译项目通用位的存储库

    在Linux上,请使用GCC (更新得越多,经过GCC 9检验的更好,更老的版本(如GCC 4和GCC 5)可能会引发C ++编译错误)。 在MacOS,任何的Xcode(使用GCC编译器)版本可能会奏效。 除非(这些规则是先前规则的补充)...

    [修复下载链接]iPhone5S和iPad4上编译C/C++

    经测试,本软件可以编译 复杂命令行程序、运用了各种Framework的IPA程序、cmake、SDL2库、运用了SDL2的程序、同时运用SDL2和UIKit的程序、纯算法程序。 0、成分: 除了基础包下载地址之外 (太大了,传不上来), ...

    使用Xcode工具静态检查分析代码

    使用Xcode工具静态检查分析代码!Clang是一个C、C++和Objective-C编程语言...  Clang静态分析和Instruments来剖析代码有一些不同,Clang更致力于在编译的过程中通过自身的一套判断机制来找出代码中潜在的隐患。  在XC

    ffmpeg X 2012-1-18

    2.优于ffmpeg,支持:windows,android,mac/ios,和原生linux等系统,VS,xcode,gcc等可以直接编译。 在原生ffmpeg基础上改进的由于工作量巨大,希望有共同的朋友一起搞这个开源项目 由于原ffmpeg设计只是基于linux...

    macportsGCCfixup:使Macports GCC更好地编译OSX的一些扩展

    使用GCC 4.6和Xcode 4构建资料来源: 注意:这是从2012年开始的博客文章的复活,该博客现已失效。 我将其移至此处,是因为我认为它的某些部分虽然仍然确定已过时,但仍会有些用处,并且我不确定用于替换此处使用的...

    nestedvm:来自 git.megacz.com 的 NestedVM 克隆,在 OSX 上的 Java 1.8 下构建,创建 gcc 4.8.3 以编译为 JVM 汇编程序

    自 2009 年以来,此 fork 集成了多个补丁和添加项,此版本已修改为使用 Xcode 6.1 编译器和 Homebrew 在 OSX 10.9.5 (Mavericks) 上构建。 构建的 gcc 是 4.8.2,并使用 newlib-1.20。 Classgen 由 git 拉取,目前...

    iOS逆向教程之动态调试详解

    首先了解一下 Xcode 编译和调试器的发展。Xcode 中的编译器发展历程:GCC -> LLVM,调试器的发展历程:GDB -> LLDB 。 Xcode 调试安装到手机上的应用的原理:Xcode 通过 LLDB 调试器把调试指令发送到手机上的 ...

    夜莺:夜莺乐谱软件

    夜莺 开发环境要求 下载需要一个Apple Developer帐户; 他们不需要付费的iOS或MacOS订阅。... 但是应该可以使用Xcode 7和8进行编译。 以下环境可能有效; 它为一个人(Geoff C.)做过,但另一个人(Do

    Libraries-OLD:带有构建脚本的OS X和iOS的各种预编译开源库

    (*) (具有PNG和JPEG支持) (默认线程模式设置为多线程,即SQLITE_THREADSAFE = 2) (*)请参阅libjpeg-turbo-users邮件列表中的,以获取有关使用Clang而不是GCC编译库时性能下降的重要信息。 建造要(重新)...

    利用C语言实践OOP,以及new,delete的深入分析

    研究了一下,总算勉强能够融会贯通了c写成OOP还蛮有乐趣的编译环境:Xcode3.2.3+gcc4.2 代码如下:#ifndef OBJECT_H#define OBJECT_Htypedef void (*Execute)(struct Object *a_This);typedef struct Object* (*...

    VS Code中配置C-C++环境.md

    您需要安装一个C/C++编译器,例如GCC、Clang或Microsoft Visual C++,以便编译和运行C/C++代码。 - **Windows**:您可以安装MinGW或者使用Visual Studio自带的编译器。 - **MacOS**:您可以在终端中运行`xcode-...

    SmartDeviceLink在Mac上运行的配置流程1

    SmartDeviceLine在Mac上运行的配置流程概要说明系统: mac os x 10.8 64位编译工具: gcc, cmake, xcode实现功能:

    librf:基于C++ Coroutines编写的无栈协程库

    Mac: 使用XCode 11.2.1 自带的apple-clang编译 Ubuntu: 使用GCC 10.0.1/clang 9 编译(2020-04-18:mutex ranged lock failed) 注意:GCC 10.0.1在C++ Coroutines上存在很多BUG,并且缺少对应的头文件。 当前阶段不...

    mirdeep2:从小RNA测序数据中发现已知和新颖的miRNA

    miRDeep2 README 关于 作者:塞巴斯蒂安·麦克科维克(Sebastian ...安装了Xcode和gcc编译器的MacOSX。 (这可以从appstore中获得,如果安装有任何问题,请在线寻求帮助)。 要编译Vienna软件包,可能需要安装G

    matlab拟合求解代码-FLIMfit:最先进的荧光寿命成像分析软件

    编译和运行 FLIMfit 该软件已使用 Visual Studio 2012 在带有 Matlab 2014b 的 Windows 7 上进行了广泛测试,它已被证明可以在 MacOS X 下使用 XCode 4 和 Homebrew GCC4.7 以及在 Linux 下使用 GCC 4.7 进行编译。 ...

    Clang GNUstep Objective C for Windows

    可以使用GNUstep在Windows XP上寫Objective-C程式,但是Objective-C已經加了很多新東西,而GNUstep裡的gcc並不提供,所以,这个是GNUstep,再加上新一代的編譯器架構Clang與LLVM(這也是Apple在新版Xcode裡預設使用...

    CppMicroServices:一个类似于OSGi的C ++动态模块系统和服务注册表

    GCC 5.4和8.0 Visual Studio 2015 Xcode 7.3和11.6 Visual Studio 2017 铛3.5和6.0 Visual Studio 2019 MinGW-w64 掌握 发展 C ++微服务 介绍 C ++微服务项目是用于构建模块化和动态面向服务的应用程序的...

    pstore:与程序存储库一起使用的持久性存储

    其设计目标是: 性能接近内存哈希表对并行编译的良好支持多个指标进行中目录建立pstore先决条件pstore在各种平台上构建和测试: Ubuntu Linux 14.04 LTS Trusty Tahr:使用GCC 5.5.0和GCC 9.2.1构建Ubuntu Linux ...

Global site tag (gtag.js) - Google Analytics