这篇对比 GCC 和 Clang 的博客堪称编译行业的龙争虎斗。GCC 最早可以追溯到 2000 年,而 Clang/LLVM 大约是 2010 年。要对比两个软件的性能并不容易,但我会尽量保证公平、全面。不过,如果非要二选一的话,我会提前声明:这两个都是顶级软件,我每天的工作都离不开它们。
GCC:并不只是编译器,更是编译器套件
先来说说 GCC。1984 年,当 Richard Stallman 创立 GNU 项目时,其目标是创建一个完善的类似 Unix 操作系统的自由软件。提醒大家,当时 Linux 还没出现, Linux 是后来替代 Unix 的操作系统,所以自由软件的概念在当时的确是一个伟大的目标。那时候,C 语言是系统软件开发的主导语言,Richard 开始为 C 语言开发编译器,并将其命名为 GNU C(GCC)。转眼,今年 4 月,GCC 的版本已经发展到了 10.3,从 C 语言编译器发展成为跨平台编译器,支持以下多种语言:
GCC 几乎可以适用于所有类似 Unix 的系统,也可以借助 MinGW 在Windows 系统中使用。GCC 本身是用 C 语言编写的,使用工具 Autotools、Bison 和 Make 进行构建。GCC 维护简单,任务和视图清晰明了,具体可点击链接了解。为了确保GCC能继续自由软件的精神,其主要产品的发布由一个专门的委员会监督,这个委员会由来自不同组织的权威人士组成。

Clang/LLVM: 编译器的“龙头”
CLAN/LLVM 是一个支持 C、C++、Objto-C 多种语言的编译器工具链。这句话并不能证明 Clang/LLVM 力量的强大。为了解释为什么我对这个编译工具情有独钟,我需要更详细地描述一下现代编译器的架构:
Clang/LLVM 就是这种架构的典型例子。LLVM 最初是美国伊利诺伊大学的一个研究项目。Clang 是前端,LLVM 是后端。LLVM 定义了一个基于单一静态赋值(SSA)形式的中间表示(IR)。许多编译优化因此更容易在 IR 上执行。还可以添加 LLVM IR pass 来添加自定义优化步骤。总而言之,这些工具推动着 Clang/LLVM 成为顶尖的编译器工具链。
现在让我们来比较一下两大编译器巨头:GCC 和 Clang。
以下的表格简单梳理了两个工具的差异:
| 类别 | GCC | Clang/LLVM |
| 许可证 | GNU GPL | Apache 2.0 |
| 代码模块化 | 一体化架构 | 模块化 |
| 支持平台 | *inx, Windows (MinGW) | *inx, Natively in Windows |
| 符合的语言标准 | C++20 已通过验证, 符合 C++17 | 符合 C++17,正在申请 C++20 标准 |
| 代码生成 | 高效,有很多编译器选项可以使用 | 高效,LLVM 后端使用了 SSA 表单 |
| 语言独立类型系统 | 没有 | 有(LLVM的设计初衷) |
| 构建工具 | 基于 Make | CMake |
| 解析器 | 最早采用 Bison LR,现在改为递归下解析器 | 手写的递归下降解析器 |
| 链接器 | LD | lld |
| 调试器 | GDB | LLDB |
这篇博文可以帮助你理解 GCC 和 Clang 的主要区别。GCC 是一个成熟的编译器,支持多种语言。Clang 主要支持 C 语言、C++ 和 Objtovi-C。但是 Clang 的底层框架 LLVM 具有足够的可扩展性,可以支持 Julia 和 Swift 等较新的语言。从 C++ 的角度来看,这两种都是符合 C++ 17 标准的优秀编译器。
从 Incredibuild 角度来看,两者都是很好的工具。这就是为什么我们也与 Clang 和 GCC 都兼容。借助 Incredibuild 的创新技术,Clang 和 GCC 编译进程可以无缝地分布在网络中的数百个远程内核上,大大减少了 Clang 和 GCC 的编译时间。