LLVM和GCC的区别

转载 2018年04月17日 11:00:42

最近在Mac OS X Mountain Lion下用Xcode进行开发,发现在编译选项里有如下所示的这两种编译器:一个是Apple LLVM compiler 4.2,另外一个是LLVM GCC 4.2。

Xcode Compiler Setting

近几年一直听人说LLVM比GCC好,但是我一直没有时间研究这二者的差别。由此问题出发,我又给自己抛出了很多疑问:

  • cc, c89, c99是什么?有何区别?
  • gcc, g++, cpp, gpp又是什么?
  • LLVM与GCC区别大吗?
  • Apple LLVM compiler 4.2和LLVM GCC 4.2有何区别?
  • LLVM GCC 4.2到底是LLVM还是GCC?

接下来让我们一起补补历史课。

CC, C89, C99

Unix诞生之后,很多公司都开发了自己的Unix系统并且使用了自己专门的编译器。这样就导致在不同的Unix系统上,想编译C语言代码就需要使用不同的命令。于是POSIX标准Commands and Utilities中就规定了将CC作为不同编译器的统一命令接口,并且也规定了CC命令需要提供哪些必须的参数。

随着后续ISO C标准的确定,POSIX标准又规定分别将C89C99作为ISO C的接口,而CC则继续作为非标准C的接口。但实际上后续大多数C语言编译器都实现了ISO C标准,所以POSIX标准规定后续应将CC这一历史遗留的命令取消。

GCC, G++, CPP, GPP

随着开源运动的兴起,自由软件基金会开发了自己的开源免费的C语言编译器GNU C Compiler,简称GCC。GCC中提供了C Preprocessor这个C语言的预处理器,简称CPP。后来GCC又加入了对C++等其它语言的支持,所以他的名字也改为GNU Compiler Collection。G++则是专门用来处理C++语言的。在GNU的官方手册中,有一个章节叫做G++ and GCC介绍了这二者的区别。G++是GCC编译器集合的一个前端。关于前端、后端的概念下面有更详细的介绍。而GPP呢,这个名字比较特殊,如果你用的是Linux系统,可能并没有这个命令。但是在某些特殊的系统下,例如DOS,是无法创建G++这样带有特殊符号的文件名的。所以按照DJGPP编译器的做法,GPP其实就是G++。

LLVM与GCC

回顾GCC的历史,虽然它取得了巨大的成功,但开发GCC的初衷是提供一款免费的开源的编译器,仅此而已。可后来随着GCC支持了越来越多的语言,GCC架构的问题也逐渐暴露出来。但GCC到底有什么问题呢?我们一起看看这篇文章:The Architecture of Open Source Applications: LLVM。LLVM的优点也正是GCC的缺点。

传统编译器

传统编译器的工作原理基本上都是三段式的,可以分为前端(Frontend)、优化器(Optimizer)、后端(Backend)。前端负责解析源代码,检查语法错误,并将其翻译为抽象的语法树(Abstract Syntax Tree)。优化器对这一中间代码进行优化,试图使代码更高效。后端则负责将优化器优化后的中间代码转换为目标机器的代码,这一过程后端会最大化的利用目标机器的特殊指令,以提高代码的性能。

simpleCompiler

事实上,不光静态语言如此,动态语言也符合上面这个模型,例如Java。Java Virtual Machine也利用上面这个模型,将Java代码翻译为Java bytecode。

这一模型的好处是,当我们要支持多种语言时,只需要添加多个前端就可以了。当需要支持多种目标机器时,只需要添加多个后端就可以了。对于中间的优化器,我们可以使用通用的中间代码。

Retargetable Compiler

这种三段式的结构还有一个好处,开发前端的人只需要知道如何将源代码转换为优化器能够理解的中间代码就可以了,他不需要知道优化器的工作原理,也不需要了解目标机器的知识。这大大降低了编译器的开发难度,使更多的开发人员可以参与进来。

虽然这种三段式的编译器有很多有点,并且被写到了教科书上,但是在实际中这一结构却从来没有被完美实现过。做的比较好的应该属Java和.NET虚拟机。虚拟机可以将目标语言翻译为bytecode,所以理论上讲我们可以将任何语言翻译为bytecode,然后输入虚拟机中运行。但是这一动态语言的模型并不太适合C语言,所以硬将C语言翻译为bytecode并实现垃圾回收机制的效率是非常低的。

GCC也将三段式做的比较好,并且实现了很多前端,支持了很多语言。但是上述这些编译器的致命缺陷是,他们是一个完整的可执行文件,没有给其它语言的开发者提供代码重用的接口。即使GCC是开源的,但是源代码重用的难度也比较大。

LLVM

LLVM最初是Low Level Virtual Machine的缩写,定位是一个虚拟机,但是是比较底层的虚拟机。它的出现正是为了解决编译器代码重用的问题,LLVM一上来就站在比较高的角度,制定了LLVM IR这一中间代码表示语言。LLVM IR充分考虑了各种应用场景,例如在IDE中调用LLVM进行实时的代码语法检查,对静态语言、动态语言的编译、优化等。

LLVM Compiler

从上面这个图中我们发现LLVM与GCC在三段式架构上并没有本质区别。LLVM与其它编译器最大的差别是,它不仅仅是Compiler Collection,也是Libraries Collection。举个例子,假如说我要写一个XYZ语言的优化器,我自己实现了PassXYZ算法,用以处理XYZ语言与其它语言差别最大的地方。而LLVM优化器提供的PassA和PassB算法则提供了XYZ语言与其它语言共性的优化算法。那么我可以选择XYZ优化器在链接的时候把LLVM提供的算法链接进来。LLVM不仅仅是编译器,也是一个SDK。

pass linkage

Apple LLVM compiler 4.2和LLVM GCC 4.2

现在我们可以回答本文最前面我遇到的那个问题了。Apple LLVM compiler 4.2是一个真正的LLVM编译器,前端使用的是Clang,基于最新的LLVM 3.2编译的。LLVM GCC 4.2编译器的核心仍然是LLVM,但是前端使用的是GCC 4.2编译器。从LLVM的下载页面可以看出,LLVM从1.0到2.5使用的都是GCC作为前端,直到2.6开始才提供了Clang前端。


转载自:LLVM和GCC的区别

Linux编程之GCC编译工具实战

-
  • 1970年01月01日 08:00

GCC与LLVM见解

首先的说GCC(GNU Compiler Collection,GNU编译器集合)是一个优秀的编译器 ,但是它跟IDE之间的互操作性不够好,编译器分为编译器前端和编译器后端,前端主要负责展开预处理器宏...
  • u013770512
  • u013770512
  • 2014-03-20 23:36:14
  • 979

LLVM VS GCC

1.1 LLVM是什么 LLVM是什么?这是一个虽然基础,但是也曾经让很多新入门的人迷惑的一个问题。从字面上来讲,LLVM(Low Level Virtual Machine)是一个底层虚拟机,LL...
  • prike
  • prike
  • 2017-05-01 13:40:18
  • 520

LLVM与Clang的概述及关系

LLVM是构架编译器(compiler)的框架系统,以C++编写而成,用于优化以任意程序语言编写的程序的编译时间(compile-time)、链接时间(link-time)、运行时间(run-time...
  • talentedlas
  • talentedlas
  • 2016-07-18 21:07:54
  • 1704

编译器(GNU & GCC & clang & llvm)

前言: 很多时候,出现一些类似GNU,GCC,CLANG,LLVM等与编译器有关的名词的时候,都不太清楚它到底是干嘛的,理解这些东西后, 对于xcode中很多配置型的需求修改起来都会得心应手,因此有必...
  • itianyi
  • itianyi
  • 2015-01-23 16:19:21
  • 19121

llvm vs gcc 我被雷到了, 速度相差300多倍,你还用GCC吗!【转】

相同的代码。300倍的速度差别。GCC真老了!#include #include #include #include int main() {     char s[] = " select ...
  • jolinxia
  • jolinxia
  • 2014-06-01 12:59:44
  • 1095

llvm-clang和llvm-gcc

原文转载:http://www.cnblogs.com/qoakzmxncb/archive/2013/04/18/3029105.html GCC     GCC(GNU Compi...
  • becomedragonlong
  • becomedragonlong
  • 2015-02-05 12:30:48
  • 582

Clang、LLVM与GCC介绍

先解释下Clang、LLVM与GCC: LLVM :命名最早源自于底层虚拟机(Low Level Virtual Machine)的缩写。LLVM 核心库提供了与编译器相关的支持,可以作为多种语言编译...
  • weichuang_1
  • weichuang_1
  • 2015-09-21 20:09:14
  • 354

Apple LLVM compiler 4.2 与LLVM GCC的区别

某些项目采用了一些第三方库,有时候可能会因为编译方式的不同导致无法项目编译通过,目前xcode 最新的默认的Compiler for C/C++/Objective C为apple LLVM comp...
  • O_surface_O
  • O_surface_O
  • 2013-06-26 13:09:18
  • 3304

你或许应该知道的LLVM

原文链接 作为iOS或者Mac开发者,你也许非常眼熟LLVM这个字眼,但也许没有太去在意它。在很长的一段时间内,我就是处于这个状态,不知道它背后是在干嘛。随着苹果新语言swift的发布,我看...
  • khlljm
  • khlljm
  • 2016-07-04 18:57:30
  • 7443
收藏助手
不良信息举报
您举报文章:LLVM和GCC的区别
举报原因:
原因补充:

(最多只允许输入30个字)