从到目前为止我在网上看到的内容来看,Clang / LLVM是一个相当雄心勃勃的项目,但是就可靠性而言,它不能与GCC相匹配。
技术原因FreeBSD选择LLVM作为其编译器基础结构,还是整个事情归结为永恒的GNU / GPL与BSD许可证?在FreeBSD中
#1 楼
简介:从GCC切换到Clang的主要原因是GCC的GPL v3许可证与FreeBSD项目的目标不兼容。还存在与公司投资以及用户群需求有关的政治问题。最后,预期的技术优势与标准合规性和调试简便性有关。实际的编译和执行性能改进是特定于代码的,值得商;;FreeBSD和GPL都可以成立。FreeBSD与GPL的关系不固定。 BSD许可证倡导者认为,真正的免费软件没有使用限制。 GPL的倡导者认为,限制是保护软件自由所必需的,尤其是从自由软件创建非自由软件的能力是一种不公正的权力形式,而不是自由。 FreeBSD项目在可能的情况下尝试避免使用GPL:
由于在商业使用GPL软件时可能会演变出更多的复杂性,因此我们但是,只要有可能,就努力用更宽松的FreeBSD许可下的提交替换此类软件
。
FreeBSD和GPL v3:GPL v3明确禁止所谓的代码转换,是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从公司那里获得资金和开发工作。尽管不容易发现由Apple资助或开发FreeBSD的程度,但是由于Apple的Darwin OS使用了源于BSD的大量内核代码,因此存在很大的重叠。此外,Clang本身最初是一个内部Apple项目,然后于2007年开源。由于公司资源是FreeBSD项目的关键推动力,因此满足赞助商的需求可能是一个重要的现实驱动力。
Userbase:FreeBSD是许多公司有吸引力的开源选项,因为许可简单,无限制且不太可能引起诉讼。随着GPL v3的到来和新的反Tivoisation条款的出现,已经表明,由供应商驱动的加速趋势是向许可更多的许可。由于FreeBSD对商业实体的明显优势在于其许可许可,因此,企业用户群越来越有压力要退出GCC和GPL。
GCC的问题:除了许可证,使用GCC还有一些已知的问题。 GCC并非完全符合标准,并且具有ISO标准C中未发现的许多扩展。它具有超过300万行代码,它也是“最复杂的自由/开源软件项目之一”。这种复杂性使发行版级代码修改成为一项具有挑战性的任务。
技术优势:与GCC相比,Clang确实具有一些技术优势。最值得注意的是更多有用的错误消息以及为IDE,重构和源代码分析工具设计的API。尽管Clang网站提供的图表显示了更有效的编译和内存使用情况,但实际结果却变化很大,并且与GCC性能大致相符。通常,用Clang生成的二进制文件比等效的GCC二进制文件运行得更慢:
虽然在大多数情况下,使用LLVM编译代码的速度比GCC要快... 4.5个内置二进制文件的性能优于LLVM-GCC或Clang ...在其余测试中,性能
接近GCC或落后于GCC。在某些测试中,用Clang生成的二进制文件的性能简直太糟糕了。
结论:编译效率极不可能成为承担重大风险的重要动机。将像FreeBSD这样的大项目迁移到全新的编译器工具链,尤其是在缺乏二进制性能的情况下。但是,这种情况确实不成立。可以选择以下选项之一:1)运行过期的GCC,2)迁移到现代GCC并被迫使用与项目目标不兼容的许可证,或者3)迁移到稳定的BSD许可的编译器,该决定可能是不可避免的。请记住,这仅适用于基本系统以及发行版的支持;没有什么可以阻止用户自己在FreeBSD盒上安装和使用现代GCC。
#2 楼
值得考虑的一件事是,如ire_and_curses答案中所述,FreeBSD当前正在使用GCC 4.2.1,因此性能比较与4.5甚至4.6都不与项目真正相关。因此,您应该问的问题是:项目使用的新Clang与较旧的GCC有哪些性能提升?
如何编译相同的二进制文件?在GCC 4.2.1中与新的Clang进行了比较?
由于GCC转向了GPL v3,因此FreeBSD被迫保留使用GCC 4.2.1(GPL v2),该版本已发布
如果Clang落后于当前的GCC,但仍比该项目中已实施的GCC提前数年,那么他们的发展决定就很好了保证和真正的启发。
#3 楼
即使GCC是GPLv3,由GCC生成的二进制文件也没有任何许可证约束。明确地说,您可以使用GCC来构建属于您想要的许可范围内的软件。甚至GCC附带的C库(包含在二进制文件中)也是免许可证的。 http://www.gnu.org/licenses/gcc-exception-faq.htmlGNU GPLv3的第2部分:
您有权传播由
将运行时库与独立模块组合而成的目标代码的工作,即使这种传播否则会违反GPLv3的条款,但前提是所有目标代码均由合格编译生成流程。然后,您
可以根据您选择的条件传达这样的组合,
与独立模块的许可一致。
“合格”表示该汇编确实不涉及GCC和GPL不兼容的软件。这不是一个限制:BSD许可的软件可以在涉及GNU GCC的构建过程中使用。离开GCC,因为在FreeBSD中使用GCC并不兼容。
进行此更改的真正原因是政治上的和机会主义的:从理论上讲,它与GNU公共许可证(如* ire_and_curses *)竞争。这些内容由* ire_and_curses *进行了描述。)
这些事实为FreeBSD摆脱GCC并摆脱它提供了机会:它们实际上并没有被法律强制,因为他们仍然可以使用GCC来构建免费的或BSD许可的软件,但他们希望坚持“所有BSD许可的软件”的理念。
评论
对不起,我不得不把它否决。不幸的是,您对BSD和软件价格低廉不熟悉。仅出于记录,是BSD从90年代初开始从其传统的便携式C编译器(PCC)转换为GCC的政治决定而非技术决定。 lang是Apple专案!由于有人每天都在使用GCC来生活在OpenBSD上并试图回到PCC,所以您在所有情况下都是错误的。
– Predrag Punosevac
13年5月21日在4:20
这与生成的二进制文件无关,而与gcc是FreeBSD的一部分有关-因此许可证约束确实很重要。
–sstn
13年8月24日在13:26
如果项目的宗教信仰是“ No GPLv3”,那么技术方面就会消失-想象一下他们正在使用例如Microsoft编译器。
–特尔比约恩(ThorbjørnRavn Andersen)
2013年9月11日19:44
这是正确指出编译器许可证=最终产品许可证的唯一答案。除非用户不理解该许可证,否则有关编译器许可证的投诉可能不相关。
–白兰地
2014年9月6日在8:42
这与生成的二进制文件是否属于GPLv3无关,而与编译器本身的更改是否要求符合GPLv3无关。硬件供应商经常修改库存编译器以更好地使用其硬件,或以专有方式利用硬件。对于此类组织而言,消除自定义更改必须符合GPLv3或承担法律诉讼风险的风险很大。真正重要的是编译器的许可证。
–大卫·哈克斯(David Harks)
14-10-19在12:46
#4 楼
我不是专家,但是我的理解是Clang / LLVM使用的资源少于GCC,而且速度更快。http://clang.llvm.org/features.html#performance
如果您正在运行一个需要大量构建很多东西的环境,那么这种性能可能会真正节省能源成本和时间。如果是真的。
评论
次要的..还有一些工具可以进一步减少重复的编译时间-ccache.samba.org不必担心并行编译的明显可能性(请参阅distcc),在大型项目中链接时间往往更难解决
–Rob11311
2014年7月6日在16:17
是的,非常好,但是生成的二进制代码更慢; p
–rustyx
2014年7月17日在12:22
@rustyx不能与gcc 4.2相比!
–Miles Rout
16年5月31日在12:47
评论
您引用的基准来自旧版本的Clang。最近版本的基准似乎与最近版本比较接近。我自己对简单程序的研究使Clang 3.0比GCC 4.6快了百分之几,但是GCC在线程版本上快了20%。 phoronix.com/scan.php?page=news_item&px=MTA5Nzc是更新的Phoronix基准。
– Sean
2012年11月7日在21:14
“ GCC并非完全符合标准”:不可能使用编译器开关来强制符合给定标准吗?
–乔治
13年1月28日在15:21
首先,不要过多地阅读Phoronix基准测试,或者根本不要阅读它们。其次,确实是默认情况下,除非您明确指定标准,否则GCC并不完全符合标准,如果您没有明确指定标准,则也将启用GNU扩展,但这似乎是使用Clang的奇怪原因,因为他们也正在实现最常用的GNU扩展,因为它们努力使Clang可以用作GCC的替代品。
–雷米
2013年6月18日19:21
@Giorgio:否。请参见gcc.gnu.org/c99status.html的示例-只是C99(现在已经14岁了)。还有gcc.gnu.org/onlinedocs/libstdc++/manual/status.html-clang对这两者都提供了更好的支持(我认为它是完整的;如果没有,至少肯定更好)。
– TimČas
13年8月15日在17:19
@Demizey我没有为Phoronix辩护,但是如果您要解雇某件事情,则至少应提供有效的理由。
–马里奥
2014年2月20日下午6:29