我有一个关于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 debuggerClang static analyzer).它还具有合理的模块化,因此可以用作其他需要分析C、C++或Objective-C代码的软件的库.

这三种方法(普通GCC、GCC+LLVM和Clang)各有优缺点.我看到的最后几组基准测试表明,GCC在大多数测试用例中生成的代码速度略快(尽管LLVM在一些测试用例中稍有优势),而LLVM和Clang的编译时间则显著提高.GCC和GCC/LLVM组合的优点是,有更多的代码经过测试,可以在C的GCC风格上工作;有些特定于编译器的扩展只有GCC有,有些地方标准允许实现有所不同,但代码取决于一个特定的实现.如果你得到了大量的遗留C代码,那么它在GCC中工作的可能性要比在Clang中工作的可能性大得多,尽管随着时间的推移,这种情况正在改善.

C++相关问答推荐

gcc已编译的可执行文件TSB是否同时暗示最低有效字节和最低有效位?

为什么PLT表中没有push指令?

为什么下面的C代码会进入无限循环?

sizeof结果是否依赖于字符串的声明?

为什么在C中设置文件的位置并写入文件,填充空字符?

不同到达时间的轮询实现

如何在IF语句中正确使用0.0

C由四个8位整数组成无符号32位整数

在C23中使用_GENERIC实现带有右值的IS_POINTER(P)?

Make Node函数.S有什么问题吗?

Vcpkg的配置文件

RawMotion的XInput2错误(具有较高值的XISelectEvents上的BadValue)

在编写代码时,Clion比vscode有更多的问题指示器

收到不兼容的指针类型警告,因为函数的返回不是空*,而是 struct 指针

判断系统命令返回值的正确方法

如果格式字符串的内存与printf的一个参数共享,会发生什么情况?

有没有办法减少C语言中线程的堆大小?

If语句默认为true

在C中定义函数指针?

变量的指针右对齐,函数的指针左对齐