编译器:LLVM、Clang、GCC

LLVM

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

Clang

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

      Clang:是一个C、C++、Objective-C和Objective-C++编程语言的编译器前端。它采用了底层虚拟机(LLVM)作为其后端。它的目标是提供一个GNU编译器套装(GCC)的替代品。作者是克里斯·拉特纳(Chris Lattner),在苹果公司的赞助支持下进行开发,而源代码授权是使用类BSD的伊利诺伊大学厄巴纳-香槟分校开源码许可。Clang主要由C++编写。

      Clang项目包括Clang前端和Clang静态分析器等。这个软件项目在2005年由苹果电脑发起,是LLVM(Low Level Virtual Machine)编译器工具集的前端(front-end),目的是输出代码对应的抽象语法树(Abstract Syntax Tree, AST),并将代码编译成LLVM Bitcode。接着在后端(back-end)使用LLVM编译成平台相关的机器语言。

      Clang本身性能优异,其生成的AST所耗用掉的内存仅仅是GCC的20%左右。2014年1月发行的FreeBSD10.0版将Clang/LLVM作为默认编译器。
 

GCC: 

        GCC:GNU(Gnu's Not Unix)编译器套装(GNU Compiler Collection,GCC),指一套编程语言编译器,以GPL及LGPL许可证所发行的自由软件,也是GNU项目的关键部分,也是GNU工具链的主要组成部分之一。GCC(特别是其中的C语言编译器)也常被认为是跨平台编译器的事实标准。1985年由理查德·马修·斯托曼开始发展,现在由自由软件基金会负责维护工作。GCC原本用C开发,后来因为LLVM、Clang的崛起,它更快地将开发语言转换为C++。

       GCC支持的语言:原名为GNU C语言编译器(GNU C Compiler),因为它原本只能处理C语言。GCC在发布后很快地得到扩展,变得可处理C++。之后也变得可处理Fortran、Pascal、Objective-C、Java、Ada,Go与其他语言。

      许多操作系统,包括许多类Unix系统,如Linux及BSD家族都采用GCC作为标准编译器。苹果电脑预装的Mac OS X操作系统也采用这个编译器。

       GCC目前由世界各地不同的数个程序员小组维护。它是移植到最多中央处理器架构以及最多操作系统的编译器。由于GCC已成为GNU系统的官方编译器(包括GNU/Linux家族),它也成为编译与创建其他操作系统的主要编译器,包括BSD家族、Mac OS X、NeXTSTEP与BeOS。

       GCC通常是跨平台软件的编译器首选。有别于一般局限于特定系统与运行环境的编译器,GCC在所有平台上都使用同一个前端处理程序,产生一样的中介码,因此此中介码在各个其他平台上使用GCC编译,有很大的机会可得到正确无误的输出程序。

      GCC支持的主要处理器架构:ARM、x86、x86-64、MIPS、PowerPC等。

      GCC结构:GCC的外部接口长得像一个标准的Unix编译器。用户在命令行下键入gcc之程序名,以及一些命令参数,以便决定每个输入文件使用的个别语言编译器,并为输出代码使用适合此硬件平台的汇编语言编译器,并且选择性地运行连接器以制造可执行的程序。每个语言编译器都是独立程序,此程序可处理输入的源代码,并输出汇编语言码。全部的语言编译器都拥有共通的中介架构:一个前端解析匹配此语言的源代码,并产生一抽象语法树,以及一翻译此语法树成为GCC的寄存器转换语言的后端。编译器最优化与静态代码解析技术在此阶段应用于代码上。最后,适用于此硬件架构的汇编语言代码以杰克·戴维森与克里斯·弗雷泽发明的算法产出。

 

有了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采用的license是BSD,而GCC是GPLv3。

        它们使用的宏不同:

        (1)、GCC定义的宏包括:

__GNUC__
__GNUC_MINOR__
__GNUC_PATCHLEVEL__
__GNUG__

       (2)、Clang除了支持GCC定义的宏之外还定义了:

__clang__
__clang_major__
__clang_minor__
__clang_patchlevel__

 

Clang的特性:

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

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

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

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

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

当然GCC也有优势:

1、支持JAVA/ADA/Fortran

2、GCC支持平台多

3、GCC更流行,广泛使用,支持完备

4、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来产生可执行文件。

      GCC支持的主要处理器架构:ARM、x86、x86-64、MIPS、PowerPC等。

哪个好?

       我个人感觉 Apple 在开源界口碑较差(也许是我的错觉?),不过 Apple 也为开源界贡献了不少,Webkit,OpenCL(虽说只是个标准),Clang。我最为佩服的是虽然出身于命令行之上的 Unix 族系统,但有魄力写出自成体系的图形栈,其图形界面优美而人性化,可谓也为开源界贡献了自己的精神与思想。对于 Clang 这个很有潜力的项目,我希望其 C++ 支持(尤其是 template 支持)能够早日完善。因为 GCC 在 template 出错时的诊断信息如同小说一般...

 

https://linuxtoy.org/archives/llvm-and-clang.html
https://www.cnblogs.com/qoakzmxncb/archive/2013/04/18/3029105.html

https://blog.csdn.net/fengbingchun/article/details/79252110

https://blog.csdn.net/fengbingchun/article/details/79252110

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
LLVM是Apple官方支持的编译器,而该编译器的前端是Clang,这两个工具都被集成到了Xcode里面。 在很长一段时间里,Apple一直使用GCC作为官方的编译器GCC作为开源世界的编译器标准一直做得不错,但Apple对编译工具提出了更高的要求。 仗着自己在开源社区的地位,GCC 开发者对Apple的Objective-C语言新增的很多特性不予理睬,甚至当Apple想做的很多功能需要用模块化的方式来调用 GCC时,GCC却一直不给做。一般的公司遇到这种情况,可能都有些受不了,何况是乔布斯领导的Apple呢? 与GCC的不和让Apple一直在寻找一个高效的、模块化的、协议更放松的开源的编译器替代品。最终,Apple相中了Chris Lattner的LLVM。 现在依然就职于Apple的Chris Lattner可是一位大神,他于2000年毕业于俄勒冈州波特兰大学计算机科学专业,同年前往UIUC(伊利诺伊大学厄巴纳香槟分校),攻读计算机科学硕士和博士学位。在UIUC期间,他的GPA是4.0(满分),并不断地研究探索关于编译器的未知领域,发表了多篇论文。在硕士毕业论文中,他提出了一套完整的在编译时、链接时、运行时甚至是在闲置时优化程序的编译思想,奠定了LLVM的基础。 LLVM在Chris Lattner念博士时更加的成熟。首先,LLVM使用GCC作为前端来对用户程序进行语义分析产生 IF(Intermidiate Format),然后,LLVM使用分析结果完成代码优化和生成。这项研究让Chris Lattner在2005年毕业的时候,成为了小有名气的编译器专家。他也因此早早地被Apple相中,成为其编译器项目的骨干。 进入Apple之后,Chris Lattner首先在OpenGL小组做代码优化,把LLVM运行时的编译架在OpenGL栈上,这样OpenGL栈能够产出更高效率的图形代码。这个强大的OpenGL实现被用在了后来发布的Mac OS X 10.5上。同时,LLVM 的链接优化被直接加入到Apple的代码链接器上。 一个好的工具,必须要有用武之地。几年之后,LLVM的机会就来了。Mac OS X 10.6 Snow Leopard的新功能,完全得益于LLVM的技术,而这一个版本,也是将LLVM推向真正成熟的重大机遇。 “一个篱笆三个桩,一个好汉三个帮”,LLVM能够实现很多华丽的功能,要归功于LLVM自身的新前端——ClangGCC系统庞大而笨重,因此,Apple决定从零开始写C、C++、Objective-C语言的前端Clang,以求完全替代掉GCCClang于2007年开始开发,C编译器最早完成,在2009年的时候,Objective-C编译器已经完全可以用于生产环境,而在一年之后,Clang基本实现了对C++编译的支持。 Clang一个重要的特性是编译快速、占内存少,而代码质量还比GCC来得高。得益于本身健壮的架构和Apple的大力支持,Clang越来越全能,支持的项目越来越多,如Mac OS X 10.6时代的Xcode和Interface Builder等,皆由Clang编译。Clang的加入也代表着LLVM真正走向成熟。 此外,Clang有一个重要的衍生项目是静态分析工具,能够通过自动分析程序的逻辑,在编译时就找出程序可能的bug,这个功能叫做ARC。ARC的实现让当时的广大开发者们大为惊愕。 除了LLVM核心和Clang以外,LLVM还包括一些重要的子项目,比如一个原生支持调试多线程程序的调试器LLDB和一个C++的标准库libstdc++。不光是Apple,很多的项目和编程语言都从LLVM中取得了关键性的技术。 当然,上面都是扯淡,其实这个模块就是把clang的全部api、常量和数据类型声明出来了,还有写上了中文注释,但是这个东西并不常用,只能用于专业从事C/C++相关开发的才有用,比如上面提到的 静态分析,又或者我封装它的目的,根据头文件自动声明为易语言 的API、常量、数据类型。当然这个功能我没有完成,只写了一半,因为离职的原因,代码在公司电脑上,忘记带走了,然后前段时间公司给把电脑重装了,代码也没了。所以我也就把模块发上来了。 注意!!我没有上传clang.dll,这个几十M大,自己安装个llvm,到安装目录下 D:\Program Files\LLVM\bin\libclang.dll (这个是我的路径)复制到源码下就可以玩了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值