API:Application Programming Interface
ABI:Application Binary Interface。我们把符合修饰标准、变量内存布局、函数调用方式等这些跟可执行代码二进制兼容性相关的内容成为ABI.
实际上它们都是所谓的应用程序接口,只是它们所描述的接口所在的层面不一样。API往往指源代码级别的接口,必然我们可以说POSIX是一个API标准、windows所规定的应用程序接口是一个API;而ABI是指二进制层面的接口,ABI的兼容程度比API要更为严格,比如我们可以说C++的对象内存分布(Object Memory Layout)是C++ ABI的一部分。
API更关注源代码层面,比如POSIX规定printf()这个函数原型,它能保证这个函数定义的所有遵循POSIX标准的系统直接都是一样的,但是它不保证printf在实际的每个系统中执行时,是否按照从右到左将参数压入堆栈,参数在堆栈中如何分布等这些实际运行时的二进制级别的问题。比如有两台机器,一台是Intel X86,另外一台是MIPS的,他们都安装了linux系统,由于linux支持POSIX标准,所以他们的c运行库都应该有printf函数。但实际上printf在被调用过程中,这些关于参数和堆栈分布的细节在不同的机器上肯定是不一样的,甚至调用printf的指令也是不一样的(x86是call指令,MIPS是jal指令),这就是说,API相同并不表示ABI相同。