在軟件開發中, 應用程序機器二元碼界面(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框架
ABI穩定就是binary接口穩定, 也就是在運行的時候只要是經過Swift5或者以上的編譯器編譯出來的binary, 就能夠泡在任意的swift5及以上的runtime上. 這樣, 咱們就不須要像之前那樣在app裏面放一個swift runtime了, Apple會把相應的ABI整合到iOS或者macOS中.函數
好處: 工具
代價:開發工具
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平臺, 可能下面幾件事情特別重要:
Swift ABI穩定對咱們到底意味着什麼: http://www.cocoachina.com/cms/wap.php?action=article&id=26388