题 OS X上的LLVM vs clang


我在OS X上有关于llvm,clang和gcc的问题。

llvm-gcc 4.2,llvm 2.0和clang有什么区别?我知道它们都建立在llvm上,但它们有何不同?

除了更快的编译,llvm优于gcc的优势是什么?


115
2018-04-18 20:38


起源


llvm只是一个后端,不能是一个独立的llvm编译器......它只有不同的前端,比如gcc和clang。 - smerlin
@smerlin:“llvm编译器”是Apple的clang + llvm的商标名: developer.apple.com/technologies/tools/... - Stephen Canon
其他细节在这里: stackoverflow.com/a/26724886/1938163 - Marco A.


答案:


LLVM最初代表“低级虚拟机”,虽然它现在只是代表它自己,因为它已经发展成为传统虚拟机以外的东西。它是一组库和工具,以及标准化的中间表示,可用于帮助构建编译器和即时编译器。除了自己的中间表示之外,它无法编译任何其他内容;它需要一个特定于语言的前端才能这样做。如果人们只是引用LLVM,它们可能只意味着低级库和工具。有些人可能会将Clang或llvm-gcc错误地称为“LLVM”,这可能会引起一些混淆。

llvm-gcc是GCC的修改版本,它使用LLVM作为后端而不是GCC自己的后端。它现在已被弃用,有利于DragonEgg,它使用GCC的新插件系统来做同样的事情而不需要GCC。

Clang是一个全新的C / C ++ / Objective-C编译器,它使用自己的前端,LLVM作为后端。它提供的优点是更好的错误消息,更快的编译时间,以及其他工具挂钩到编译过程的更简单方法(如 LLDB调试器 和 Clang静态分析仪)。它也是相当模块化的,因此可以用作需要分析C,C ++或Objective-C代码的其他软件的库。

这些方法中的每一种(普通GCC,GCC + LLVM和Clang)都有其优点和缺点。我见过的最后几组基准测试表明GCC在大多数测试用例中生成稍快的代码(尽管LLVM在少数几个方面略有优势),而LLVM和Clang的编译时间明显更好。 GCC和GCC / LLVM组合的优势在于,已经测试了更多代码并且可以处理C的GCC风格;有一些编译器特定的扩展只有GCC,有些地方标准允许实现变化,但代码依赖于一个特定的实现。如果你获得大量的遗留C代码,它将在GCC中运行,而不是在Clang中运行,那么这种可能性会更高。


173
2018-04-18 20:49



谢谢你的解释:) - flumpb
为了添加这个精彩的答案:clang也是一组库(称为libclang),可以用于代码分析,自动完成,语法高亮等等......这对IDE来说非常方便。
在为MacOS X或iOS构建时,请考虑Clang是Apple用于构建所有MacOS X和iOS软件(包括操作系统)的软件,而Clang是您自动获得的,不费力的,以及您曾经拥有的每个人请求帮助正在使用。 Apple从未支持gcc过去的gcc 4.2,并且不再发布任何版本的gcc。 - gnasher729
@ gnasher729是的,这个答案写于3年前,当时苹果公司仍在运送llvm-gcc和Clang,并将llvm-gcc作为默认编译器。从那时起,时代发生了变化 - Brian Campbell


这里有2件不同的东西。

LLVM是一个后端编译器,用于在其上构建编译器。它涉及适应目标架构的代码的优化和生成。

CLang是一个解析C,C ++和Objective C代码并将其转换为适合LLVM的表示的前端。

llvm gcc是基于llvm的基于gcc 4.2的C ++编译器的初始版本,现在不推荐使用,因为CLang可以解析它可以解析的所有内容,等等。

最后,CLang和gcc之间的主要区别不在于生成的代码,而在于方法。虽然gcc是单片的,但CLang已经被构建为一套库。这种模块化设计为IDE或完成工具提供了很好的重用机会。

目前,gcc 4.6生成的代码通常要快一些,但是CLang正在缩小差距。


44
2018-04-18 20:48





llvm-gcc-4.2使用GCC前端来解析代码,然后使用LLVM生成编译输出。

“llvm编译器2.0”使用clang前端来解析代码,并使用LLVM生成编译输出。 “clang”实际上只是这个前端的名称,但它通常随便用作编译器的名称。


5
2018-04-18 20:48