为了拯救 C,我们必须拯救 ABI
To Save C, We Must Save ABI

虽然我在之前的文章中猛烈抨击过 ABI 稳定性,甚至认为它阻碍了技术发展,但这次我要反转立场。尽管 Jason Turner 在 C++ Weekly 中主张打破 ABI 来拯救 C++,但我意识到,对于 C 语言而言,情况截然不同。C 的 ABI 问题不仅关乎 C 本身,更因为 C++ 几乎全盘继承了 C 标准库,导致 C 的 ABI 缺陷会波及整个软件生态。通过展示 `long long` 与 `__int128_t` 在函数调用中寄存器使用的差异,我揭示了编译器与调用者之间那份无形的二进制契约。一旦这份契约被破坏,即使链接器没有报错,程序也会因寄存器约定不匹配而产生难以察觉的严重错误。
这不是源代码层面的契约,而是编译器代表你与其他编译器及其他机器之间缔结的契约。