随着Swift5一起发布的,还有ABI稳定。这对于Swift的发展来说意味深远。作为Apple平台下开发者,了解这个十分必要。
什么是ABI?
在运行时,通过Swift编写的二进制程序通过ABI和其他的程序库或组件进行交互。ABI是Application Binary Interface的缩写,它是一个规范,通过这个规范,所有被独立编译的二进制实体才能被链接在一起并执行。这些二进制实体必须在一些很低层的细节上达成一致,例如:如何调用函数,如何在内存中表示数据甚至是如何存储以及访问metadata。
ABI是平台相关的,因为它关注的这些底层细节会受到不同的硬件架构以及操作系统的的影响。大部分的平台都定义了一份可以用于C以及C语言家族代码的“标准ABI”。但Swift是一门和C截然不同的语言,它需要为每一种平台定义自己的ABI。而这份文档中中的绝大部分内容都是和平台无关的,和具体平台相关的考量会影响到Swift ABI的设计和实现细节。
什么是ABI稳定?
ABI稳定是指把ABI锁定在某种形式,以至于未来的编译器都可以生成遵从这种形式的二进制实体(可以是程序库,也可以是应用程序)。一旦ABI稳定了,就意味着它会伴着这个平台的一生一世,直至日益增长的依赖关系让它走向灭亡。
ABI的稳定性仅会影响到外部可见的公共接口和符号的不变性。而内部使用的符号、调用约定以及内存格局仍旧可以修改而不会破坏ABI约定。例如,未来版本编译器完全可以在保留外部接口函数调用约定的同时,改变内部函数的调用约定。
对ABI做的每一个决定都会对编程语言产生长远的影响,甚至会制约一门编程语言在未来可以发展和进化的空间。Swift未来的版本可能会在更多垂直领域为ABI添加特性,但只要声明了某个平台的ABI已稳定,那么任何在效率以及灵活性上曾经不妥的设计都将永远伴着这个平台存在。
为ABI在垂直领域添加新的特性叫做ABI积累性更新(ABI-additive changes)。每当支持这个特性的Swift版本达到最小目标值的时候,就可以把这个特性纳入积累性更新。这种方式允许我们逐步扩展或锁定ABI中的内容。例如,让ABI支持更多特性,或使用更有效率的数据访问方式等。
ABI稳定了会怎样?
ABI稳定之后,OS发行商就可以把Swift标准库和运行时作为操作系统的一部分嵌入,由于这些标准库和运行时可以支持用更老或更新版本Swift构建的应用程序,这样,开发者就无需在分发应用的同时,还要带上一份自己构建应用时使用的标准库和运行时拷贝。这使得工具和操作系统可以更好的进行集成。
更多资料
Swift官网-ABI Stability and More
Swift官网-Evolving Swift On Apple Platforms After ABI Stability