ABI稳定性:Swift 5.0中的功能

Apple Swift 5将于2019年初发布。这是Swift的下一个主要版本。 目前,Swift的首要任务之一是在未来的Swift版本之间实现兼容性。 其中一个主要组件是ABI稳定性,它使应用程序和使用不同版本的Swift编译的库之间具有二进制兼容性。 Swift 5为应用程序提供了二进制兼容性:保证以后,使用一个版本的Swift编译器构建的应用程序将能够与使用另一版本的编译器进行通信。

ABI稳定性

应用程序二进制接口(ABI)是程序调用函数并使用其他编译程序中的数据结构的一种方式。 它是应用程序编程接口(API)编译版本 。 对于使用外部库的应用程序,ABI非常重要。 如果程序是为使用特定库而构建的,而该库后来又进行了更新,则您不必重新编译该应用程序。 如果更新的库使用相同的ABI,则无需更改程序。 具有相同ABI的两个库版本称为“二进制兼容”,因为它们具有相同的低级接口。

ABI稳定性意味着将ABI锁定到某种程度,以便将来的编译器版本可以生成符合稳定ABI的二进制文件。

Swift的当前版本不稳定,因此每个二进制文件(App)都捆绑了自己的Swift动态库版本。 例如,如果App1使用的是Swift 3.0 ,则它将内部的Swift 3.0动态库 (包含3.0 ABI )捆绑在一起。 如果App2使用的是Swift 3.2 ,它将捆绑Swift 3.2和3.2 ABI 。 在这里,Swift并不存在于iOS操作系统中,而是存在于每个App中。

Swift 5.0中的ABI将使将来的编译器版本能够生成符合稳定ABI的二进制文件。 如果Swift成为ABI Stable,则Swift将被嵌入到iOS操作系统中,并且其ABI将与每个Swift版本兼容。 例如,如果App1使用Swift 5.0 ,但是App2使用Swift 5.3 ,则两者都将使用嵌入在操作系统中的Swift ABI。

在此示例中,使用Swift 5.0构建的应用程序将在安装了Swift 5标准库的系统以及假定的Swift 5.1或Swift 6的系统上运行。

为什么ABI稳定性很重要?

  1. 捆绑包大小将减小:您不再需要在Frameworks文件夹中包括Swift标准库。
  2. 更少的移植工作:较新的编译器可以编译用较早版本的Swift编写的代码。 这旨在减轻开发人员面临的迁移痛苦。
  3. 二进制框架和运行时兼容性:由于无需嵌入Swift,开发人员可以在Swift中创建预编译框架(当前,在编译应用程序时会编译框架)。