Node.js 指南(ABI穩定性)

博弈發表於2019-02-16

ABI穩定性

介紹

應用程式二進位制介面(ABI)是程式呼叫函式和使用其他編譯程式的資料結構的一種方法,它是應用程式程式設計介面(API)的編譯版本,換句話說,標頭檔案描述了類、函式、資料結構、列舉和常量,使應用程式能夠通過編譯到一組地址來執行所需的任務,和預期引數值和記憶體結構大小以及編譯ABI提供程式的佈局。

必須編譯使用ABI的應用程式,以使可用地址、預期引數值、記憶體結構大小和佈局與編譯ABI提供程式的那些一致,這通常通過編譯ABI提供程式提供的標頭檔案來完成。

由於ABI的提供者和ABI的使用者可以在不同的時間使用不同版本的編譯器進行編譯,因此確保ABI相容性的一部分責任在於編譯器。不同版本的編譯器,也許由不同的供應商提供,必須從具有特定內容的標頭檔案生成相同的ABI,並且必須根據標頭檔案中描述所產生的ABI約定,使用訪問給定頭中描述的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編譯的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.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包

相關文章