[譯] ABI Stability and More
在 macOS、iOS、watchOS 和 tvOS 上穩定 Swift 的 ABI
一直是一個長期目標。雖然穩定的 ABI 是任何語言成熟的重要里程碑,但 Swift 生態系統的最終收益是為應用程式和庫提供二進位制相容性。這篇文章描述了 Swift 5 中的二進位制相容性意味著什麼 以及 它將如何在未來的 Swift 版本中發展 。
您可能會問:其他平臺怎麼樣?ABI 穩定性是針對它編譯和執行的每個作業系統實現的。Swift 的 ABI 目前在 Apple 平臺上已經是穩定了。隨著 Swift 在 Linux、Windows 和其他平臺上的開發日趨成熟,Swift 核心團隊將評估在這些平臺上穩定 ABI 的問題。
Swift 5 為應用程式提供二進位制相容性:保證在將來,使用一個版本的 Swift 編譯器構建的應用程式將能夠與使用其他 Swift 版本構建的庫進行通訊。即使使用相容模式與舊語言版本(-swift-version 4.2)通訊,這也一樣適用。

在此示例中,使用 Swift 5.0 構建的應用程式將在安裝了 Swift 5 標準庫的系統上執行,同樣也可以在後續的安裝了 Swift 5.1 或 Swift 6 的系統上執行。
Apple OS 的 ABI 穩定性意味著部署到即將釋出的這些作業系統的應用程式將不再需要在應用程式包中嵌入 Swift 標準庫和“覆蓋”庫,從而減小其下載大小;Swift 執行時和標準庫將隨 OS 一起提供,就像 Objective-C 執行時一樣。
有關這如何影響提交到 App Store 的應用程式的更多資訊,請參閱 Xcode 10.2 release notes
。
模組穩定性
ABI 穩定性更多的是關於在執行時混合不同版本的 Swift。那編譯期呢?現在,Swift 使用一種名為 “ swiftmodule
” 的不透明歸檔格式來描述庫的介面,例如框架 “MagicKit”,而不是手動編寫的標頭檔案。但是,“swiftmodule” 格式與編譯器的當前版本相關聯,這意味著如果 MagicKit 是使用不同版本的 Swift 構建的,則應用程式開發人員無法 import MagicKit
。也就是說,app 開發人員和庫作者必須使用相同版本的編譯器。
要移除此限制,庫作者需要一個當前正在實現的功能,即 模組穩定性 (module stability)。這涉及使用模組的文字摘要來增強不透明格式,類似於您在 Xcode 的 “ Generated Interface
” 檢視中看到的,這樣客戶端可以使用模組而無需關心它構建的編譯器。可以在 Swift 論壇上閱讀更多相關資訊。

作為一個例子,你可以使用 Swift 6 構建一個 framework,Swift 6 和未來的 Swift 7 編譯器都可以讀取該 framework 的介面。
注意,這裡的所有 Swift 版本號都是假設的。
Library Evolution
到目前為止,我們一直在討論更改編譯器,但保持 Swift 程式碼不變。應用程式正在使用的庫的修改又如何呢?目前,當一個 Swift 庫發生變化時,任何使用該庫的應用程式都必須重新編譯。這有一些優點:因為編譯器知道應用程式正在使用的庫的確切版本,從而可以做出額外的假設,減少程式碼大小並使應用程式執行得更快。但是對於下一版本的庫,這些假設可能就不適用了。
這個特性就是 library evolution 支援 :使用新版本的庫而無需重新編譯客戶端。當 Apple 在作業系統中更新庫時會發生這種情況,不過當一家公司的二進位制框架依賴於另一家公司的二進位制框架時,這也很重要。在這種情況下,更新第二個框架理想情況下不需要重新編譯第一個框架。

在此示例中,應用程式是根據框架的原始版本構建的,為黃色。由於支援 library evolution,它可以在具有黃色版本的系統上執行,也可以在新的、改進的紅色版本上執行。
Swift 已經實現了對 library evolution 的支援,非正式地稱之為“ resilience
”。這對於需要的庫來說是個可選功能,它使用尚未最終確定的註釋來在效能和未來的靈活性之間取得平衡,您可以在標準庫的原始碼中看到。第一個通過 Swift Evolution Process 的是@inlinable,在 Swift 4.2(SE-0193)中新增。
總結
當Swift有... | ...然後可以修改... | 狀態 |
---|---|---|
ABI 穩定 | Swift 標準庫 | 在 macOS、iOS、watchOS 和 tvOS 的 Swift 中 |
模組穩定性 | 編譯器 | 積極發展 |
Library Evolution 支援 | 庫的API | 大部分已實施,但需要經歷Swift演進過程 |
關注我們
歡迎關注我們的公眾號:iOS-Tips,也歡迎加入我們的群組討論問題。可以加微信 coldlight_hh
/ wsy9871
進入我們的 iOS
/ flutter
微信群。
