2022年1月4日整理发布:Google 的 Chrome 浏览器现在是在 Windows 上使用 Clang 编译器构建的。以前使用 Microsoft C++ 编译器构建,谷歌现在在 Windows、macOS、Linux 和 Android 上使用相同的编译器,而这一转换使 Chrome 可以说是第一个在 Windows 上使用 Clang 的主要软件项目。
长期以来,macOS 和 Linux 上的 Chrome 都是使用 Clang 编译器和 LLVM 工具链构建的。开源编译器是 macOS 上的首选编译器,使其成为那里的自然选择,也是 Linux 的首选;尽管古老的 GCC 仍然是 Linux 上的主要编译器选择,但通过使用 Clang,Google 确保它只有一组编译器的怪癖和奇怪之处,而不是两组。
但是 Windows 上的 Chrome 使用了微软的 Visual C++ 编译器。Visual C++ 编译器是 Windows 上支持最好、使用最广泛的编译器,而且至关重要的是,它是对 Windows 的各种调试和诊断工具提供最佳支持的编译器。Visual Studio 调试器受到 C++ 社区的广泛喜爱,其他工具,例如 WinDbg 调试器(通常用于分析故障转储)是 Windows 开发人员体验的核心部分。
早在 2013 年,Google 就决定要在任何地方使用 Clang,包括 Windows。在任何地方使用相同的编译器使开发变得更加容易——你在每个平台上都有相同的错误集要处理——尤其是 Clang 有谷歌希望能够使用的诊断工具,如ASan和UBSan。
只有一个小症结:Clang 和 LLVM 对 Windows 支持的影响并不大。这在表面上是正确的——例如,Clang 支持与 Microsoft 编译器不同的命令行选项,因此不能作为替代品——以及许多更深层次的方式。例如,Windows 的工具都是围绕 PDB(“程序数据库”)文件格式构建的,用于保存调试信息。Microsoft 的调试器和各种第三方工具都假定 Windows 程序将其调试数据作为 PDB 文件提供。但是,LLVM 无法生成 PDB。与几乎所有大型软件项目一样,Windows API 也需要某些非标准扩展,必须对 Clang 进行更改才能支持。
因此,让 Chrome 在 Windows 上使用 Clang 的第一步是改进 Clang 和 LLVM,为它们提供对 Windows 的一流支持。谷歌组建了一个团队来解决这个问题。该浏览器于 2015 年首次在 Windows 上使用 Clang 成功构建,谷歌首先在其 Canary 开发渠道中对其进行了测试,然后是开发和 Beta 渠道。在 Chrome 64 中,稳定的浏览器渠道正在转向使用 Clang。
虽然谷歌为实现这一目标在编译器开发方面承担了大部分责任,但一些必要的工作是由微软完成的。PDB 格式在很大程度上没有记录(并且存在的文档非常陈旧),因此 LLVM 开发人员寻求帮助:微软的回应是发布了大量用于生成 PDB 的源代码。Microsoft 还努力确保 Windows 头文件和 C++ 库与 Clang 及其自己的编译器一起使用。
Google 尚未完全迁移到 LLVM 工具链。Chrome for Windows 仍然使用 Microsoft 链接器(工具链的一部分,将编译后的源代码组合成单个可执行文件或 DLL),并且仍然使用 Microsoft C++ 库。随着时间的推移,Google 计划切换到 LLVM 链接器,并且也可能使用 Clang C++ 库。