我对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相比还有什么优势?
Answers:
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中工作的可能性大得多,尽管随着时间的推移,这种情况正在不断改善。
这里有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正在缩小差距。