LLVM与OS X上的clang


133

我对OS X上的llvm,clang和gcc有疑问。

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

除了更快的编译速度之外,llvm与gcc相比还有什么优势?


9
llvm只是一个后端,不能有一个独立的llvm编译器...它只有不同的前端,例如gcc和clang。
smerlin 2011年

4
@smerlin:“LLVM编译器”是苹果的铛+ LLVM商品名:developer.apple.com/technologies/tools/...
斯蒂芬佳能

此处的其他详细信息:stackoverflow.com/a/26724886/1938163
Marco A.

Answers:


201

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中工作的可能性大得多,尽管随着时间的推移,这种情况正在不断改善。


13
要添加到这个奇妙的答案:clang还是一组库(称为libclang),您可以使用它们来进行代码分析,自动完成,语法突出显示等操作。这对于IDE非常方便。

5
在为MacOS X或iOS进行构建时,请考虑Clang是Apple用于构建其所有MacOS X和iOS软件(包括操作系统)的软件,并且Clang是您无需费力即可自动获得的功能,以及您所需要的每个人寻求帮助正在使用。Apple从未在gcc 4.2之前支持gcc,并且不再发布任何版本的gcc。
gnasher729 2014年

1
@ gnasher729是的,这个答案是3年前写的,当时Apple仍在使用llvm-gcc作为默认编译器同时交付llvm-gcc和Clang。从那时起,时代发生了变化。
Brian Campbell

54

这里有2种不同的东西。

LLVM是一种后端编译器,旨在在其之上构建编译器。它负责优化和生成适合目标体系结构的代码。

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

llvm gcc是基于gcc 4.2的基于llvm的C ++编译器的初始版本,由于CLang可以解析其可以解析的所有内容,因此现已弃用。

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

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


5

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

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

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.