3

在我看来,C 库几乎从来没有混合使用不同版本或(有时)甚至不同编译器编译的库的问题,而且许多语言似乎能够直接或以最小的努力与 C 库交互。

这都是因为 ABI 是标准的吗?

4

4 回答 4

7

ABI 未编入语言标准。您可以获取任何 C 标准草案的副本以自己查看。

ABI 不在标准中是有充分理由的。无论如何,该标准无法预见可以实现 C 编译器的所有硬件和操作系统。

于 2013-02-14T21:51:22.770 回答
2

ABI 绝对不是标准的。至少,不在 C 标准中。每个操作系统或工具链都指定了这些内容,但语言本身没有。例如,尝试在 Linux 机器上运行 Windows 程序。

于 2013-02-14T21:48:03.723 回答
1

ABI 由操作系统和/或工具链定义,而不是由标准定义。例如,它定义了参数如何传递给函数调用。stackframe 具有什么布局或如何调用系统调用。

大多数语言能够与 C 库交互的原因很可能是因为大多数操作系统(或多或少)是用 C 编写的,将 C 库公开为 API 并基于此定义 ABI。如果用某种语言编写的库想要连接特定的操作系统,它必须能够连接该操作系统的 ABI。

于 2013-02-14T21:53:53.357 回答
1

ABI 不是 C 标准的一部分。但是,一直在努力使 ABI 标准化。引用“ Linux系统编程”:

尽管为跨多个操作系统的给定架构(特别是 Unix 系统上的 i386)定义单个 ABI 已经进行了多次尝试,但这些努力并没有取得多大成功。相反,操作系统(包括 Linux)倾向于定义它们自己认为合适的 ABI。

于 2013-02-14T21:54:32.357 回答