广义的 API 是指应用程序编程接口,
包括在操作系统中的动态链接库文件例如 dll、so,或者基于 TCP 的 socket 连接,
用来提供预定义的方法和函数,调用者无需访问源码和理解内部原理便可实现相应功能。
狭义的 API 很多时候是指通过 HTTP 协议传输的 web service 技术。
API在概念上和语言无关,理论上具有网络操作能力的所有编程语言都可以提供API服务。
API 是用于构建应用程序软件的一组子程序定义,协议和工具。
Application Programming Interface
API往往指源代码级别的接口
API定义了源代码和库之间的接口,因此同样的代码可以在支持这个API的任何系统中编译。
它的“应用程序”有两种
一种是在它之上的,用户空间的真正的应用程序,内核给它们提供的是系统调用这种接口。
比如 read(2),write(2)
一种就是内核模块了,它们和内核处于同一层,内核给它们提供的是导出的内核函数。
比如 kmalloc(),printk()
这些接口都是你可以在编写程序的时候直接看到的,可以直接拿来用的。
ABI的兼容程度比API要更为严格
API更关注源代码层面
举例
比如POSIX规定printf()这个函数原型,它能保证这个函数定义的所有遵循POSIX标准的系统直接都是一样的
但是它不保证printf在实际的每个系统中执行时,是否按照从右到左将参数压入堆栈
参数在堆栈中如何分布等这些实际运行时的二进制级别的问题
比如有两台机器,一台是Intel X86,另外一台是MIPS的 都安装了linux系统
由于linux支持POSIX标准,所以他们的c运行库都应该有printf函数
但实际上printf在被调用过程中,这些关于参数和堆栈分布的细节在不同的机器上肯定是不一样的
甚至调用printf的指令也是不一样的(x86是call指令,MIPS是jal指令),这就是说,API相同并不表示ABI相同。