为什么FreeBSD不赞成使用GCC而赞成Clang / LLVM?


241

所以我在网上逛逛,偶然发现了这篇文章。从根本上说,从版本10及更高版本开始,FreeBSD将弃用GCC,而推荐使用Clang / LLVM

从到目前为止我在网上看到的内容来看,Clang / LLVM是一个相当雄心勃勃的项目,但是就可靠性而言,它不能与GCC相匹配。

FreeBSD选择LLVM作为其编译器基础结构是否有任何技术原因,还是整个事情归结为永恒的GNU / GPL与BSD许可?

这个问题(以某种方式)具有有关FreeBSDGCC用法的相关信息。

Answers:


361

简介: GCC切换到Clang的主要原因是GCC的GPL v3许可证与FreeBSD项目目标不兼容。还存在与公司投资以及用户群需求有关的政治问题。最后,预期的技术优势与标准合规性和调试简便性有关。实际的编译和执行性能改进是特定于代码的,值得商;;两种编译器都可以使用。

FreeBSD和在GPL: FreeBSD的具有与GPL不安的关系。BSD许可证的拥护者认为,真正的免费软件没有使用限制。GPL的倡导者认为,限制是保护软件自由所必需的,特别是从自由软件创建非自由软件的能力是一种不公正的权力形式,而不是自由。FreeBSD项目在可能的情况下尽量避免使用GPL

由于在GPL软件的商业使用中可能会增加其他复杂性,因此,我们会尽一切可能在FreeBSD许可下尽力用更宽松的FreeBSD许可来替换此类软件。

FreeBSD和在GPL v3的:GPL v3的明确禁止所谓Tivoisation的代码,在一个漏洞GPL v2协议,这使硬件限制用户以禁止,否则法律修改软件。对于FreeBSD社区中的许多人来说,弥补这一漏洞是不可接受的步骤

如果当前已获得GPLv2许可的大量软件迁移到新许可证,则设备供应商尤其遭受最大的损失。他们将不再具有使用GPLv3软件的自由并限制对其硬件上安装的软件的修改...总之,大量的OpenSource消费者突然对了解GPL许可软件的替代品非常感兴趣。

由于GCC转向了GPL v3,FreeBSD被迫保留使用GCC 4.2.1(GPL v2),该版本于2007发布,现在已经大大过时了。即使运行旧的编译器和向后移植修复程序会带来额外的维护麻烦,FreeBSD仍不会使用更现代的GCC版本,这一事实使人们对避免使用GPL v3的需求有一定的了解。C编译器是FreeBSD基础的主要组成部分,“ FreeBSD 10的(暂定)目标之一是不使用GPL的基础系统 ”。

企业投资:与许多大型开源项目一样,FreeBSD也从企业那里获得资金开发工作。尽管不容易发现FreeBSD由Apple资助或进行开发的程度,但是由于Apple的Darwin OS使用了源于BSD的大量内核代码,因此存在很大的重叠。此外,Clang本身最初是一个内部Apple项目,然后于2007年开源。由于公司资源是FreeBSD项目的关键推动因素,因此满足赞助商的需求可能推动现实发展的重要因素

用户群: FreeBSD是许多公司有吸引力的开源选项,因为许可简单,无限制且不太可能引起诉讼。随着GPL v3的到来和新的反Tivoisation条款的出现,已经表明,由供应商驱动加速趋势是向许可更多的许可。由于FreeBSD对商业实体的明显优势在于其许可许可,因此,企业用户群体面临越来越大的压力,要求他们放弃GCC和GPL。

GCC的问题:除了许可证外,使用GCC还存在一些已知问题。GCC不完全符合标准,并且具有ISO标准C中未发现的许多扩展。它拥有超过300万行代码,也是“ 最复杂和免费/开源软件项目之一 ”。这种复杂性使发行级代码修改成为一项艰巨的任务。

技术优势:与GCC相比, Clang确实具有一些技术优势。最值得注意的是更多有用的错误消息,以及为IDE,重构和源代码分析工具设计的API。尽管Clang网站提供的图表表明编译和内存使用效率更高,但实际结果却变化很大,并且与GCC的性能大致相符。通常,使用Clang生成的二进制文件比等效的GCC二进制文件运行速度更慢

虽然使用LLVM比GCC更快地构建代码...在大多数情况下,GCC 4.5内置的二进制文件的性能优于LLVM-GCC或Clang ...在其余测试中,性能要么接近于GCC,要么很好背后。在某些测试中,Clang生成的二进制文件的性能简直糟透了。

结论:编译效率极不可能有很大的动力去冒将FreeBSD这样的大型项目迁移到全新的编译器工具链的巨大风险,尤其是在缺乏二进制性能的情况下。但是,这种情况确实不成立。可以选择以下选项之一:1)运行过期的GCC,2)迁移到现代GCC并被迫使用与项目目标不兼容的许可证,或者3)迁移到稳定的BSD许可的编译器,该决定可能是不可避免的。请记住,这仅适用于基本系统,并受发行版的支持;没有什么可以阻止用户自己在FreeBSD盒子上安装和使用现代GCC的。


4
您引用的基准来自旧版本的Clang。最近版本的基准似乎与最近版本的基准更接近。我自己对简单程序的研究使Clang 3.0比GCC 4.6快了百分之几,但在线程版本上GCC快了20%。phoronix.com/scan.php?page=news_item&px=MTA5Nzc是更新的Phoronix基准。
肖恩

6
“ GCC并非完全符合标准”:是否可以使用编译器开关来强制符合给定标准?
乔治

4
首先,不要过多地阅读Phoronix基准测试,或者根本不要阅读它们。其次,确实是默认情况下,除非您明确指定标准,否则GCC并不完全符合标准,如果您没有明确指定标准,则也将启用GNU扩展,但这似乎是使用Clang的奇怪原因,因为他们也正在实现最常用的GNU扩展,因为它们努力使Clang成为替代GCC的替代品。
kyrias 2013年

1
@Giorgio:否。有关示例,请参见gcc.gnu.org/c99status.html-只是C99(现在已经14岁了)。还有gcc.gnu.org/onlinedocs/libstdc++/manual/status.html-clang对这两者都有更好的支持(我认为它是完整的;如果没有,那肯定至少更好)。
TimČas2013年

4
@Demizey我没有为Phoronix辩护,但是如果您要解雇某件事情,则至少应提供有效的理由。
Mario

38

值得考虑的一件事是,正如ire_and_curses回答中指出的那样,FreeBSD当前正在使用GCC 4.2.1,因此性能比较与4.5甚至4.6都不与项目真正相关。因此,您应该问的问题是:

  1. 该项目使用的新Clang与较旧的GCC有哪些性能提升?

  2. 在GCC 4.2.1中编译的相同二进制文件与新Clang相比如何?

由于GCC转向了GPL v3,FreeBSD被迫保留使用GCC 4.2.1(GPL v2),该版本于2007年发布,现在已经大大过时了。

如果Clang落后于当前的GCC,但仍比该项目中已实施的GCC提前数年,那么他们的发展决定是有充分根据的,而且是真正的启发。


19

即使GCC是GPLv3,由GCC生成的二进制文件也从未受到任何许可证约束。显然,您可以使用GCC来构建属于您想要的许可范围内的软件。即使GCC随附的C库(包含在二进制文件中)也是免许可证的。http://www.gnu.org/licenses/gcc-exception-faq.html

GNU GPLv3第2节:

您有权传播通过将运行时库与独立模块结合而形成的目标代码的工作,即使这种传播否则会违反GPLv3的条款,但前提是所有目标代码均由合格的编译过程生成。然后,您可以根据自己选择的条件传达这些组合,并与独立模块的许可相一致。

“合格”表示该编译不涉及GCC和不兼容GPL的软件。这不是一个限制:可以在涉及GNU GCC的构建过程中使用BSD许可的软件。

如您所见,与上面所说的相反,没有与REAL许可证相关的理由退出GCC,因为在FreeBSD中使用GCC并不存在兼容性。

这种变化背后的真正原因是政治和机会主义:

  • BSD拥有自己的许可,从哲学上讲与GNU Public许可竞争(如上面的* ire_and_curses *所述),
  • CLANG是由FreeBSD的发起者发起的新的非GPL编译器,在技术上似乎等同于GPL许可的GCC(如上所述,* ire_and_curses *)。

这些事实为FreeBSD创造了一个摆脱GCC并摆脱它的机会:它们实际上并没有被法律强制,因为他们仍然可以使用GCC来构建免费的或BSD许可的软件,但是他们希望坚持使用。 “所有BSD许可软件”的理念。


5
抱歉,我不得不将其否决。不幸的是,您对BSD和软件价格低廉不熟悉。仅出于记录,是BSD从90年代初开始从其传统的便携式C编译器(PCC)转换为GCC的政治决定而非技术决定。lang是Apple专案!由于有人每天都在使用GCC来生活在OpenBSD上并试图回到PCC,所以您在所有情况下都是错误的。
Predrag Punosevac

5
这与生成的二进制文件无关,而与gcc是FreeBSD的一部分有关,因此许可证约束确实很重要。
sstn

3
如果项目的宗教信仰是“ No GPLv3”,那么技术方面就会消失-想象一下他们正在使用例如Microsoft编译器。
托尔比约恩Ravn的安徒生

3
这是正确指出的唯一答案license of compiler != license of end product。除非用户不理解该许可证,否则有关编译器许可证的投诉可能不相关。
Brandin 2014年

6
这与生成的二进制文件是否属于GPLv3无关,而与编译器本身的更改是否要求符合GPLv3无关。硬件供应商经常修改库存编译器以更好地使用其硬件,或以专有方式利用硬件。对于此类组织来说,消除自定义更改必须符合GPLv3或采取法律行动的风险是很重要的。真正重要的是编译器的许可证。
David Harks,2014年

7

我不是专家,但我的理解是Clang / LLVM使用的资源少于GCC,而且速度更快。

http://clang.llvm.org/features.html#performance

如果您正在运行一个需要大量构建很多东西的环境,那么这种性能可能会真正节省能源成本和时间。如果是真的。


次要的..还有一些工具可以进一步减少重复的编译时间-ccache.samba.org不必担心并行编译 的明显可能性(请参阅distcc),在大型项目中链接时间往往更难解决
Rob11311 2014年

是的,非常好,但是生成的二进制代码更慢; p
rustyx 2014年

1
@rustyx不能与gcc 4.2相比!
Miles Rout
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.