LLVM与clang在OS X上的区别

151

我有一个关于OS X上的llvm、clang和gcc的问题。

llvm-gcc 4.2、llvm 2.0和clang之间有什么区别?我知道它们都基于llvm构建,但它们之间有什么不同呢?

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


10
LLVM 只是一个后端,没有独立的 LLVM 编译器 ... 只有像 GCC 和 Clang 这样的不同前端可以与之配合使用。 - smerlin
6
“LLVM编译器”是苹果公司对于clang+llvm的商标名称:http://developer.apple.com/technologies/tools/whats-new.html#llvm-compiler - Stephen Canon
其他细节请参见:https://dev59.com/118d5IYBdhLWcg3wiSnI#26724886 - Marco A.
3个回答

241

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组合的优点是已经测试并且可以在GCC版本的C上工作的代码更多;有一些仅GCC具有的编译器特定扩展以及标准允许实现有所不同但代码依赖于某个特定实现的地方。如果您获得了大量遗留C代码,它很可能会在GCC中工作,而不是在Clang中工作,尽管随着时间的推移,情况正在改善。


15
除了之前给出的精彩回答之外,值得一提的是:clang还是一组库(称为libclang),可用于诸如代码分析、自动完成、语法高亮等功能。这对于集成开发环境非常方便。 - user142019
8
在构建MacOS X或iOS应用时,请考虑到Clang是苹果用于构建所有MacOS X和iOS软件(包括操作系统)的软件,并且Clang是您可以自动获取的,无需任何努力,并且每个人都在使用的软件。苹果从未支持过gcc 4.2之后的任何版本,并且不再提供任何版本的gcc。 - gnasher729
2
@gnasher729 是的,这个答案是三年前写的,当时苹果仍然同时提供llvm-gcc和Clang,其中llvm-gcc是默认编译器。但现在情况已经改变了。 - Brian Campbell
1
只是提供信息:苹果转向Clang的主要原因之一是许可证 - 它不需要开源。相比之下,GCC采用GPL v3许可证。 - starriet
虽然它现在已经成长为不同于传统虚拟机的东西,但它仍然代表着自身。它是一组库和工具,以及标准化的中间表示形式。当这种情况发生时,我很喜欢!作为用户,这使得理解事物变得更加容易 :) :) :) - iono

72

这里有两个不同的东西。

LLVM是一个后端编译器,旨在在其之上构建编译器。它处理优化和生成适合目标架构的代码。

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

llvm gcc是基于gcc 4.2的基于llvm的C++编译器的初始版本,现已被弃用,因为CLang能够解析它可以解析的所有内容,甚至更多。

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

目前,由gcc 4.6生成的代码通常稍微快一点,但CLang正在缩小差距。


8

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

"llvm compiler 2.0"使用clang前端解析您的代码,并使用LLVM生成编译输出。 "clang"实际上只是这个前端的名称,但通常被随意地用作整个编译器的名称。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接