使用 C++ 代码的 C 包装器来实现 ABI 稳定性?

Using C wrapper of C++ code for ABI stability?

Jason Turner 在他的 talk 中提议打破 C++ ABI 以保持语言向前发展。他还提到,如果出于兼容性原因需要,可以通过将 C++ 库包装到 C 库中来隔离 C++ ABI 更改。

27:30 处的相关屏幕截图:

此处“BinaryLibrary”和“Old C++ stdlib”使用旧 ABI,“NewExecutable”使用假设更新的 ABI。

据我所知,这是可行的,因为“BinaryLibrary”的旧 C++ ABI 被烘焙到具有更稳定接口的单独二进制文件中。

但是是什么让 C 成为一个好的选择呢?它的 ABI 不能也改变吗?

C ABI 可以更改吗?好吧,这并不容易。某些平台偶尔会发生变化,但如此多的系统和语言都是使用 C ABI 作为 public 接口构建的,因此它必须非常稳定。许多语言都有一个 C FFI 允许它们调用 C 函数,而更改 C ABI 会破坏这些。而 C ABI 是与操作系统交互的常用方式,例如打开文件或发送消息,因此它被许多语言实现(例如解释器和标准库)使用。

请注意,C ABI 不是 C 标准的一部分。每个平台或系统都可以define its own C ABI。因此,虽然它在给定平台上随着时间的推移趋于稳定,但在所有平台上并不一致。