【问题标题】:Is Swift ABI compatible between minor versions?次要版本之间是否兼容 Swift ABI?
【发布时间】:2017-10-18 15:24:17
【问题描述】:

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

是否保证 Swift 的次要版本或补丁版本(semantic versioning 下)是 ABI 稳定的?

我猜这里不能保证,但只是想仔细检查是否有人遇到过任何详细说明 Swift 不同次要/补丁版本的 ABI 稳定性的内容。

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

【问题讨论】:

    标签: ios swift


    【解决方案1】:

    更新 3

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


    Update 2 模块稳定性计划用于 Swift 6:https://swift.org/blog/abi-stability-and-more/#module-stability

    这是Swift evolution repo 的摘录。


    更新 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 稳定性

    【讨论】:

    • 感谢您的链接。您对不产生编译器错误的不同补丁版本的运行时安全性有任何想法吗?
    • @AdamJohns 对此不确定,这取决于 Swift 团队将进行更改的编译器级别。
    • @WernerAltewischer 模块稳定性计划用于 Swift 6。关于补丁,Swift 5.x 将仅在 Swift 标准库方面是 ABI 稳定的。
    • @Cristik Swift 模块稳定性随 Xcode11 一起提供。我们现在有了 swift-module-interface 文件
    • 偶然发现了一篇很好的文章,解释了 ABI 与模块稳定性:donnywals.com/… - 我可能需要稍微扩展我的答案 :) (@AdamJohns)
    【解决方案2】:

    我想我们应该先知道什么是 ABI 稳定性,然后你的困惑就已经消除了。

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

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

    就目前而言,Swift 语言规范和编译器还没有处于 Swift 团队愿意做出 ABI 稳定性承诺的状态;对 Swift 的更改仍然太频繁,而且路线图仍然太长。一旦将 Swift 库合并到 iOS 中,进行重大更改就会变得更加困难。

    为什么重要?

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

    • 语言更改会更小/不那么频繁,因此您不必担心从 Swift 2 -> 3 迁移等事件(我仍然为此感到伤痕累累)

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

    【讨论】:

      猜你喜欢
      • 2012-03-03
      • 2020-02-14
      • 1970-01-01
      • 1970-01-01
      • 2015-02-11
      • 1970-01-01
      • 2023-01-26
      • 1970-01-01
      相关资源
      最近更新 更多