为什么gcc和llvm会混在一起?

铂金大雕 发布于 2012/11/25 11:26
阅读 2K+
收藏 0

@踏雁寻花 你好,想跟你请教个问题:为什么gcc和llvm会混在一起?

加载中
1
JavaOlder
JavaOlder
llvm是一个底层虚拟机平台,提供了经过最佳化的IF代码,也就是有个中间层,在这个中间层可以做很多的事情,比如优化和提供给编译器更多的信息,理论上可以支持几乎任何编程语言。llvm默认的前端是clang,当然也可以用gcc做前端。
llvm用c++写的,模块化做的很好,因此可以很好的和clang,gcc等等更多的东西合作,能为ide提供更全的有用信息。而gcc则包含的比较全面,整一个是一个宏结构,没有模块化设计,用c写的,对ide也不太友好(实际上linux社区里似乎对ide一直不感冒)。不过c++版的gcc正在重写中,为了与llvm/clang更好的竞争,而且gcc从5.0开始打算进行模块化设计,所以,以后gcc内部可能会分出很多部分。
就现在来看,gcc大体等同于llvm+clang所提供的功能。
很多人特别羡慕clang那强大的错误诊断信息,其实gcc4.8部分信息诊断能力已经超过它了,比它更准确,所以竞争真的很好,我们可以用到好的东西了。gcc目前的问题就是缺乏模块化设计,这是暂时落后于llvm的地方。
freebsd不用gcc是因为gpl协议,llvm/clang的协议更加自由,但llvm/clang目前的兼容性和参数优化等等方面和gcc还有不小差距,虽然编译后的体积更小了(架构领先优势),但在性能优化方面相比gcc还有很多事情要做。
铂金大雕
铂金大雕
thx
0
赵云30
赵云30

其实,GCC的问题不是缺少模块化设计,只是GCC的模块化方式与llvm不同。

由于GCC的目标是支持多语言(C/C++、Object C、Pascal、Fortran、Ada)导致他的前端设计过于复杂,前端的C程序是有Lex/Yacc这两个程序生成的C程序,这对很多程序员就是天书,根本读不懂,即使是很有经验的程序员。

另外,GCC的另一个目标是支持多种CPU,包括X86/X64/PowePC/Sparc/Arm以及其他一些我听都没听说的过CPU。

这两个原因导致GCC过于复杂,没有哪个程序员能掌握GCC的方方面面,即使对于一些大公司来说,GCC也是不可控的,所以才有了LLVM。

另外,还没有听说FreeBSD哪个版本完全不用GCC。

0
少数派派长
少数派派长
貌似是个有趣的事情,关注一下
返回顶部
顶部