簡體   English   中英

API 和 ABI 版本在 Ruby 中是什么意思?

[英]What do API and ABI versions mean in Ruby?

我在“指定目標路徑 (--path) #5424 時不正確的 ruby​​ 版本”中遇到了一條評論,我不明白:

我相信因為 API 和 ABI 版本是 2.3.0,所以這就是用於目錄的原因? rubygems 以同樣的方式在一個名為 1.9.1 的目錄中安裝 1.9.3 的東西。 除非這會導致您的設置出現問題,否則我認為這可能更像是一種好奇而不是錯誤

就上下文而言,本期討論的 Ruby 版本是 2.3.1。 所以顯然 Ruby 2.3.1 的“API 和 ABI 版本”都是 2.3.0。 我可以接受這一點,但我不明白的是 API 版本或 ABI 版本可能指的是什么。

這些術語是什么意思?

我們先來看看APIABI是什么意思。

應用程序編程接口是由其他人提供給您的一組類型、約束、協議、模塊、函數、類、特征、方法、過程等(取決於編程語言)。 然后,您可以利用這些提供的“事物”在頂部構建新的“事物”。

API 總是在編譯時、源代碼級別上定義。 例如,對於 C,API 將根據函數名稱、參數類型等進行定義,並以(一組) .h頭文件的形式提供。

應用程序二進制接口定義了構成 API 的所有位的確切運行時內存布局。

這是一個簡單的例子:

  • POSIX 定義了一個API 例如,它定義了gethostid返回一個long
  • Linux Standard Base定義了(除其他外)POSIX 的ABI 因此,它定義了,例如,在 AMD64 上, long是 64 位,但在 x86 上,它是 32 位。

另一個例子是 Linux 內核中的系統調用:系統調用名稱是 API 的一部分,但系統調用是 ABI 的一部分。

一個非常簡單的思考方式,就是:如果一個API以向后不兼容的方式改變(例如如果系統調用被重命名),你需要對源代碼進行更改,即開發人員需要積極干預,而如果ABI以向后不兼容的方式更改,您需要對二進制代碼進行更改,通常只需重新編譯,無需開發人員的任何“創造性”干預。

好的,現在我們知道 API 和 ABI 是什么以及它們有什么區別……我們實際上在這里談論的是哪個 API 和 ABI?

好吧,我們正在談論YARVC 擴展 API/ABI YARV Ruby 實現公開了一個編程接口,您可以針對該接口編寫擴展,這些擴展的行為就好像它們是實現的一部分。 例如,Ruby 標准庫的大部分 YARV 實現是作為 YARV C 擴展編寫的,而不是用 Ruby 編寫的(例如openssl )。 許多 gem 包含 YARV C 擴展,要么是出於性能原因,要么是因為 gem 的目的是提供對某些 C 庫的訪問。

因此,我們在這里討論的 API 和 ABI 版本與帶有 YARV C 擴展的 Gems相關。

只要 ABI 版本不變,您就可以更新 YARV,而無需重新安裝您的 gem。 如果 ABI 版本發生變化,您需要重新安裝您的 gems,但您不需要更新它們。

如果 API 版本發生變化,gem 作者需要使 gem 適應變化。 您需要等待更新 YARV,直到發生這種情況,然后更新到新版本的 gem。

我第一次聽說 Ruby 中的 ABI 和 API 是從“ 從 Ruby 2.1.0 開始的 Ruby 版本策略更改”。

API 兼容性以下特性可以標記為不兼容的更改,需要在 MINOR 版本中增加:

刪除 C 級 api 功能向后不兼容的更改或添加

ABI 兼容性 ABI 將遵守以下方案:{MAJOR}.{MINOR}.0

我們將盡最大努力在相同的 MINOR 級別版本中保持 ABI 兼容性,因此 TEENY 將固定為 0。

據我了解,API 是 Ruby 用戶正在使用的,這是高級別的,而 ABI 是 Ruby 實現者正在使用的,這是低級的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM