我有一个关于OS X上的llvm、clang和gcc的问题。
llvm-gcc 4.2、llvm 2.0和clang之间有什么区别?我知道它们都基于llvm构建,但它们之间有什么不同呢?
除了更快的编译速度,llvm相对于gcc的优势是什么?
我有一个关于OS X上的llvm、clang和gcc的问题。
llvm-gcc 4.2、llvm 2.0和clang之间有什么区别?我知道它们都基于llvm构建,但它们之间有什么不同呢?
除了更快的编译速度,llvm相对于gcc的优势是什么?
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中工作,尽管随着时间的推移,情况正在改善。
这里有两个不同的东西。
LLVM是一个后端编译器,旨在在其之上构建编译器。它处理优化和生成适合目标架构的代码。
CLang是一个前端,它解析C、C++和Objective C代码,并将其转换为适合LLVM的表示形式。
llvm gcc是基于gcc 4.2的基于llvm的C++编译器的初始版本,现已被弃用,因为CLang能够解析它可以解析的所有内容,甚至更多。
最后,CLang和gcc之间的主要区别不在于生成的代码,而在于方法。虽然gcc是单片式的,但CLang是一套库构建的。这种模块化设计为IDE或自动完成工具等提供了很好的重用机会。
目前,由gcc 4.6生成的代码通常稍微快一点,但CLang正在缩小差距。
llvm-gcc-4.2使用GCC前端解析您的代码,然后使用LLVM生成编译输出。
"llvm compiler 2.0"使用clang前端解析您的代码,并使用LLVM生成编译输出。 "clang"实际上只是这个前端的名称,但通常被随意地用作整个编译器的名称。