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包

相關文章
相關標籤/搜索