GUN、GCC、LLVM和Clang

GUN

GUN的全称是GUN’s Not Unix。没错,Unix就是经常说到的Unix操作系统。很明显这里的意思是要跟Unix杠上了。它其实是一个类Unix操作系统,实现了Unix系统的标准接口,目的就是用来取代Unix操作系统。

1983年,著名的黑客大师理查德·斯托曼提出了一项GUN计划,内容就是开发一个完全自由、开放源代码的操作系统,以取代当时的Unix系统(当时的Unix系统是收费的商业软件,并且只开放了部分源代码)。这个操作系统就叫GUN,即GUN’s Not Unix的递归首字母缩写。它的LOGO是一头牛羚:

其中有一个理由是“重现当年软件界合作互助的团结精神”,就是说这份计划由个人自愿无偿参与贡献完成。那个年代开源计划真的很盛行,程序员没那么多利益思想,只有一个共同的理想,做一件对人类有益的事,很伟大!向前辈们致敬!

GUN操作系统的内核是Hurd,这个内核至今都没有完成。这也是GUN被人吐槽最多的地方。但是GUN计划完成了很多其他的功能,比如编译器、文本编辑器、shell命令集等等,这些都是非常优秀的软件工具,得到了广泛的应用。其中就包括著名的GCC编译器。

GCC

全称叫GUN Compile Collection(GUN编译器套装),是一套GUN开发的编程语言编译器。也是许多类Unix系统和MacOS操作系统的标准编译器。最初GCC只支持C语言,后来扩展到C++、Objective-C、Java等其他语言。

传统编译器是一个三层模型结构,包括前端编译器、优化器、后端编译器。前端主要负责源代码的编译解析、错误检查以及生成抽象语法树。优化器主要负责对语法树的优化,以提高代码的运行时间,比如消除冗余计算等。后端主要负责将优化后的中间代码转成机器码,这个阶段会针对不同的机器架构、指令集优化以提高代码的执行性能。

这个模型可以针对不同的语言开发不用的前端,也可以针对不用的机器架构开发使用不用的后端,只要保证中间代码一致,就可以使用同一套通用的优化方案。所以这个结构变成了下面这个样子:

大多数的解释器和编译器都实现了这个模型,比如Java和.net的虚拟机、G++、GCC等。我们着重说一下GCC,GCC支持了很多前端语言和后端架构,而且是开源的,所以得到了很多编译器爱好者支持和贡献。但是它被设计成了一个整体的应用,导致它无法被拆分成单独的库来使用,有时候我们只想使用它的某个特性,却不得不引入整个编译器代码。

这里面的原因有很多,比如它内部使用了的大量的全局变量、不合理的数据结构设计、大量的宏定义以避免重复编译、代码耦合度高、log不清晰不明确等等。

尽管这样,GCC依然是现在跨平台软件编译器的首选。
复制代码

LLVM

LLVM是Low Level Virtual Machine的首字母缩写。 本来是一个低级别的虚拟机,但现在它是一种编译器的基础程序集合,包括一些LLVM中介码、LLVM除错工具等,这个名字已经不能表达它的真实含义了,仅仅是一种沿用名称而已。它利用虚拟技术(中介码)为开发语言的编译期、链接期、运行期以及闲置期提供了优化和改良。它的创始人就是大名鼎鼎的Chris Lattner。LLVM的几大优势:

1、良好的架构设计,模块复用性高

2、引入IR(Intermediate Representation)概念,兼容性高

3、错误和警告信息提示友好,日志文件可读性强

4、与目标语言和平台无关

5、与IDE的配合良好

这里解释一下IR,LLVM编译器在传统的三层模型中加入了中介码,前端完成源码解析编译后,转成中介码,LLVM编译器针对中介码进行优化和改良,然后将中介码送入目标平台编译器生成目标代码,整个编译过程中都是中介码在参与,所以说跟目标语言和平台无关。他们的结构如下:

Clang

苹果原来默认的官方编译器是GCC,随着苹果自家的语言Objective-C不断发展,加入很多新特性,导致GCC无法满足苹果的编译要求。苹果希望找到一个高效的、模块化的、与IDE无缝结合的编译器,于是在2005年请来了Chris Lattner负责他们的编译器优化。Lattner完全抛弃了GCC,而是从头开始重新写了一个前端编译器就叫Clang。Clang只支持C家族的三门语言C、C++和Objective-C,相比于GCC,Clang的优势在于速度快、内存占用体积小、模块化、诊断信息可读性强、设计清晰扩展性强等。

目前苹果已经将官方的编译器从GCC改为了Clang+LLVM。

转载于:https://juejin.im/post/5b238f5be51d45587f49f380

你可能感兴趣的:(GUN、GCC、LLVM和Clang)