LLVM vs OSX上的clang
我在OS X上有一个关于llvm,clang和gcc的问题。
llvm-gcc 4.2,llvm 2.0和clang有什么区别? 我知道他们都是基于llvm,但他们又有什么不同呢?
除了更快的编译之外,llvm比gcc还有什么优势呢?
LLVM最初代表着“低级虚拟机”,尽pipe现在它已经成长为除了传统虚拟机以外的其他产品。 它是一套库和工具,以及一个标准化的中间表示,可以用来帮助构build编译器和即时编译器。 它本身不能编译除了自己的中间表示之外的任何东西; 它需要一个语言特定的前端才能这样做。 如果人们只是提到LLVM,那么他们可能只是低级库和工具。 有些人可能会错误地将Clang或llvm-gcc称为“LLVM”,这可能会造成一些混淆。
llvm-gcc是GCC的一个修改版本,它使用LLVM作为后端,而不是GCC自己的。 现在已经弃用了,赞成DragonEgg,它使用GCC的新插件系统做同样的事情,而不分散GCC。
Clang是一个全新的C / C ++ / Objective-C编译器,它使用自己的前端,LLVM作为后端。 它提供的优点是更好的错误消息,更快的编译时间,以及其他工具挂钩到编译过程(比如LLDBdebugging器和Clang静态分析器 )的更简单的方法。 它也是合理的模块化的,因此可以用作需要分析C,C ++或Objective-C代码的其他软件的库。
每种方法(普通的GCC,GCC + LLVM和Clang)都有其优点和缺点。 我所看到的最后几套基准testing表明,GCC在大多数testing用例中生成的代码稍微快一些(尽pipeLLVM在less数几个方面略有优势),而LLVM和Clang的编译时间明显更好。 GCC和GCC / LLVM组合的优点在于更多的代码已经被testing,并在C的GCC风格上工作; 有一些编译器特定的扩展,只有GCC有一些地方的标准允许实现变化,但代码取决于一个特定的实现。 如果您获得大量的遗留C代码,它将在GCC中工作的可能性比在Clang中工作的可能性要大得多,不过随着时间的推移,这种情况正在改善。
这里有两个不同的东西。
LLVM是一个后端编译器,用于在其上构build编译器。 它处理适合目标体系结构的代码的优化和生成。
CLang是parsingC,C ++和Objective C代码的前端,并将其转换为适合LLVM的表示forms。
llvm gcc是基于gcc 4.2的基于llvm的C ++编译器的初始版本,由于CLang可以parsing它可以parsing的所有东西,所以现在已经被弃用了。
最后,CLang和gcc之间的主要区别并不在于生成的代码,而在于方法。 虽然海湾合作委员会是单一的,克朗已经build成一个图书馆套件。 这种模块化devise为IDE或完成工具提供了很好的重用机会。
目前,gcc 4.6生成的代码通常比较快,但是CLang正在缩小这个差距。
llvm-gcc-4.2使用GCC前端parsing代码,然后使用LLVM生成编译后的输出。
“llvm编译器2.0”使用clang前端parsing代码,并使用LLVM生成编译后的输出。 “clang”其实就是这个前端的名字,但是它经常作为整个编译器的名字使用。