我在OS X上有关于llvm,clang和gcc的问题。
llvm-gcc 4.2,llvm 2.0和clang有什么区别?我知道它们都建立在llvm之上,但它们有何不同?
除了更快的编译之外,llvm优于gcc的优势是什么?
答案 0 :(得分:184)
LLVM最初代表“低级虚拟机”,虽然它现在只是代表它自己,因为它已经发展成为传统虚拟机以外的东西。它是一组库和工具,以及标准化的中间表示,可用于帮助构建编译器和即时编译器。除了自己的中间表示之外,它无法编译任何其他内容;它需要一个特定于语言的前端才能这样做。如果人们只是引用LLVM,它们可能只意味着低级库和工具。有些人可能会将Clang或llvm-gcc错误地称为“LLVM”,这可能会引起一些混淆。
llvm-gcc是GCC的修改版本,它使用LLVM作为后端而不是GCC自己的后端。它现在已被弃用,有利于DragonEgg,它使用GCC的新插件系统来执行相同的操作而不需要GCC。
Clang是一个全新的C / C ++ / Objective-C编译器,它使用自己的前端,LLVM作为后端。它提供的优点是更好的错误消息,更快的编译时间,以及其他工具挂钩到编译过程的更简单方法(如LLDB debugger和Clang static analyzer)。它也是相当模块化的,因此可以用作需要分析C,C ++或Objective-C代码的其他软件的库。
这些方法中的每一种(普通GCC,GCC + LLVM和Clang)都有其优点和缺点。我见过的最后几组基准测试表明GCC在大多数测试用例中产生稍快的代码(虽然LLVM在少数几个方面略有优势),而LLVM和Clang的编译时间明显更好。 GCC和GCC / LLVM组合的优势在于,已经测试了更多代码并且可以处理C的GCC风格;有一些编译器特定的扩展只有GCC,有些地方标准允许实现变化但代码依赖于一个特定的实现。如果你获得大量遗留的C代码,它将在GCC中运行,而不是在Clang中运行,那么这种代码更有可能,尽管随着时间的推移这种情况会有所改善。
答案 1 :(得分:48)
这里有两件不同的东西。
LLVM是一个后端编译器,用于在其上构建编译器。它涉及适应目标架构的代码的优化和生成。
CLang是一个解析C,C ++和Objective C代码的前端,并将其转换为适合LLVM的表示。
llvm gcc是基于llvm的C ++编译器的初始版本,基于gcc 4.2,现在已弃用,因为CLang可以解析它可以解析的所有内容,等等。
最后,CLang和gcc之间的主要区别不在于生成的代码,而在于方法。虽然gcc是单片的,但CLang已经被构建为一套库。这种模块化设计为IDE或完成工具提供了很好的重用机会。
目前,gcc 4.6生成的代码通常要快一些,但是CLang正在缩小差距。
答案 2 :(得分:5)
llvm-gcc-4.2使用GCC前端解析代码,然后使用LLVM生成编译输出。
“llvm编译器2.0”使用clang前端来解析代码,并使用LLVM生成编译输出。 “clang”实际上只是这个前端的名称,但它通常随便用作编译器的名称。