讲一个编译器的故事,Gcc和LLVM的明争暗斗

Posted 软件那些事儿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了讲一个编译器的故事,Gcc和LLVM的明争暗斗相关的知识,希望对你有一定的参考价值。


在知识星球里,有位朋友问了我两个问题:


问题1:LLVM比GCC好在哪里?

问题2:栋哥如何看待Numba项目?Numba: A High Performance Python Compiler


我回答了第一个问题:


说LLVM比Gcc强在哪里这事,还是得看历史发展的进程,先来说一个事情吧,2010年,编程界最高的奖Programming Languages Software Award给了Chris Lattner这个家伙,这个家伙是谁呢?现在的Google的TensorFlow做事情,之前在Tesla,那个做电动车的公司做自动驾驶,再往前,在Apple公司做LLVM。

他的网站是http://nondot.org/~sabre/,他在读硕士的时候,喜欢做编译器,把《Compilers: Principles, Techniques, and Tools》(以后简称龙书,国内很多高校也用这本书)这本书读了好几遍,写了一篇硕士论文,提出了自己的想法,要在编译时、链接时、运行时甚至是在闲置时优化程序的编译思想,这个思想奠定了 LLVM 的基础。我曾经下载过他的论文,他把龙书的思想推进了很多。

然后在读博士的时候,他拿来Gcc的代码,用了一小段时间,用来和他的LLVM做对比,当然了,LLVM他说是全胜,可能不是吹的,毕竟美国写论文造假会被搞死的,他在博士期间就成了名气很大的编译器专家,Apple可不是只有乔布斯,直接找到他让他来Apple做点什么,随便做点什么都行,他觉得他还是做编译器吧。

Apple,甚至Apple购买的NeXT,一直是用Gcc当官方编译器,这是开源世界的不二选择。Apple的主要语言是Objective-C,除了Apple,没有哪个公司用这个语言。但是这个语言又依赖Gcc。(题外话,Gcc这个团队,出了名的脾气大,再加上自己是唯一选择,所以,Gcc支持啥都是半吊子,除了C语言能完全支持外,对C++不能完全支持,对Objective-c不能完全支持,像Objective-c改进了C语言的内存释放机制,使用autorelease机制,要用Gcc的支持,结果Gcc不理Apple,给钱可以,给任务不行。


Apple很难过,所以Apple自己新开了一条Gcc,这导致了Gcc组新加的功能Apple用不到,Apple的Gcc和GNU的Gcc差距越来越大,如果大家用过早期的XCode的话,会发现Apple的Gcc落后于GNU的Gcc。再加上Gnu的Gcc对IDE极度不友好,Gcc就是设计为命令行工作的,谁会在意IDE,用IDE的选手都Low爆了好不好?但是Apple不这么认为,于是GNU的Gcc和Apple的Gcc产生了冲突,冲突的顶点是,如果Apple想对GNU的Gcc修改,不好意思,不能!

GNU其实也没那么“开源”,他们在2019年1月27日发了一个文件叫《GCC RUNTIME LIBRARY EXCEPTION》https://www.gnu.org/licenses/gcc-exception-3.1.html,这个条款很长,但是有几条都是刺向Apple,因为Apple也有自己的Gcc,我称之为第三方的apple-gcc, GNU,或者FSF有自己的Gcc,我称之为纯种Gcc,FSF或者GNU说,如果你们这些商业公司(主要是Apple)想使用apple-gcc优化过的代码来使用Gcc,那是不行的。【题外话,千万不要认为开源的人都是活雷锋,哪有那回事儿!!】

Apple从法律上被禁止使用Gcc了,(说好的开源呢?),当时有媒体说Apple给GNU每年捐款5000万以上,结果换来一刀透心凉。Apple没办法,不是不想使用Gcc,而是从法律上没资格再使用Gcc了,只能自己搞。

Apple就问Chris Lattner,你的编译器搞的啥样了?Chris Lattner回答说,最近在搞OpenGL的事,编译器还没太专注,只是针对OpenGL优化了一下LLVM。Apple也只能说,先别搞OpenGL了,先搞编译器吧。牛人的思路和常人不同,Chris Lattner说你搞编译器不就是为了让程序运行的快一点么?我现在搞OpenGL也是让软件运行的快一点,不冲突,两个一起搞吧。于是在Mac OS X 10.5上,LLVM能够把显卡(比如Intel GMA显卡)不支持的OpenGL指令高效的翻译成CPU指令,这个黑科技在当年还是挺让人震惊的。同时,他发布了LLVM-GCC。Chris Lattner也有一颗开源的心,他不想和GNU以及FSF闹翻,他把自己的代码同步到当时的GCC 4中,但是FSF并没有释放善意。这也是Chris Lattner在Apple时期最后一次提交代码给Gcc,他要开始自己做LLVM了。

在Apple多次试图取得改进Gcc代码的许可受阻以后,Apple 决定从零开始写 C、C++、Objective-C 语言的前端 Clang,完全替代掉 GCC。Clang 只支持 C,C++和 Objective-C 三种C家族语言。

还记得龙书么,CLang的成功代表了LLVM已经可以与Gcc抗衡了,所以,他也为LLVM选了一条龙当作Logo。

Clang的特性是编译快速,占内存少,而代码质量还比 GCC 来得高。有测评是在编译Objective-C时快3-5倍。编译时需要的内存是Gcc的1/10。最好的是,如果你用过Gcc,会发现Gcc的错误信息几乎不是给人读的,但是CLang的就是简单的英语句子,而且还给错误加了颜色,以及改正的意见,这些意见还非常的靠谱。

如果我没有记错的话,在2010年,Clang已经完全支持ISO C++标准了,Gcc搞了20多年,还不行,到今天还不行,我还特意去看了一下,gcc的官网上这么写的“GCC has experimental support for the next revision of the C++ standard, which is expected to be published in 2020.”。也就是说到2020年才可能发布一支持c++的版本,当然了,不要抱太大希望就是了。

因为我工作主要是用FreeBSD,FreeBSD现在已经是用LLVM了,哈哈。除了一引起老的C++库我还要用gcc以外,因为GNU修改了一些C++的运行库要用GPLv3,但是FreeBSD不想跟进GPLv3,所以只能用一些老的只支持GPLv2 的C++库,不久的将来,Gcc可能就从FreeBSD中消失了。

第二个问题我不会,我对Python虽然用的也比较多,但是还是不够多吧。




我在我的知识星球里会回答任何我知道的非私人隐私类问题,如果大家有什么问题想问我,希望大家订阅,而不是加了我的微信,对着屏幕拍个照片,让我debug,我一般不会回答拍屏幕的问题的。


长按下面的二维码可以以119元/年的价格加入,续费是7折,(其中包括我要交的个人所得税是20%)。




以上是关于讲一个编译器的故事,Gcc和LLVM的明争暗斗的主要内容,如果未能解决你的问题,请参考以下文章

GCC,LLVM,Clang编译器对比

编译器:gcc, clang, llvm

转:GCC,LLVM,Clang编译器对比

LLVM 5.0 编译器是不是等同于 GCC 编译器?

OS X 上的 LLVM 与 clang

使用 arm-apple-darwin10-llvm-gcc-4.2 在 MacOS 上交叉编译问题