Swift ABI 介绍极其稳定的意义

一、ABl是什么

ABIApplication Binary Interface,应用程序二进制接口 描述了应用程序和操作系统之间,一个应用和它的库之间的接口。与API不同的是:ABI允许编译好的目标代码在使用兼容ABI的系统中无需改动就能运行,而API则是定义 源代码 之间的接口,同样的代码可以在支持这个API的任何系统中编译。

iOSmacOS 平台,Swift编写的二进制程序在运行时通过ABI与其他程序库或组件进行交互。程序的编译会产生一个或者多个二进制实体,这些二进制实体必须在一些很底层的细节上达成一致,才能被链接在一起执行。可以说ABI就是一个规范,一种协议。它会规定如何调用函数,如何在内存中表示数据,甚至是如何存储和访问metadata。ABI底层包装的是具体平台硬件相关的程序代码了,这个不在本文讨论范围,如有需要可以查阅 Swift ABI Stability Manifesto 的相关内容。

ABI稳不稳定与Swift版本是无关的,取决于swift的编译器版本。Xcode10.2集成了swift5.0编译器,只要使用这个版本以上的编译器,编译出来的二进制就是ABI稳定的。Swift5.0编译器提供了Swift4的语法兼容,也就是说即使你的项目代码仍然是swift4,编译出来的二进制也是ABI稳定的。

二、ABI稳定的意义

ABI稳定是指把ABI锁定在某种形式,以至于未来的编译器都可以生成遵从这种形式的二进制实体(可以是程序库,也可以是应用程序)。ABI稳定之后,OS发行商就可以把Swift标准库和运行时作为操作系统的一部分嵌入。也就是说Apple 会把Swift runtime 放到 iOS 和 macOS 系统里,我们的swift App包里就不需要包含应用使用的标准库 和Swift runtime 拷贝了。同时在运行的时候,只要是用 Swift 5 (或以上) 的编译器编译出来的 binary,就可以跑在任意的 Swift 5 (或以上) 的 runtime 上。

ABI稳定带来了以下好处:

  • 大量减小app体积
    针对已经嵌入swift runtime的系统(macOS 10.14.4, iOS 12.2, tvOS12.2, watchOS5.2),

  • 所有app使用同一个运行时, app启动不需要额外加载Swift runtime,在新系统上会更快更节省内存

  • Apple工程师可以在系统框架中使用Swift了
    系统中统一使用了稳定的ABI之后,受益最大的应该就是Apple本身了。他们可以编写纯Swift系统框架了,不需要包一遍OC,代码运行效率会更高,维护成本也更低。

当然ABI稳定也有其弊端,集成到OS的Swift runtime只能伴随iOS系统更新才会更新,不像稳定之前我们自己打包的会随着App更新而更新。语言新特性的使用会开始受限于系统,后续的开发过程中新特性的使用就需要添加版本判断这种胶水代码,类似我们熟悉的远程推送的注册这种版本判断。

通常,如果一门编程语言在表现力和性能上均表现良好,并且还提供了二进制接口,它就很容易表现出二进制接口很脆弱的问题。对于用这种语言编写的程序库或组件来说,要让用户在不重新编译源码的条件下使用新版本的程序库是很难的。当前,Swift主要的前进方向是标准库的进化,自然就要给开发者在维护二进制兼容性这个问题上更多进退的空间。很多实现上的考量的确会对ABI的设计有所影响。

对ABI做的每一个决定都会对编程语言产生长远的影响,甚至会制约一门编程语言在未来可以发展和进化的空间。Swift未来的版本可能会在更多垂直领域为ABI添加特性,但只要声明了某个平台的ABI已稳定,那么任何在效率以及灵活性上曾经不妥的设计都将永远伴着这个平台存在。

一旦ABI稳定了,就意味着它会伴着这个平台的一生一世,直至日益增长的依赖关系让它走向灭亡。

swift已经经历了五大版本,才声明ABI稳定的一个主要目的,就是为程序库的进化保留足够的灵活性,而不希望开发者由于ABI的稳定性而限制设计空间。

你可能感兴趣的:(Swift ABI 介绍极其稳定的意义)