ABI是什么?
在軟件開發中, 應用程序機器二元碼界面(Application Binary Interface 簡稱ABI)指兩個程序模塊間的接口; 通常其中一個車還給你徐模塊會是庫或者操作系統提供的服務, 而另一邊的模塊則是用戶所運行的程序.
一個ABI定義了機器代碼如何訪問數據結構與運算程序, 此處所定義的界面相當地基並且相依於硬件. 而類似概念的API則在源代碼定義這些, 較為高端, 並不直接依賴於硬件, 通常會是人類可閱讀的代碼. 一個ABI常見的樣貌即是調用約定: 數據怎么稱為計算程序的輸入或者從中得到輸出;x86的調用約定即是一個ABI的例子.
決定要不要采用既定的ABI, 通常由編譯器, 操作系統或庫的開發者來決定; 然而, 如果編寫一個混合多個語言的應用程序, 就必須直接處理ABI, 采用外部函數調用來達成此目的.
調用約定: https://zh.wikipedia.org/wiki/調用約定
ABI: https://zh.wikipedia.org/wiki/應用二進制接口
Swift ABI穩定對我們意味着什么?
ABI穩定就是binary接口穩定, 也就是在運行的時候只要是通過Swift5或者以上的編譯器編譯出來的binary, 就可以泡在任意的swift5及以上的runtime上. 這樣, 我們就不需要像以前那樣在app里面放一個swift runtime了, Apple會把相應的ABI整合到iOS或者macOS中.
**好處: **
- App尺寸會變小: Apple會根據iOS操作系統創建不同的下載包. 對於iOS12.2的系統, 因為它預裝了swift5 runtime, 所以不再需要Swift的庫, 它們被從app bundle中刪除掉. 對於iOS12.2以下的系統, 照舊.
- 因為系統集成了Swift, 所以大家都用同一個Swift了, app啟動時候也就不需要額外加載Swift, 所以在新的系統中會更加節省內存. 另外, 對於Apple的工程師來說, 他們可以在系統的框架中使用swift, 這樣很多東西不必通過oc wrap一遍, 這會讓代碼運行效率提高很多.
代價:
swift版本被放到了iOS系統中, 所以想要升級就沒那么容易了, 除非升級操作系統. 在ABI穩定之前, swift runtime作為開發工具的一部分, 背作為庫打包到了app中. 這樣, 在開發時候, 我們可以隨意使用新版本的swift特性, 因為他們的版本是開發者自己決定的. 不過當ABI穩定后, swift runtime變成用戶系統的一部分, 它從開發工具變成了運行環境, 不再由開發者唯一決定.
這和我們一直以來適配新系統的 API 時候的情況差不多,在 Swift 5 以后,我們需要等到 deploy target 升級到對應的版本,才能開始使用對應的 Swift 特性。這意味着,我們可能會需要寫一些這樣的兼容代碼:
// 假如 Swift 6.0 是 iOS 13.0 的 Swift 版本
if #available(iOS 13.0, *) {
// Swift 6.0 標准庫中存在 A
let a = A()} else {
// 不存在 A 時的處理
}
有什么方法能夠讓我們無視系統版本, 去使用swift新特性嗎?
方法還是有的, 但是相對比較麻煩, 很大程度上依賴於蘋果是否願意提供支持. 就像但是iOS5.0引入ARC時候, Apple為了讓iOS4.3和之前的系統也能使用ARC的代碼, 在deployment target選到iOS4.3或之前時候, 回采用static link
的方法打包一個叫做libarclite
的庫, 其中包含了ARC所需的一些runtime方法. 對於ABI穩定后的swift, 也許可以采用類似的做法. 全看Apple是否願意提供支持.
總結
ABI穩定最大的受益者應該是Apple, 這讓Apple在自己的生態系統中, 特別是系統框架中, 可以使用Swift來進行實現. Swift ABI穩定為Apple開發平台的一場戈丁奠定了基礎. 在未來的幾年里, 如果你還想要關注Apple平台, 可能下面幾件事情特別重要:
- Apple 什么時候發布第一個 Swift 寫的系統框架
- Apple 什么時候開始提供第一個 Swift only 的 API
- Apple 什么時候開始“鎖定” Objective-C 的 SDK,不再為它增加新的 API
- Apple 什么時候開始用 Swift 特性更新現有的 Objective-C SDK
Swift ABI穩定對我們到底意味着什么: http://www.cocoachina.com/cms/wap.php?action=article&id=26388