ABI是什麼? Swift ABI穩定有什麼好處?

ABI是什麼?

在軟件開發中, 應用程序機器二元碼界面(Application Binary Interface 簡稱ABI)指兩個程序模塊間的接口; 一般其中一個車還給你徐模塊會是庫或者操做系統提供的服務, 而另外一邊的模塊則是用戶所運行的程序.php

一個ABI定義了機器代碼如何訪問數據結構與運算程序, 此處所定義的界面至關地基而且相依於硬件. 而相似概念的API則在源代碼定義這些, 較爲高端, 並不直接依賴於硬件, 一般會是人類可閱讀的代碼. 一個ABI常見的樣貌便是調用約定: 數據怎麼稱爲計算程序的輸入或者從中獲得輸出;x86的調用約定便是一個ABI的例子.swift

決定要不要採用既定的ABI, 一般由編譯器, 操做系統或庫的開發者來決定; 然而, 若是編寫一個混合多個語言的應用程序, 就必須直接處理ABI, 採用外部函數調用來達成此目的.數據結構

調用約定: https://zh.wikipedia.org/wiki/%E8%B0%83%E7%94%A8%E7%BA%A6%E5%AE%9Aapp

ABI: https://zh.wikipedia.org/wiki/%E5%BA%94%E7%94%A8%E4%BA%8C%E8%BF%9B%E5%88%B6%E6%8E%A5%E5%8F%A3框架

Swift ABI穩定對咱們意味着什麼?

ABI穩定就是binary接口穩定, 也就是在運行的時候只要是經過Swift5或者以上的編譯器編譯出來的binary, 就能夠泡在任意的swift5及以上的runtime上. 這樣, 咱們就不須要像之前那樣在app裏面放一個swift runtime了, Apple會把相應的ABI整合到iOS或者macOS中.函數

好處: 工具

  1. App尺寸會變小: Apple會根據iOS操做系統建立不一樣的下載包. 對於iOS12.2的系統, 由於它預裝了swift5 runtime, 因此再也不須要Swift的庫, 它們被從app bundle中刪除掉. 對於iOS12.2如下的系統, 照舊.
  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 特性。這意味着,咱們可能會須要寫一些這樣的兼容代碼:code

// 假如 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

相關文章
相關標籤/搜索