我不知道它是否适合问这个问题。但是,为什么 Apple 选择使用OpenCL/OpenGL 的代码llvm
及其clang
实现?它给他们带来了什么好处以及如何带来的好处?请原谅我对这个话题的无知,我对此知之甚少。
3 回答
Apple 创建 Clang 作为 GCC 的替代品,用于 C/C++/ObjC 和 ObjC++。LLVM 的创建者在 Apple 的编译器部门工作。在与主持项目的伊利诺伊大学的共同努力下,Apple 创建了 GCC、GDB [参见 LLDB]、libstdc++ [参见 libc++] 和几个新项目的完整替代品。
GPLv3 是压垮苹果对 GCC 贡献兴趣的最后一根稻草,这也是苹果在 GCC 4.2.x 中结束它的原因。
LLVM/Clang 正在整个行业迅速取代 GCC。
LLVM 现在是一个名称的误称。
LLVM/Clang 中支持的当前目标硬件:
-- 针对 ARM -- 针对 CppBackend -- 针对 Hexagon -- 针对 Mips -- 针对 MBlaze -- 针对 MSP430 -- 针对 NVPTX -- 针对 PowerPC -- 针对 Sparc -- 针对 X86 -- 针对 XCore -- Clang 版本:3.3
很快添加了开箱即用的 AMD R600 代码库。
Clang 符合 C99。OpenCL 使用 C99 的一个子集。Clang 是免费提供的最完整的 C11 兼容编译器套件。
FreeBSD 已移至 LLVM/Clang 作为即将到来的 10.0 发行版的默认设置。
AMD 和 Nvidia 使用 LLVM/Clang 构建他们的 OpenCL 堆栈。
英特尔正在将他们的 OpenCL 和更多内容迁移到 LLVM/Clang。
谷歌全力支持 LLVM/Clang。同样适用于 Adobe、Sony、IBM、Cray 等。
GCC 是一团糟的架构。LLVM/Clang 的模块化使其改进速度和开发人员的选择具有更大的上限。
LLVM/Clang 3.2 的开发人员和用户指南现在非常可靠,3.3 主干添加了更多的文档来了解 LLVM/Clang 的好处。
高质量编译器代码的开发速度是首屈一指的。
LLVM 在运行时以两种不同的方式使用:
固定功能顶点处理管道中的运行时代码专业化。基本上,OpenGL 管道有很多参数(是否启用了雾?顶点是否有纹理信息?等),它们很少改变:执行完全分支的代码会淹没分支预测器并且性能很差。为了解决这个问题,代码被预编译为 LLVM .bc 形式,在运行时根据需要对代码进行专门化、优化和 JIT 编译。
OpenGL 顶点着色器是使用一系列编程语言编写的小程序,具有高度特定于领域的特性(例如点积、纹理查找等)。在运行时,OpenGL 堆栈将顶点程序转换为 LLVM 形式,运行 LLVM 优化器通道,然后 JIT 编译代码。
(更多细节在上面的链接中)
因为它们有助于 Clang/LLVM 的开发,并且因为使用 LLVM/Clang 编译的源代码生成的二进制文件比 GCC 更快......
Clang 的开发人员声称,与 GCC 等竞争编译器相比,它减少了内存占用并提高了编译速度。为了支持他们的说法,他们提出,截至 2007 年 10 月,Clang 编译 Carbon 库的速度是 GCC 的两倍多,同时使用了大约六分之一的 GCC 内存和磁盘空间。