框架、SDK、库、API

 

框架(Framework)

通常指的是为了实现某个业界标准或完成特定基本任务的软件组件规范,也指为了实现某个软件组件规范时,提供规范所要求之基础功能的软件产品。框架是针对开发人员的规范或软件产品,一般为开发更上层应用提供基础功能,可开发框架一般有适用的特定领域,比如作为网络程序开发基础中间件的ACE框架,作为桌面应用程序开发框架的Qt、MFC。

框架面向的使用者一般是开发人员,因为框架提供的是开发标准

集成时要求使用者对框架的原理有较深入理解,不可能将框架视作黑箱子使用。这是框架与库或者SDK产品最大的区别。

常见的开发框架有:

c++
ACE, Qt, MFC
java
Spring
python
Django
 

SDK(Software Development Kit)

软件开发工具包,指辅助开发某一类软件的相关文档、范例和工具的集合。其中也包括SDK使用到开发框架和类库。SDK和库其实比较类似,也是为使用提供功能,但是不同的是,库提供的代码是比较底层的功能,比如提供网络传输的功能,而SDK提供的是业务应用领域的功能,比如百度地图SDK提供地图业务相关的接口,大华提供的NetSDK提供控制大华摄像头相关的接口。SDK产品一般是企业针对其具体业务设计开发,是企业对外提供服务的手段之一。一款完整的SDK产品,不经包括完善的文档说明、使用实例、测试用例等。SDK产品开发,会使用开发框架和库。

SDK产品面向的使用者是客户的开发人员。

SDK集成方式类似库。

SDK的API

你可以把SDK想象成一个虚拟的程序包,在这个程序包中有一份做好的软件功能,这份程序包几乎是全封闭的,只有一个小小接口可以联通外界,这个接口就是API。

API是一个函数,有其特定的功能;而SDK是一个很多功能函数的集合体,一个工具包。
API是数据接口,SDK相当于开发集成工具环境,要在SDK的环境下来调用API。
API接口对接过程中需要的环境需要自己提供,SDK不仅提供开发环境,还提供很多API。
简单功能调用,API调用方便快捷;复杂功能调用,SDK功能齐全。

 

 

库(Library)

用于开发软件的子程序集合。库和可执行文件的区别是,库不是独立程序,他们是向其他程序提供服务的代码。库是封装好的代码,通过调用开放出来的API获取相应的功能,比如网络库提供网络相关的功能,深度学习库提供深度学习相关功能,

库面向的使用者还是开发人员,为了实现真正的业务功能,往往需要使用多个库的功能。

c++库的集成方式有两种,显式集成和隐式集成,开发者完全可以以黑匣子的方式集成库提供的功能,而不必关心库内部的运行原理。

常见的库有:

c++
opencv, libevent, libcurl, libuuid, openssl
java
NIO, HttpClient
python
numpy, sicpy

库的API

泛指用户使用库功能的接口,包括类、方法、变量等。

 

API(Application Programming Interface)

API的含义有多种:

一、软件开发中的API

1:用户级API

先理解什么是库函数:

       顾名思义是把函数放到库里,是把一些常用到的函数编完放到一个文件里,供别人用。别人用的时候把所在的文件名用#include<>加到里面就可以了,一般放到lib文件里。库函数一般分为两类:一种是C语言标准规定的库函数,一类是编译器特定的库函数。libc就是一个C标准库,里面放着一些基本的函数,这些函数都被标准化了。

           库函数调用通常用于应用程序中对一般文件的访问,库函数调用是系统无关的,因此移植性好。

           库函数主要由两方面提供:一是操作系统提供的;另一类是由第三方提供的。

           系统提供的这些函数把系统调用进行封装或者组合,可以实现更多的功能,这样的库函数能够实现一些对于内核来说比较复杂的操作。比如read函数根据参数,直接就能读文件,而背后隐藏的文件比如在那个磁道,那个扇区,加载到那个内存,是程序员不必关心的问题。这些操作里面也包含了系统调用。

           对于第三方库,其实和系统库一样,只是他直接利用系统调用的可能性要小一些,而是系统提供的API接口来是实现(API接口是开放的)。比如printf和getchar这样,他们都是一个“外壳”,真正实现的不是它们本身,而是调用了别的函数。

           如printf的实现最终还是调用了putc()和user.h中的write()这样的系统调用,而另一些则不会使用系统调用,比如strlen,strcat,memcpy等;库函数大部分是对系统函数的封装(不绝对)

什么是用户级API?

替用户写好函数,方便调用,使程序员可以将焦点放在设计程序逻辑上面,而不必再编写繁琐、重复的程序,不必关注技术的细节。例如VC++,MFC,VB等都是类库和各种控件,它代替了API的神秘功能。

2:系统级API

如果应用程序想要和硬件交互,必须调用此类函数。程序员调用的是API(api函数),然后通过与系统调用共同完成函数的功能。因此,API是一个提供给应用程序的接口,一组函数,是与程序猿直接进行交互的。系统调用则不与程序员进行交互,它是根据API函数,通过一个软件中断机制向内核提交请求(trap指令类似于一个系统中断,系统也会有一个特殊的中断处理函数(interrupt handler)来处理用户的请求),以获得内核服务的接口。并不是所有的API函数都一一对应一个系统的调用,有时,一个API函数会需要几个系统调用共同来完成函数的功能,甚至一些API函数不需要调用相应的系统调用,不需要内核提供的服务。

操作系统api,如果是指系统调用。我们通常说来就是open、read、write等等函数,这些man手册第二页中的函数,几乎很多linuxC编程的书籍中都会说其是系统调用。
但实际上open、read、write…….这些其实是库函数(glibc库函数,不是标准库哈),通常是由glibc库中实现的。不过,我们却也称之为“系统调用”。这是为什么呢?
原因很简单,系统调用实际可用分为两类:
1.系统调用服务例程(或者叫系统调用函数)
2.系统调用封装函数(或者叫glibc封装函数、系统调用API函数)严格来讲,系统调用应该是指的内核实现的服务例程。而我们通常所说的open、read、write这些实际上是系统调用服务例程的封装,称之为系统调用的封装函数。它们之间几乎具有一—对应的关系(通常在封装函数前面加上前缀sys_,就是实际的内核服务函数了):
例如open函数实际上是对内核的系统调用函数sys_open的封装。从open到sys_open,并不是普通的C语言中函数调用可以的了,因为它们是运行在不同态之中的。open是用户态,sys_open是内核态。进程由用户态到内核态的转变是通过软中断来陷入的。
所谓“软中断”就是一条CPU的汇编指令:
·×86架构:通常就是128号中断,即为软中断:写作int 0x80;后来因特尔引入了性能更好的sysenter指令来完成软中断的工作。
·arm架构:就是swi指令
实际上内核的每一个系统调用都有一个系统调用号,即一个数字。在执行软中断的时候,通常是将系统调用号也作为参数传递过去。内核中有执行系统调用的例程(可能不是C,而是汇编),它通过系统调用号查找系统调用表,然后找到该系统调用(类似函数指针),再去执行它。

 

二、web API

从技术角度来说,API指的是应用程序编程接口。大多数大型企业都会为自己的客户建立应用程序编程接口,或供内部使用。

但是你该如何用大白话来解释API这个术语呢?除了在开发和业务中的含义,API是不是有更宽泛的含义呢?

 

以下主要讲解 Web API。首先,让我们退后一步,来了解一下互联网究竟是如何工作的。

WWW和远程服务器

当我想到互联网的时候,我的脑海中浮现出了一个由互联服务器构成的大型网络。

互联网上的每一个界面都被存储在一个远程服务器里。远程服务器也没有大家想的那么神秘——它不过是用来优化处理需求的远程计算机罢了。

为了正确了解API,你可以在自己的笔记本电脑上启动一个能面向网络提供整个网站服务的服务器(事实上,在网站正式上线之前,工程师们就是通过本地服务器来开发网站的)。

当你在浏览器中输入www.facebook.com,一则请求会出现在Facebook的远程服务器上。一旦你的浏览器收到了响应,它就会解析代码、呈现出网页。

对于浏览器来说(这也是所谓的客户端),Facebook的服务器就是一个应用程序编程接口。这意味着每当你在互联网上访问一个页面的时候,你都在与某个远程服务器的API发生交互。

API并不完全等同于远程服务器——它其实是服务器的一部分,负责接收请求并发送响应。

API是一种为客户提供服务的方式

你也许听说过有公司将API包装成产品。举个例子,Weather Underground就会出售其天气数据API的访问权限给其他人。

示例场景:你是一家小企业,公司网站上有一个表格是用来给客户注册预约的。你想要凭借这些预约细节信息,让客户能够自动在谷歌日程上创建活动。

API使用:这就意味着,你的网站服务器需要直接与谷歌服务器进行对话,在掌握既定细节信息的情况下,申请创建活动。之后,你的服务器就会接收到谷歌的响应并进行处理,然后将相关信息发送回浏览器,比如说向用户发送一个确认信息。

此外,你的浏览器通常可以绕过自己的服务器,直接向谷歌服务器发送API请求。

那么谷歌日历的API与其他远程服务器的API存在什么区别呢?

从技术角度来说,不同之处在于请求和响应的形式。

为了提交整个页面,你的浏览器会期待得到HTML格式的响应,这就包括显示代码。而谷歌日历的API只会返回一些数据——大多是与JSON格式相同。

如果你的网站浏览器发出了API请求,之后网站服务器就成为了客户端(当你使用浏览器访问某一网站的时候,你的浏览器也相当于是一个客户端)。

从用户角度来说,API可以让他们无需离开网站就能完成原先的操作。

现今大多数网站至少都会使用一些第三方API。

存在的问题都有了第三方解决方案,但是是以库或服务的形式。使用现有的解决方案已经变得更加方便且可靠了。

开发团队将自己的应用分解到多个可以通过API进行互通的服务器上,这已经是司空见惯的做法了。这些为主应用服务器提供辅助功能的服务器通常被称作是微服务架构。

总结一下,当一家公司为客户提供API的时候,这仅仅意味着它们建立了一组专用的URL通道,用来返回纯数据响应——也就是说,响应内容不会包含图形用户界面(例如网站)中的显示开销。

你能够用自己的浏览器发送这种请求吗?通常都是可以的。由于实际的HTTP传输都是以文本的形式进行的,你的浏览器可以一直达到显示响应的最佳状态。

举个例子,你可以直接通过浏览器访问GitHub的API,而无需访问令牌。

Web API 的常见格式包括 XML 和 JSON,尽管 JSON 在很流行,因为它比XML 轻而易读,而 XML 在 Java 世界中仍然占据重要的位置,特别是企业级(例如,在 SOAP 中进行会话的 API)。对于需要交换大量数据(特别是多人游戏)的应用,像 ProtoBufMsgPack 这样的二进制协议经常被用来节省空间并提高编码/解码的效率。



具体更详细解释可见链接:https://zhuanlan.zhihu.com/p/31294362
来源:知乎
 

三、万物皆可API

广义的API,就是发生相互交互的地方,就像我们去饭店吃饭,我点了一个小鸡炖蘑菇,菜做好之后,有服务员来给我端菜,这里服务员的一系列动作,就是完成了一次交互,形象一点理解,服务员就是我们口中所说的应用程序接口API。

简单来说,在CS中API就是计算机中不同组件发生交互的地方。

 

 

 

个人理解:百度百科给的定义比较符合软件开发当中API的概念,现在人们常说的API一般指web API。

 

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐