OS X上的LLVM vs clang

dom*_*nik 128 c c++ gcc llvm clang

我在OS X上有关于llvm,clang和gcc的问题.

llvm-gcc 4.2,llvm 2.0和clang有什么区别?我知道它们都建立在llvm之上,但它们有何不同?

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

Bri*_*ell 193

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中运行,那么这种代码更有可能,尽管这种代码随着时间的推移而有所改善.

  • 要添加这个精彩的答案:clang也是一组库(称为libclang),可用于代码分析,自动完成,语法高亮等等......这对IDE来说非常方便. (10认同)
  • 谢谢你的解释:) (4认同)
  • 在为MacOS X或iOS构建时,考虑到Clang是Apple用来构建所有MacOS X和iOS软件(包括操作系统)的软件,并且Clang是您自动获得的,不费力的,以及您曾经拥有的每个人请求帮助正在使用.Apple从未支持gcc过去的gcc 4.2,并且不再发布任何版本的gcc. (4认同)
  • @gnasher729 是的,这个答案是 3 年前写的,当时 Apple 仍在发布 llvm-gcc 和 Clang,并以 llvm-gcc 作为默认编译器。从那时起,时代已经发生了变化。 (2认同)

Mat*_* M. 49

这里有2件不同的东西.

LLVM是一个后端编译器,用于在其上构建编译器.它涉及适应目标体系结构的代码的优化和生成.

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

llvm gcc是基于llvm的基于gcc 4.2的C++编译器的初始版本,现在不推荐使用它,因为CLang可以解析它可以解析的所有内容,等等.

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

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


Ste*_*non 5

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

"llvm编译器2.0"使用clang前端来解析代码,并使用LLVM生成编译输出."clang"实际上只是这个前端的名称,但它通常随便用作编译器的名称.