C++23幕后揭秘:将C++23引入RAD Studio的幕后故事

RAD Studio 宣布支持C++23时,看起来非常简单——发行说明中只有一行字。但这一行字背后,却蕴藏着该产品近代史上最复杂的工程成果之一。

C++23 不仅仅是一次“语言更新”,而是一次巨大的范式变革。对于像RAD Studio这样需要在现代语言特性和数十年历史兼容性之间取得平衡的平台而言,这与其说是一个补丁,不如说是一个全面的解决方案。正是基于此, RAD Studio 中使用的现代 C++ 编译器BCC64x应运而生。它基于 LLVM/Clang 20 工具链,并带有 Borland 扩展。

编译器只是 Embarcadero 产品中 C++23 集成的一个组成部分,但它非常重要,所以这里介绍一下它的背景。

新版 C++Builder 编译器的优势

  • BCC64x现在已完全与业界领先的基于 LLVM 的 Clang 20 编译器并驾齐驱。LLVM /
    Clang是打造现代 C/C++ 编译器的长期努力成果。该项目最初是作为GCC的替代方案而启动的如今已发展成为开发工具行业的领军者之一。许多工具都基于 LLVM 构建,未来还将有更多框架问世。
  • 与第三方库的兼容性大幅提升。大多数情况下,编译第三方代码无需任何修改。技术上讲,少数情况下可能需要修改——例如使用 MinGW/Clang 自带的 POSIX 头文件中的特定部分,但我们会尽力将此类问题降到最低。
  • BCC64x 的速度大约是老款bcc64c (上一代基于 Clang 的 Embarcadero 编译器)的两倍。我们实现这一目标不仅是引入了更新版本的 Clang,还改进了并行构建能力。

在多核配置下,性能往往更佳。16核及以上处理器(即最新的x86(64位)处理器)能够实现性能与功能完整性之间的完美平衡。

下面我们给出对xerces进行构建性能测试的结果:

测试 bcc32(经典) bcc32c(Clang 5) bcc64(Clang 5) bcc64x(Clang 20)
平行测试 00:11.86 00:16.08 00:16.99 00:13.14
序贯测试 00:11.92 02:15.62 02:47.62 01:35.90
截图 2025年11月27日 10:37:09

BCC64x(新型 C++Builder 编译器)的更多优势

  • BCC64x提供了最先进的优化,但代价是编译时间略长。BCC64x
    可以更积极地展开循环,更好地内联常用函数,并生成更少冗余的算术代码。这些改进在汇编代码中体现得淋漓尽致,因此爱好者们应该会为此感到兴奋。
  • 支持更新的 C 运行时环境。
    长期以来,使用 C++ 应用程序的开发人员一直饱受 C 运行时环境问题的困扰。微软投入了大量精力开发新的统一 C 运行时环境 (CRT),从而提升了 Windows 应用程序的可移植性、CRT 库的版本控制等。
    即使在较新的 Windows 系统上,BCC32 也能直接调用底层 API,完全绕过 CRT。BCC64x 则充分利用了新的 CRT,进一步提升了 Windows 应用程序的可移植性和版本控制。
  • 安全性提升。Clang内置了许多检查功能,可以诊断潜在错误。这显著提高了安全性,并增强了对网络攻击的防御能力。
  • 更易读的错误信息。
    虽然 Embarcadero 已经努力改进错误信息的易懂性,但新的 BCC64x 更进一步,扩展了错误信息的上下文。在大多数情况下,可以追踪问题在源代码中的出现方式,例如编译器如何“展开”宏等等。
  • 最后,新的编译器为未来支持更多目标平台铺平了道路。这得益于LLVM的特性——它是一个支持所有主流平台的框架。

技术挑战

Embarcadero C++ 编译器并非只是Clang 的另一个分支或普通的前端插件。它与Delphi运行时、VCL 和 FireMonkey 深度集成,并且必须生成与 Borland 时代以来所有代码保持 ABI 兼容的代码。这意味着你不能简单地添加一个新的解析器就万事大吉——必须支持特殊关键字(例如__closure`# __published`、`#` __classid、`#` 等)。

每一项新功能都必须经过验证,不仅要确保其正确性,还要确保其与旧工具链、调试符号以及 IDE 的代码洞察系统兼容。任何接触过 C++ 编译器内部机制的人都知道,这绝非易事。有时,即使是对齐冲突也会成为兼容性道路上的重大障碍。鉴于 Embarcadero 庞大的代码库以及我们技术众多忠实用户,我们认为尽一切努力减少问题至关重要。

如何让 Delphi 和 C++ 协同工作

Embarcadero 生态系统为 C++ 开发人员带来了极大的便利;然而,我们研发工具的许多组件都是用 Delphi 编写的。即使是 VCL 也不例外,VCL 是我们用于开发用户界面的技术之一。因此,Embarcadero 编译器的主要特性在于其与 Delphi 运行时的兼容性

Delphi 运行时使用其自身的 ABI。对于 Win32 平台,存在不同的调用约定,而对于 Win64 平台,则只有一种调用约定。Delphi ABI 本身兼容 Win64 平台的 Itanium ABI。虽然这听起来可能只是个小问题,但同时支持这些不同的 ABI 却需要付出相当大的努力。

更重要的是,新的 C++ 特性实际上简化了Delphi 特性的移植,并使 Delphi 的互操作性更加清晰。

截图 2025年11月27日 10:42:38

调试器和调试信息

除了编译器之外,任何集成开发环境 (IDE) 中第二常用的功能就是调试器。调试器也必须支持 Delphi 运行时环境,必须能够将 Delphi 代码映射到源代码,并且必须支持相同的调试信息格式。

经典编译器和现代编译器之间的目标格式发生了显著变化。现在使用的是标准的 COFF 格式,而以前使用的是 OMF 格式,这改变了调试信息的读取和处理方式。

COFF 优于 OMF,因为它支持 64 位架构、CodeView 调试信息格式,并且与 LLVM 和 MSVC 等现代工具链完全兼容。它采用可扩展的基于节的设计,能够高效地处理大数据和复杂的重定位操作,而 OMF 是一种传统的 16/32 位格式,存在大小限制,并且与现代链接器和调试器的兼容性较差。
经典编译器的 tds/GIANT 调试信息格式与 CodeView 不兼容。因此,两者都需要维护。
将项目整合在一起的工作量相当大,我们很荣幸能为客户提供这项改进。

C++Builder 的链接器现在可以识别 COFF 文件了

对于经典编译器,使用 ilink32 链接器。对于 bcc64x,使用 LLVM 链接器 (ld.lld)。
新的链接器支持 COFF 目标文件、扩展重定位类型和现代调试信息格式。C
++ Builder 确保在 ilink32 和新的 LLVM 链接器之间切换时调用正确。

结论与未来目标

BCC64x为未来 C++ 和 Delphi 的互操作性奠定了稳定的基础。建议迁移到 BCC64x 以便使用 C++23 特性、改进诊断功能并确保长期兼容性。

我们对即将发布的版本还有更大的计划,而如果没有工具集的升级,这些计划是无法实现的。敬请关注!

https://blogs.embarcadero.com/c23-behind-the-scenes-the-effort-to-bring-c23-to-rad-studio-explained/

posted @ 2015-03-08 20:23  findumars  Views(290)  Comments(0)    收藏  举报