Swift ABI 穩定後的幾個問題

知識小集發表於2019-02-19

原文連結

ABI 的穩定,會讓 Swift 在 Apple 平臺上有更大的發展。不過由於歷史原因,在系統支援和相容性方面,我們還會面臨一些問題。Swift 官方部落格也專門發了一篇文章 Evolving Swift On Apple Platforms After ABI Stability 來進行闡述,來看看他們是怎麼說的。

隨著 Swift 5 的釋出,Swift 的 ABI 也終於穩定下來,並作為 macOS、iOS、tvOS 和 watchOS 核心元件提供。ABI 的穩定所帶來的好處很多,最明顯的就是 Swift 寫的應用不再需要帶著 Swift 執行時庫一起分發,大大減小了應用的體積。作業系統層面也能更好地整合和優化 Swift 執行時,從而讓 Swift 程式啟動更快,獲得更好的執行時效能,同時降低記憶體的消耗。而且 Apple 也可以在未來版本的系統中使用 Swift 來提供平臺級的 framework。當後續版本的 Swift 能提供模組穩定性時,第三方也可以釋出 Swift 編寫的二進位制 framework。

不過也正是由於 ABI 的穩定,Swift 不再是開發人員工具鏈的一部分。因此,後續採用新的 Swift 執行時和標準庫功能的專案,可能需要新版本的系統。其實 Objective-C 也有這個問題,需要在新的語言特性/框架和老版本系統之間做權衡。

什麼型別的語言功能和演進提議可能僅限於未來的作業系統版本?

任何需要新的 Swift 執行時或標準庫支援的功能都可能受作業系統可用性限制。這包括:

  • 標準庫的附加內容,包括新型別、協議、協議一致性、函式、方法或屬性。
  • 對 Swift 型別系統的更改,例如新型別、現有型別的新修飾符(例如函式型別屬性)、新橋接、子型別和/或動態轉換關係等。

核心小組後續會考慮新提案的後向相容性影響。

ABI 穩定性是否會影響我們使用 Swift 4.0 或 4.2 模式來維持現有原始碼的相容性?它會影響我將來改用新語言模式的能力嗎?

不會。語言相容性設定是一個純編譯時功能,用於控制原始碼相容性。它不會影響到 ABI。我們不需要將 Swift 4 程式碼遷移到 Swift 5 模式以便使用 Swift 5 的穩定 ABI,並且如果不使用需要新執行時特性的語言功能時,也可以採用新的語言模式而不會強制要求新的系統。

我是否必須使用 Xcode 10.2 重新編譯現有的 Swift 應用程式才能在最新的作業系統上執行?

捆綁了 Swift 執行時庫的現有 Swift 二進位制檔案將可以繼續在 macOS 10.14.4、iOS 12.2、tvOS 12.2、watchOS 5.2 和未來的 OS 版本上執行。這些應用程式將繼續使用捆綁的 Swift 執行時執行,因為這些較舊的 Swift 執行時與穩定的 Swift ABI 不相容。作業系統中的 Swift 執行時在設計時是與捆綁的 Swift 執行時隔離的,兩者都視對方為普通的 Objective-C 類。不過使用捆綁執行時的應用程式無法獲得 App Store app thinning 的優勢。

我可以選擇將新的 Swift 執行時與我的應用程式捆綁在一起,以便能夠使用新的執行時功能而無需新的作業系統嗎?

由於一些原因,這一點是不支援的:

  • 用於保持與先前穩定版本的 Swift 執行時相容的共存功能依賴於在單個程式中只有一個 Swift 執行時,並且使用先前穩定版本的 Swift 執行時的程式碼都是自包含執行時作為應用的一部分。如果允許捆綁新的 Swift 執行時,並與 OS Swift 執行時一起執行,那麼新的執行時將無法訪問系統中的 Swift 庫或與 OS 執行時連結的 ABI 穩定的第三方 Swift 庫。
  • 使用捆綁的執行時替換 OS 執行時,將直接規避系統庫的安全性,系統庫基於其所使用的執行時的作業系統版本進行程式碼簽名。
  • 此外,如果可以替換 OS Swift 執行時,這會導致 OS、Swift執行時、第三方庫和應用程式進行測試時,都必須為其配置矩陣新增一個維度。像這樣的“DLL地獄”情況使得測試,鑑定和交付程式碼變得更加困難和昂貴。
  • 將 Swift 執行時庫整合在 OS 中,可使其與 OS 的其他元件緊密整合,特別是 Objective-C 執行時和 Foundation 框架。OS 執行時庫也可以合併到 dyld 共享快取中,這樣與共享快取外的 dylib 相比,它們具有最小的記憶體和載入時間開銷。在 OS 之外構建的執行時可能無法完全複製 OS 執行時的行為,或者在限制使用穩定的 API 時這樣做可能會帶來顯著的效能成本。

有沒有什麼辦法可以允許執行時支援新的 Swift 功能向後部署到舊作業系統?

可能可以使用諸如在應用程式中嵌入“填充”執行時庫之類的技術來向後部署某些型別的執行時功能。但是,這並非總是可行。成功向後部署功能的能力從根本上受舊作業系統中釋出的二進位制元件的限制和現有錯誤的限制。核心小組將根據具體情況逐一考慮新提案的向後部署影響。

關注我們

歡迎關注我們的公眾號:iOS-Tips,也歡迎加入我們的群組討論問題。可以加微信 coldlight_hh/wsy9871 進入我們的 iOS/flutter 微信群。

Swift ABI 穩定後的幾個問題

相關文章