当前位置: 首页 > 后端技术 > Node.js

Node.jsGuide(ABIStability)

时间:2023-04-03 18:31:34 Node.js

ABIStabilityIntroductionTheApplicationBinaryInterface(ABI)isawayforprogramstocallfunctionsandusedatastructuresfromothercompiledprograms,itisanapplicationprogramminginterface(API)编译的版本,换句话说,头文件描述了使应用程序能够通过编译为一组地址、预期参数值和内存结构大小来执行所需任务的类、函数、数据结构、枚举和常量,以及已编译的ABI提供程序的布局。使用ABI的应用程序必须经过编译,以便可用地址、预期参数值以及内存结构大小和布局与编译ABI提供程序的那些一致,这通常是通过编译ABI提供的头文件来完成的提供商。由于ABI的提供者和ABI的使用者可以在不同的时间使用不同版本的编译器进行编译,因此确保ABI兼容性的部分责任在于编译器。不同版本的编译器,可能由不同的供应商提供,必须从具有特定内容的头文件生成相同的ABI,并且必须根据头文件中描述的结果ABI约定使用访问给定头文件中描述的API的API。ABI为应用程序生成代码。今天的编译器在不破坏他们编译的应用程序的ABI兼容性方面有着相当不错的记录。确保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-native当编译它的主要版本中的任何Node.js次版本或补丁版本加载时,为编译它的Node.js版本编译的插件将成功加载。N-API出现了对配备Node.js的API的需求,这导致ABI在多个Node.js主要版本中保持稳定。创建这样一个API的动机如下:JavaScript语言从一开始就与自身兼容,而JavaScript代码引擎的执行ABI随着Node.js的每个主要版本而变化。这意味着完全用JavaScript编写的由Node.js包组成的应用程序不需要重新编译、重新安装或重新部署,因为Node.js的新主要版本被放入运行此类应用程序的生产环境中。相反,如果应用程序依赖于包含本机插件的包,则每当将Node.js的新主要版本引入生产时,都必须重新编译、重新安装和重新部署应用程序。包含本机插件的Node.js包和完全用JavaScript编写的包之间的这种差异增加了依赖本机插件的生产系统的维护负担。其他项目已经开始生成JavaScript接口,这些接口本质上是Node.js的替代实现,并且由于这些项目通常构建在与V8不同的JavaScript引擎上,因此它们的本机插件必然具有不同的结构并使用不同的API。但是,在Node.jsJavaScriptAPI的不同实现中使用单个API作为本机插件将允许这些项目利用围绕Node.js积累的JavaScript包生态系统。Node.js将来可能包含不同的JavaScript引擎,这意味着在外部,所有Node.js接口将保持不变,但V8标头将不存在。如果与JavaScript引擎无关的API不是首先由Node.js提供并被原生插件采用,那么这样的步骤通常会导致Node.js生态系统的中断,尤其是原生插件。为此,Node.js在8.6.0版本中引入了N-API,并在Node.js8.12.0中将其标记为项目的稳定组件。API在头文件node_api.h和node_api_types.h中定义,并提供跨Node.js主要版本边界的前向兼容性保证,这些保证可以声明如下:N-API的给定版本n将在节点。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已添加到实验标志下,让社区有机会在生产中对其进行审核。实验状态意味着,虽然已经注意确保新API将来不必以ABI不兼容的方式进行修改,但其正确和有用的设计尚未在生产中得到充分证明,因此,可能会进行与ABI不兼容的更改。也就是说,实验性N-API尚未包含在前向兼容性保证中。上一篇:如何发布N-API包