API 是否需要 ABI 才能有效运行?

Is ABI required for an API to function effectively?

有一个程序利用 API 以 Java、C++ 和 C 语言编写。您是否需要描述 ABI 才能使它们有效运行?

据我了解,ABI 在 API 的较低级别充当 API。 (ABI 用于定义二进制代码的不同组件如何针对给定的操作进行交互 给定架构上的系统)

这个我不太确定。如果我错了请纠正我,请提供有关 API 是否需要 ABI 才能运行的详细信息。

There is a program that utilizes APIs written in Java, C++, and C. Do you need to describe an ABI for these to function effectively?

ABI 仅涵盖低级机制 - 例如如何传递参数(在 CPU 寄存器中,在堆栈上)和一些其他细节(堆栈对齐要求,哪些寄存器“被调用者保存”并且被被调用者丢弃等)。 ABI 不关心诸如函数的作用之类的事情。

API 则相反——它只关心函数的作用(程序员如何使用高级语言中的 API),而不关心低级机制(如何传递参数等)。

示例是任何可移植开源库(zlibc、SDL、OpenSSL、GMP)或任何标准化 APIs(OpenGL、MPI、标准 library/libraries,它们是您使用的语言);无论编译器恰好使用哪个 ABI,API 都是相同的。

A counter-example 是固件接口(例如 UEFI),其中相同的规范描述了 API 和 ABI(主要是因为您不能在想要安装时重新编译和重新安装固件具有不同“首选”ABI 的不同 OS。

注意:因为Java主要使用JIT,所以它没有“ABI”的概念(或者说,“ABI”是JVM之外不知道的内部实现细节)和代码用 Java 编写的不能被其他语言编写的代码调用。有特殊津贴(Java 本机接口)允许 Java 软件通过调用本机代码。本机代码使用的任何 ABI。

Correct me if I am wrong and please provide details on whether an ABI is required for an API to function.

从技术上讲,API 需要某种 ABI 才能运行,只是通常您不关心它是哪个 ABI(以类似的方式,需要某种机器代码用于执行高级语言源代码,但您很少有理由关心它是哪个 CPU 的机器代码。