摘要:確保兼容性的剩余責(zé)任在于團(tuán)隊維護(hù)頭文件,這些頭文件提供了在編譯時在中保持穩(wěn)定的。中的穩(wěn)定性提供由幾個獨立團(tuán)隊維護(hù)的頭文件,例如,團(tuán)隊維護(hù)諸如和之類的頭文件。由團(tuán)隊維護(hù),盡管與團(tuán)隊密切合作,但該團(tuán)隊是獨立的,并且有自己的時間表和優(yōu)先級。
ABI穩(wěn)定性 介紹
應(yīng)用程序二進(jìn)制接口(ABI)是程序調(diào)用函數(shù)和使用其他編譯程序的數(shù)據(jù)結(jié)構(gòu)的一種方法,它是應(yīng)用程序編程接口(API)的編譯版本,換句話說,頭文件描述了類、函數(shù)、數(shù)據(jù)結(jié)構(gòu)、枚舉和常量,使應(yīng)用程序能夠通過編譯到一組地址來執(zhí)行所需的任務(wù),和預(yù)期參數(shù)值和內(nèi)存結(jié)構(gòu)大小以及編譯ABI提供程序的布局。
必須編譯使用ABI的應(yīng)用程序,以使可用地址、預(yù)期參數(shù)值、內(nèi)存結(jié)構(gòu)大小和布局與編譯ABI提供程序的那些一致,這通常通過編譯ABI提供程序提供的頭文件來完成。
由于ABI的提供者和ABI的用戶可以在不同的時間使用不同版本的編譯器進(jìn)行編譯,因此確保ABI兼容性的一部分責(zé)任在于編譯器。不同版本的編譯器,也許由不同的供應(yīng)商提供,必須從具有特定內(nèi)容的頭文件生成相同的ABI,并且必須根據(jù)頭文件中描述所產(chǎn)生的ABI約定,使用訪問給定頭中描述的API的ABI為應(yīng)用程序生成代碼。現(xiàn)今編譯器具有相當(dāng)好的跟蹤記錄,即不破壞它們編譯的應(yīng)用程序的ABI兼容性。
確保ABI兼容性的剩余責(zé)任在于團(tuán)隊維護(hù)頭文件,這些頭文件提供了在編譯時在ABI中保持穩(wěn)定的API。可以對頭文件進(jìn)行更改,但必須密切跟蹤更改的性質(zhì),以確保在編譯時,ABI的更改方式不會使ABI的現(xiàn)有用戶與新版本不兼容。
Node.js中的ABI穩(wěn)定性Node.js提供由幾個獨立團(tuán)隊維護(hù)的頭文件,例如,node.js團(tuán)隊維護(hù)諸如node.h和node_buffer.h之類的頭文件。v8.h由V8團(tuán)隊維護(hù),盡管與Node.js團(tuán)隊密切合作,但該團(tuán)隊是獨立的,并且有自己的時間表和優(yōu)先級。因此,Node.js團(tuán)隊只能部分控制項目提供的頭中引入的更改,因此,Node.js項目采用了語義版本控制。這可確保項目提供的API將為一個主要版本中發(fā)布的Node.js的所有次要版本和修補(bǔ)程序版本提供穩(wěn)定的ABI,在實踐中,這意味著Node.js項目已承諾確保針對給定主要版本的Node.js編譯的Node.js原生插件將在由編譯它的主要版本中的任何Node.js次要或補(bǔ)丁版本加載時成功加載。
N-API對Node.js配備API的需求已經(jīng)出現(xiàn),這導(dǎo)致ABI在多個Node.js主要版本中保持穩(wěn)定,創(chuàng)建這樣一個API的動機(jī)如下:
JavaScript語言從很早就開始與自身兼容,而執(zhí)行JavaScript代碼的引擎的ABI隨Node.js的每個主要版本而變化。這意味著完全用JavaScript編寫的Node.js包組成的應(yīng)用程序無需重新編譯、重新安裝或重新部署,因為Node.js的新主要版本被放入生產(chǎn)環(huán)境中,此類應(yīng)用程序運行在該環(huán)境中。相反,如果應(yīng)用程序依賴于包含原生插件的包,則只要將新的主要版本的Node.js引入生產(chǎn)環(huán)境,就必須重新編譯、重新安裝和重新部署應(yīng)用程序。包含原生插件的Node.js包與完全用JavaScript編寫的包之間的這種差異增加了依賴原生插件的生產(chǎn)系統(tǒng)的維護(hù)負(fù)擔(dān)。
其他項目已經(jīng)開始生成JavaScript接口,這些接口本質(zhì)上是Node.js的替代實現(xiàn),由于這些項目通常構(gòu)建在與V8不同的JavaScript引擎上,因此它們的原生插件必然采用不同的結(jié)構(gòu)并使用不同的API。然而,在Node.js JavaScript API的不同實現(xiàn)中使用單個API作為原生插件將允許這些項目利用圍繞Node.js積累的JavaScript包的生態(tài)系統(tǒng)。
Node.js將來可能包含不同的JavaScript引擎,這意味著,在外部,所有Node.js接口將保持不變,但V8頭文件將不存在。如果與JavaScript引擎無關(guān)的API不是由Node.js首先提供并由原生插件采用,那么這樣的步驟通常會導(dǎo)致Node.js生態(tài)系統(tǒng)的中斷,特別是原生插件的中斷。
為此,Node.js在版本8.6.0中引入了N-API,并將其標(biāo)記為Node.js 8.12.0中項目的穩(wěn)定組件。API在頭文件node_api.h和node_api_types.h中定義,并提供跨越Node.js主要版本邊界的前向兼容性保證,保證可以說明如下:
N-API的給定版本n將在發(fā)布它的Node.js的主要版本中提供,以及Node.js的所有后續(xù)版本,包括后續(xù)主要版本。
原生插件作者可以通過確保插件僅使用node_api.h中定義的API以及node_api_types.h中定義的數(shù)據(jù)結(jié)構(gòu)和常量來利用N-API前向兼容性保證。通過這樣做,作者通過向生產(chǎn)用戶表明,對于他們的應(yīng)用程序來說,添加原生插件不會增加維護(hù)負(fù)擔(dān),就像添加純JavaScript編寫的包一樣。
N-API已版本化,因為有時會添加新API,與語義版本控制不同,N-API版本控制是累積的。也就是說,每個版本的N-API都傳達(dá)了與semver系統(tǒng)中的次要版本相同的含義,意味著對N-API所做的所有更改都將向后兼容。此外,在實驗標(biāo)志下添加了新的N-API,以便社區(qū)有機(jī)會在生產(chǎn)環(huán)境中審核它們。
實驗狀態(tài)意味著,雖然已經(jīng)注意確保將來不必以ABI不兼容的方式修改新API,在生產(chǎn)中尚未充分證明其正確和有用的設(shè)計,因此,在最終納入即將推出的N-API版本之前,可能會進(jìn)行ABI不兼容的更改。也就是說,前向兼容性保證尚未涵蓋實驗性N-API。
上一篇:如何發(fā)布N-API包文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/100316.html
Node.js 指南 Node.js?是基于Chrome的V8 JavaScript引擎構(gòu)建的JavaScript運行時。 常規(guī) 關(guān)于Node.js 入門指南 輕松分析Node.js應(yīng)用程序 Docker化Node.js Web應(yīng)用程序 遷移到安全的Buffer構(gòu)造函數(shù) Node.js核心概念 阻塞與非阻塞概述 Node.js事件循環(huán)、定時器和process.nextTick() 不要阻塞事...
摘要:參考文檔是基于的引擎構(gòu)建的運行時。關(guān)于文檔用法和示例斷言測試穩(wěn)定性穩(wěn)定模塊提供了一組簡單的斷言測試,可用于測試不變量。存在和模式,但建議僅使用模式。類在全局作用域內(nèi),因此不太可能需要使用。以下所有示例均可供下載,可用作擴(kuò)展庫的起點。 Node.js v11.5.0 API參考文檔 Node.js?是基于Chrome的V8 JavaScript引擎構(gòu)建的JavaScript運行時。 關(guān)...
摘要:如何發(fā)布包使用包說明了以下步驟首先,發(fā)布非版本更新中的版本,對于,版本變?yōu)椤g覽發(fā)布清單確保測試演示文檔正常。因此,如果軟件包維護(hù)者選擇使用相同的標(biāo)記標(biāo)記軟件包的更高版本,則將收到更高版本的版本。 如何發(fā)布N-API包 使用包iotivity-node說明了以下步驟: 首先,發(fā)布非N-API版本: 更新package.json中的版本,對于iotivity-node,版本變?yōu)?....
摘要:啟動節(jié)點環(huán)境配置腳本創(chuàng)建文件夾,保存如下代碼至運行開發(fā)環(huán)境運行結(jié)果日志部分如果你看到了以上的消息,說明運行成功,已經(jīng)開始區(qū)塊生產(chǎn)。 搭建一個 FIBOS 開發(fā)環(huán)境需要安裝 fibos 和 fibos.js。 本章節(jié)示例代碼的目錄結(jié)構(gòu): hello_fibos/ ├── fibos_client │ ├── call.js //調(diào)用合約接口腳本文件 │ ├── initCli...
摘要:啟動節(jié)點環(huán)境配置腳本創(chuàng)建文件夾,保存如下代碼至運行開發(fā)環(huán)境運行結(jié)果日志部分如果你看到了以上的消息,說明運行成功,已經(jīng)開始區(qū)塊生產(chǎn)。 搭建一個 FIBOS 開發(fā)環(huán)境需要安裝 fibos 和 fibos.js。 本章節(jié)示例代碼的目錄結(jié)構(gòu): hello_fibos/ ├── fibos_client │ ├── call.js //調(diào)用合約接口腳本文件 │ ├── initCli...
閱讀 2515·2021-11-18 10:02
閱讀 1984·2021-11-09 09:45
閱讀 2429·2021-09-26 09:47
閱讀 1025·2021-07-23 10:26
閱讀 1069·2019-08-30 15:47
閱讀 3362·2019-08-30 15:44
閱讀 971·2019-08-30 15:43
閱讀 887·2019-08-29 13:50