该 API首字母缩写词在阅读有关软件的文章时会多次出现。 但是,并非所有人都知道API的真正含义。 这就是为什么我们在本文中对其进行澄清。 首先要说的是它们是应用程序编程接口的缩写,即西班牙语中的应用程序编程接口。 很多时候,即使在那些了解某些编程的人中,它也会引起混乱。
例如,Arduino有自己的编程API,提供了许多功能,您可以在Arduino IDE或其他环境中使用这些功能来对微控制器进行编程,以允许您创建项目。 但是...你能告诉我吗 编程库和API之间的区别? 框架和API之间有区别吗?API是否与ABI相同? 有许多疑问可能会继续造成混乱,我们现在将要进行澄清。
我不知道你是否知道 低级语言像汇编器或ASM一样,直接依赖于硬件体系结构,而高层则从硬件中提取以方便程序员的任务,但依赖于操作系统(系统调用)或某些API等。 为了使所有这些听起来都不像中文,让我们看看它的含义是...
什么是API?
一 API是为开发人员提供的工具 因此,他们可以使用现有库中可以使用的OOP一系列功能,子例程和过程或方法。 API提供的功能包括创建简单应用程序的功能,与AI相关的功能,图形的生成,硬件资源的管理等。
例如,我确定您熟悉API,例如Linux通过glibc库提供的API,或诸如以下的图形 OpenGL和Vulkan,或其他类似OpenCL 用于异构计算,用于虚拟现实和增强现实的OpenXR等。 其他操作系统和软件也包括自己的API,以便其他程序员可以为该系统创建插件,插件或模块等。
Arduino的例子
如果您有徽章 Arduino,您经常使用Arduino IDE, 或任何其他Arduino开发环境,您将知道,在创建代码时,您会使用多个选项来命令您的微控制器执行一系列操作。 例如,pinMode()是配置Arduino引脚的典型函数,对吗?
昆多语者 pinMode(9,输入)例如,您指示Arduino板的引脚9应该作为输入,也就是说,微控制器将等待信息通过该引脚输入以读取信息并执行操作。 但是您是否想知道他如何理解该命令?
好吧,Arduino有一个 提供给我们的开发API。 正如我们在此博客的许多示例中所看到的,可以将第三方库添加到此API。 像某些传感器的SparkFun一样,等等。 有了这些,就可以在Arduino IDE中输入功能,它将正确转换代码以将其加载到微控制器的内存中,以便对其进行处理。
如果您没有此API,那么您将无法以这种简单的方式为Arduino创建这些程序,因为我们应该尝试将它们制作为ATMega328P微控制器的汇编代码,即 适用于AVR架构的ASM。 这将更加复杂,因为您将必须直接使用此ISA提供的说明。 如果是这样,您不仅必须充分了解该ISA的全部功能,还必须充分了解其他方面,例如注册数量等。 也就是说,您应该对所使用的硬件有较低的了解。
通过 例如,ASM代码 您应该为LED闪烁而生成的内容是:
<br data-mce-bogus="1"> .ORG 0x0000 ; the next instruction has to be written to ; address 0x0000 rjmp START ; the reset vector: jump to "main" START: ldi r16, low(RAMEND) ; set up the stack out SPL, r16 ldi r16, high(RAMEND) out SPH, r16 ldi r16, 0xFF ; load register 16 with 0xFF (all bits 1) out DDRB, r16 ; write the value in r16 (0xFF) to Data ; Direction Register B LOOP: sbi PortB, 5 ; switch off the LED rcall delay_05 cbi PortB, 5 ; wait for half a second ; switch it on rcall delay_05 ; wait for half a secon rjmp LOOP ; jump to loop DELAY_05: ; the subroutine: ldi r16, 31 ; load r16 with 31 OUTER_LOOP: ; outer loop label ldi r24, low(1021) ; load registers r24:r25 with 1021, our new ; init value ldi r25, high(1021) ; the loop label DELAY_LOOP: ; "add immediate to word": r24:r25 are ; incremented adiw r24, 1 ; if no overflow ("branch if not equal"), go ; back to "delay_loop" brne DELAY_LOOP dec r16 ; decrement r16 brne OUTER_LOOP ret ; and loop if outer loop not finished ; return from subroutine
而 多亏了API,这些设施才算完整, 高层次地编写以下等效代码(更短,更直观):
<br data-mce-bogus="1"> int ledPin = 13; // LED que se encuentra en el pin 13 void setup(){ pinMode(ledPin, OUTPUT); // El p1n 13 será una salida digital } void loop(){ digitalWrite(ledPin, HIGH); // Enciende el LED delay(1000); // Pausa de 1 segundo digitalWrite(ledPin, LOW); // Apaga el LED delay(1000); // Pausa de 1 segundo
与ABI的差异
ABI是一个鲜为人知的术语,它是一个 应用程序二进制接口,或英文应用程序二进制接口。 在这种情况下,它是程序模块之间的接口,通常是您所在的体系结构的库或机器语言操作系统之间的接口:SPARC,AMD64,ARM,PPC,RISC-V等。
多亏了ABI,可以确定调用函数的方式, 二进制格式 可以了解您要编译的机器或系统调用,如何处理异常,如何传递数据等。
与框架的差异
Un 框架或框架更多是一组工具 在您的帮助下,以帮助开发给定的项目。 框架通常设置一些编码标准,提供有用的组件等。 例如,JUnit是Java的框架,或者Symfony / Cake是PHP的框架,等等。
SDK和NDK的差异
SDK是一个软件开发套件,即软件开发套件。 它超出了框架或API的范围。 例如Android Studio或iOS xCode等。 例如,第一个,除了Android API本身,还包括一个IDE或用于编程和编译的集成开发环境,库,工具等。
此外, NDK(本机开发套件) 这是一个补充。 例如,Android NDK允许开发人员通过JNI(Java本机接口)将C / C ++代码引入应用程序,从而重用C / C ++代码。
与图书馆的差异
最后, 该库是可重用的源代码的集合 这使程序员的生活更轻松。 例如,在C库stdio.h中,有一个printf函数可在屏幕上打印文本。 为此,需要使操作系统执行此任务的源代码。 但是由于这是经常性的事情,因此只需调用该库就可以使用printf,而无需从头开始编写所有代码。 换句话说,它们可以看作是预制块。
实际上,库和API很容易混淆, 库包装在API中。 例子 glibc的...
我希望在此之后您有一个主意 更清楚地了解API,ABI,框架,SDK和库的功能,以及从现在开始可以区分它们的功能。