我有一个关于操作系统 X 上的 llvm、 clang 和 gcc 的问题。
Llvm-gcc 4.2、 llvm 2.0和 clang 之间有什么区别?我知道他们都建立在 llvm 之上,但是他们有什么不同呢?
除了编译速度更快之外,llvm 比 gcc 有什么优势?
LLVM-GCC-4.2使用 GCC 前端解析代码,然后使用 LLVM 生成编译后的输出。
“ LLVM 编译器2.0”使用 clang 前端解析代码,并使用 LLVM 生成编译后的输出。“ clang”实际上只是这个前端的名称,但它经常被随意地用作编译器作为一个整体的名称。
这里有两种不同的东西。
LLVM 是一个后端编译器,用于在它的基础上构建编译器。它处理适应目标体系结构的代码的优化和生成。
CLang 是一个解析 C、 C + + 和 Objective C 代码并将其转换为适合 LLVM 的表示的前端。
Llvm gcc 是基于 gcc 4.2的基于 llvm 的 C + + 编译器的初始版本,由于 CLang 可以解析它能解析的所有内容等等,所以现在不推荐使用这个版本。
最后,CLang 和 gcc 之间的主要区别不在于生成的代码,而在于方法。虽然 gcc 是整体的,但 CLang 是作为一套库构建的。例如,这种模块化设计为 IDE 或完成工具提供了很好的重用机会。
目前,由 gcc4.6生成的代码通常比较快,但是 CLang 正在缩小差距。
LLVM 最初代表“低级虚拟机”,但现在只代表它自己,因为它已经成长为传统虚拟机以外的东西。它是一组库和工具,以及一个标准化的中间表示,可用于帮助构建编译器和实时编译器。它只能自己编译自己的中间表示; 它需要一个特定于语言的前端来完成这项工作。如果人们只是引用 LLVM,他们可能只是指低级库和工具。有些人可能错误地将 Clang 或 LLVM-gcc 称为“ LLVM”,这可能会导致一些混淆。
LLVM-GCC 是 GCC 的修改版本,它使用 LLVM 作为后端,而不是 GCC 自己的后端。现在它已经被废弃了,取而代之的是 Dragegg,它使用 GCC 的新插件系统来做同样的事情,而不分离 GCC。
Clang 是一个全新的 C/C + +/Objective-C 编译器,它使用自己的前端,LLVM 作为后端。它提供的优点是更好的错误消息、更快的编译时间,以及其他工具更容易挂接到编译过程(如 LLDB 调试器和 静态分析仪)。它也是相当模块化的,因此可以用作其他需要分析 C、 C + + 或 Objective-C 代码的软件的库。
这些方法(普通的 GCC、 GCC + LLVM 和 Clang)各有优缺点。我看到的最后几组基准测试显示,在大多数测试用例中,GCC 生成的代码稍微快一些(尽管 LLVM 在少数情况下略有优势) ,而 LLVM 和 Clang 的编译时间要好得多。GCC 和 GCC/LLVM 组合的优势在于,更多的代码已经被测试过,并且可以在 C 的 GCC 风格下工作; 有一些特定于编译器的扩展,只有 GCC 有,在一些地方,标准允许实现变化,但代码取决于一个特定的实现。如果你得到了大量的遗留 C 代码,那么它在海湾合作委员会中工作的可能性比在 Clang 要大得多,尽管随着时间的推移这种情况正在改善。