Node.js 指南(ABI稳定性)

ABI稳定性

介绍

应用程序二进制接口(ABI)是程序调用函数和使用其余编译程序的数据结构的一种方法,它是应用程序编程接口(API)的编译版本,换句话说,头文件描述了类、函数、数据结构、枚举和常量,使应用程序可以经过编译到一组地址来执行所需的任务,和预期参数值和内存结构大小以及编译ABI提供程序的布局。node

必须编译使用ABI的应用程序,以使可用地址、预期参数值、内存结构大小和布局与编译ABI提供程序的那些一致,这一般经过编译ABI提供程序提供的头文件来完成。git

因为ABI的提供者和ABI的用户能够在不一样的时间使用不一样版本的编译器进行编译,所以确保ABI兼容性的一部分责任在于编译器。不一样版本的编译器,也许由不一样的供应商提供,必须从具备特定内容的头文件生成相同的ABI,而且必须根据头文件中描述所产生的ABI约定,使用访问给定头中描述的API的ABI为应用程序生成代码。现今编译器具备至关好的跟踪记录,即不破坏它们编译的应用程序的ABI兼容性。github

确保ABI兼容性的剩余责任在于团队维护头文件,这些头文件提供了在编译时在ABI中保持稳定的API。能够对头文件进行更改,但必须密切跟踪更改的性质,以确保在编译时,ABI的更改方式不会使ABI的现有用户与新版本不兼容。编程

Node.js中的ABI稳定性

Node.js提供由几个独立团队维护的头文件,例如,node.js团队维护诸如node.h和node_buffer.h之类的头文件。v8.h由V8团队维护,尽管与Node.js团队密切合做,但该团队是独立的,而且有本身的时间表和优先级。所以,Node.js团队只能部分控制项目提供的头中引入的更改,所以,Node.js项目采用了语义版本控制。这可确保项目提供的API将为一个主要版本中发布的Node.js的全部次要版本和修补程序版本提供稳定的ABI,在实践中,这意味着Node.js项目已承诺确保针对给定主要版本的Node.js编译的Node.js原生插件将在由编译它的主要版本中的任何Node.js次要或补丁版本加载时成功加载。segmentfault

N-API

对Node.js配备API的需求已经出现,这致使ABI在多个Node.js主要版本中保持稳定,建立这样一个API的动机以下:api

  • JavaScript语言从很早就开始与自身兼容,而执行JavaScript代码的引擎的ABI随Node.js的每一个主要版本而变化。这意味着彻底用JavaScript编写的Node.js包组成的应用程序无需从新编译、从新安装或从新部署,由于Node.js的新主要版本被放入生产环境中,此类应用程序运行在该环境中。相反,若是应用程序依赖于包含原生插件的包,则只要将新的主要版本的Node.js引入生产环境,就必须从新编译、从新安装和从新部署应用程序。包含原生插件的Node.js包与彻底用JavaScript编写的包之间的这种差别增长了依赖原生插件的生产系统的维护负担。
  • 其余项目已经开始生成JavaScript接口,这些接口本质上是Node.js的替代实现,因为这些项目一般构建在与V8不一样的JavaScript引擎上,所以它们的原生插件必然采用不一样的结构并使用不一样的API。然而,在Node.js JavaScript API的不一样实现中使用单个API做为原生插件将容许这些项目利用围绕Node.js积累的JavaScript包的生态系统。
  • Node.js未来可能包含不一样的JavaScript引擎,这意味着,在外部,全部Node.js接口将保持不变,但V8头文件将不存在。若是与JavaScript引擎无关的API不是由Node.js首先提供并由原生插件采用,那么这样的步骤一般会致使Node.js生态系统的中断,特别是原生插件的中断。

为此,Node.js在版本8.6.0中引入了N-API,并将其标记为Node.js 8.12.0中项目的稳定组件。API在头文件node_api.hnode_api_types.h中定义,并提供跨越Node.js主要版本边界的前向兼容性保证,保证能够说明以下:数据结构

N-API的给定版本n将在发布它的Node.js的主要版本中提供,以及Node.js的全部后续版本,包括后续主要版本。函数

原生插件做者能够经过确保插件仅使用node_api.h中定义的API以及node_api_types.h中定义的数据结构和常量来利用N-API前向兼容性保证。经过这样作,做者经过向生产用户代表,对于他们的应用程序来讲,添加原生插件不会增长维护负担,就像添加纯JavaScript编写的包同样。布局

N-API已版本化,由于有时会添加新API,与语义版本控制不一样,N-API版本控制是累积的。也就是说,每一个版本的N-API都传达了与semver系统中的次要版本相同的含义,意味着对N-API所作的全部更改都将向后兼容。此外,在实验标志下添加了新的N-API,以便社区有机会在生产环境中审核它们。插件

实验状态意味着,虽然已经注意确保未来没必要以ABI不兼容的方式修改新API,在生产中还没有充分证实其正确和有用的设计,所以,在最终归入即将推出的N-API版本以前,可能会进行ABI不兼容的更改。也就是说,前向兼容性保证还没有涵盖实验性N-API。


上一篇:如何发布N-API包

相关文章
相关标签/搜索