在软件开发中, 应用程序机器二元码界面(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