编译器GCC与Clang的异同

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都由C/C++写成,除了Ada前端大部分以Ada写成。

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作为默认编译器。

Clang性能:测试证明Clang编译Objective-C代码时速度为GCC的3倍,还能针对用户发生的编译错误准确地给出建议。

GCC与Clang区别

GCC特性:除支持C/C++/ Objective-C/Objective-C++语言外,还是支持Java/Ada/Fortran/Go等;当前的Clang的C++支持落后于GCC;支持更多平台;更流行,广泛使用,支持完备。

Clang特性:编译速度快;内存占用小;兼容GCC;设计清晰简单、容易理解,易于扩展增强;基于库的模块化设计,易于IDE集成;出错提示更友好。

Clang采用的license是BSD,而GCC是GPLv3

它们使用的宏不同

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

__GNUC__
__GNUC_MINOR__
__GNUC_PATCHLEVEL__
__GNUG__

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

__clang__
__clang_major__
__clang_minor__
__clang_patchlevel__

Clang vs GCC(GNU Compiler Collection):

Pro‘s of GCC vs clang:

(1)、GCC supports languages that clang does not aim to, such as Java, Ada, FORTRAN, Go, etc.

(2)、GCC supports more targets than LLVM.

(3)、GCC supports many language extensions, some of which are not implemented by Clang. For instance, in C mode, GCC supports nested functions and has an extension allowing VLAs in structs.

Pro‘s of clangvs GCC:

(1)、The Clang ASTs and design are intended to be easily understandable by anyone who is familiar with the languages involved and who has a basic understanding of how acompiler works. GCC has a very old codebase which presents a steep learning curve to new developers.

(2)、Clang is designed as an API from its inception, allowing it to be reused by source analysis tools, refactoring, IDEs (etc) as well as for code generation. GCC is built as a monolithic static compiler, which makes it extremely difficult to use as an API and integrate into other tools. Further, its historic design and current policy makes it difficult to decouple the front-end from the rest ofthe compiler.

(3)、Various GCC design decisions make it very difficult to reuse: its build system is difficult to modify, you can‘t link multiple targets into one binary, you can‘t link multiple front-ends into one binary, it uses a custom garbage collector, uses global variables extensively, is not reentrant or multi-threadable, etc. Clang has none of these problems.

(4)、Clang does not implicitly simplify code as it parses it like GCC does. Doing so causes many problems for source analysis tools: as one simple example, if you write"x-x" in your source code, the GCC AST will contain "0",with no mention of ‘x‘. This is extremely bad for a refactoring tool that wants to rename ‘x‘.

(5)、Clang can serialize its AST out to disk and read it back into another program, which is useful for whole program analysis. GCC does not have this. GCC‘s PCH mechanism(which is just a dump of the compiler memory image) is related, but is architecturally only able to read the dump back into the exact same executable as the one that produced it (it is not a structured format).

(6)、Clang is much faster and uses far less memory than GCC.

(7)、Clang has been designed from the start to provide extremely clear and concise diagnostics(error and warning messages), and includes support for expressive diagnostics.Modern versions of GCC have made significant advances in this area,incorporating various Clang features such as preserving typedefs in diagnostics and showing macro expansions, but GCC is still catching up.

(8)、GCC is licensed under the GPL license. clang uses a BSD license, which allows it to be embedded in software that is not GPL-licensed.

(9)、Clang inherits a number of features from its use of LLVM as a backend, including support for a bytecode representation for intermediate code, pluggable optimizers, link-time optimization support, Just-In-Time compilation, ability to link in multiple code generators, etc.

(10)、Clang‘s support for C++ is more compliant than GCC‘s in many ways.

(11)、Clang supports many language extensions, some of which are not implemented by GCC. For instance, Clang provides attributes for checking thread safety and extended vector types.

以上内容主要整理自: GCC维基百科  、  Clang维基百科 、 clang.llvm.org

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

原文地址:https://www.cnblogs.com/xkiwnchwhd/p/10316822.html

时间: 2024-10-10 11:26:30

编译器GCC与Clang的异同的相关文章

编译器:gcc, clang, llvm

clang Clang是LLVM的前端,可以用来编译C,C++,ObjectiveC等语言.传统的编译器通常分为三个部分,前端(frontEnd),优化器(Optimizer)和后端(backEnd).在编译过程中,前端主要负责词法和语法分析,将源代码转化为抽象语法树:优化器则是在前端的基础上,对得到的中间代码进行优化,使代码更加高效:后端则是将已经优化的中间代码转化为针对各自平台的机器代码.Clang则是以LLVM为后端的一款高效易用,并且与IDE结合很好的编译前端. llvm LLVM的命名

gcc或clang中消除特定警告的方法

一般在编译代码时会有相当多的警告信息,尤其当我们使用了-Wall选项的时候.-Wall绝不是像其字面意思一样打开全部警告.只是它打开的警告也相当多了.对于一些我们已知"无害"但仍然打印出来挤占可怜的控制台空间的警告,我们当然能够将其"屏蔽"掉. 就拿下面代码来说: #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <unistd.h>

ISO/IEC 9899 C语言标准(含GCC与Clang的扩展)非官方翻译

本系列博文将以ISO/IEC 9899最新的官方手册为准,然后再添加GCC以及Clang编译器对标准的扩展. 本系列博文将不仅仅是针对C编程语言(C Programming Language)标准的翻译,还有多处[译者注]以及译者个人所提供的示例代码加以说明. 本文版权由Zenny Chen©所有,任何未经许可的出版,带有商业目的的转载都将受到法律追究.若要转载,请务必指明出处.

【C++对象模型】使用gcc、clang和VC++显示C++类的内存布局

引言 各种C++实现对C++类/对象的内存布局可能有所不同,包括数据成员的顺序.虚函数表(virtual table: vtbl)的结构.继承关系的处理等.了解C++类/对象的布局,对于理解C++各种机制,正确合理地进行设计和开发有很大的帮助. 主流编译器的支持 本文所述的3款主流编译器都提供打印/导出C++类/对象的内存布局的功能,现用表格列出其特性和用法,测试用的代码文件列于文后(data.cpp) 编译器及验证版本 用法 说明 gcc 4.8.4 gcc --fdump-class-hie

gcc和MinGW的异同(在cygwin/gcc做的东西可以无缝的用在linux下,没有任何问题,是在windows下开发linux程序的一个很好的选择)

cygwin/gcc和MinGW都是gcc在windows下的编译环境,但是它们有什么区别,在实际工作中如何选择这两种编译器. cygwin/gcc完全可以和在linux下的gcc化做等号,这个可以从boost库的划分中可以看出来端倪,cygwin下的gcc和linux下的gcc完全使用的是相同的Toolsets.所以完全可以和linux一起同步更新gcc版本,而不用担心问题,并且在cygwin/gcc做的东西(不用win32的)可以无缝的用在linux下,没有任何问题.是在windows下开发

编译器gcc的几个关键参数解析

1. -dumpmachine Print the compiler's target machine 2. -print-sysroot    Print the target sysroot directory that is used during compilation. (编译期间使用到的目录) 3. -print-libgcc-file-name(或-print-file-name) 获取libgcc.a文件的路径 4. -print-search-dirs    列出gcc搜索可配

Linux开发工具集

最近工作学了不少linux下的新东西,下面这些工具主要针对c/c++,以后慢慢补充一些好用的工具. 编辑器 vim emacs kate(KDE下一个功能强大的编辑器) IDE(集成开发环境) eclipse+cdt clion qt cteator 编译器 gcc g++ clang 调试器 gdb 构建工具 cmake make 内存工具 Purify Valgrind工具集 KCachegrind 剖析工具 gprof开源剖析工具,通常作为gcc编译器的一部分. Quantify是IBM的

nodejs编译安装,npm全局安装模块

Nodejs官方网站:下载nodejs源码 Nodejs中文社区 Node Packaged Modules POSIX系统中编译Node.js需要三个工具: C++编译器gcc或clang/LLVM Python2.5以上,不支持Python3 libssl-dev提供SSL/TLS加密支持 下载源码包:node-v0.10.29.tar.gz tar zxvf node-v0.10.29.tar.gz cd node-v0.10.29 ./configure make sudo make i

如何编译MongoDB?

本文将在Linux环境下编译Mongodb. 您可以选择已经编译好的版本直接使用,也可以尝试自己编译.https://www.mongodb.org/downloads#production 官方building文档链接在:https://github.com/mongodb/mongo/blob/master/docs/building.md 动手开始: 1.Linux,本文选择Ubuntu 14.04 LTS 64bit,下载地址: http://www.ubuntu.com/downloa