Swift ABI在次要版本之间兼容吗



我知道Swift还不是ABI稳定的,但这只适用于Swift的主要版本吗?

是否有任何保证Swift的次要版本或补丁版本(在语义版本控制下)是ABI稳定的?

我猜这里没有保证,但我只是想仔细检查一下是否有人遇到过任何关于Swift不同次要/补丁版本ABI稳定性的详细信息。

此外,如果我使用一个用不同版本的Swift编译的Swift二进制框架,我通常会遇到编译器错误。如果我的项目中没有出现编译器错误,这是否意味着它是安全的,或者Swift的补丁版本可能仍然存在运行时问题?

更新3

在新引入的.swiftinterface文件的帮助下,我们还具有模块稳定性,从Xcode 11开始。不过,需要注意的一点是,必须使用-enable-library-evolution标志来构建代码。更多详细信息请点击此处。


更新2Swift 6的模块稳定性计划如下:https://swift.org/blog/abi-stability-and-more/#module-稳定性

这是Swift进化回购的摘录。


更新Swift 5具有一些ABI稳定性:

Swift 5版本将为Swift标准库提供ABI稳定性。


不幸的是,还没有。对于Swift 4,他们在这里声明:https://swift.org/blog/swift-4-1-release-process/.

Swift 4.1与4.0不兼容。它包含了各种后台更改,这些更改是Swift 5中稳定Swift ABI的努力的一部分。

希望我们能在Swift 5 中获得ABI稳定性

我认为我们首先应该知道什么是ABI稳定性,之后你的困惑已经消除。

今天,Swift的最新版本是3.1,所以如果你明天发布一个应用程序,你的应用程序包可能会包含3.1的Swift动态库,然而,现在商店里有很多链接3.0、2.3的应用程序,甚至可能还有一些链接2.1及更早版本的旧应用程序。没有什么能阻止我下载你的应用程序(3.1版)和我的应用程序,并在iOS 10.3的iPhone上并排运行,因为这两个应用程序都链接到自己的捆绑版Swift。这与你捆绑Alamofire 4.4和我捆绑3.0完全一样。

当一种语言是ABI稳定的(应用程序二进制接口)时,这意味着它被打包并与操作系统本身链接,在本例中为iOS。您在计算机上编译的Swift代码在操作系统本身中有一个二进制接口,而不是与应用程序捆绑在一起的任何动态库。正因为如此,苹果必须能够保证我的Swift代码在编译成机器代码(比特码、LLVM-IR、yada yada)时,能够与操作系统的其他部分正确对接,并且(可能更重要的是)不会在iOS/Swift的版本之间中断。

目前,Swift语言规范和编译器还没有达到Swift团队对ABI稳定性的承诺感到满意的状态;Swift的变化仍然太频繁,路线图仍然太长。Swift库一旦并入iOS,就很难做出重大改变。

为什么这很重要

  • 是的,应用程序的捆绑包大小将减小,因为您将不再需要在Frameworks文件夹中包含Swift标准库,这很好。

  • 语言变化会更小/更不频繁,所以你不必担心Swift 2->3迁移之类的事件(我仍然为此感到伤痕累累)

  • 开发人员将能够创建用Swift编写的第三方库,并分发预编译的框架(二进制文件),因为他们不再需要将Swift标准库捆绑到他们的框架中,而是将链接到与您的应用程序相同版本的Swift(与iOS打包的版本)。

相关内容

  • 没有找到相关文章

最新更新