我有一个关于OSX上的llvm、clang和gcc的问题.
LLVMGCC4.2、LLVM2.0和clang之间有什么区别?我知道它们都是基于llvm构建的,但它们有什么不同?
除了编译速度更快之外,相比GCC,llvm还有什么优势?
我有一个关于OSX上的llvm、clang和gcc的问题.
LLVMGCC4.2、LLVM2.0和clang之间有什么区别?我知道它们都是基于llvm构建的,但它们有什么不同?
除了编译速度更快之外,相比GCC,llvm还有什么优势?
LLVM最初代表"低级虚拟机",但现在它只是代表它自己,因为它已经成长为一个传统虚拟机以外的东西.它是一组库和工具,以及一种标准化的中间表示,可用于帮助构建编译器和即时编译器.它只能自己编译自己的中间表示;为此,它需要一个特定于语言的前端.如果人们只是指LLVM,他们可能只是指低级库和工具.有些人可能会错误地将Clang或llvm gcc称为"llvm",这可能会引起一些混淆.
llvm gcc是gcc的一个修改版本,它使用llvm作为其后端,而不是gcc自己的后端.它现在被弃用了,取而代之的是DragonEgg,它使用GCC的新插件系统来做同样的事情,而不需要Forking 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中工作的可能性大得多,尽管随着时间的推移,这种情况正在改善.