次要版本之间是否兼容Swift ABI?

时间:2017-10-18 15:24:17

标签: ios swift

我知道Swift还不是ABI stable,但这只是Swift的主要版本吗?

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

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

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

2 个答案:

答案 0 :(得分:3)

不幸的是,还没有。对于Swift 4,他们在此陈述:https://swift.org/blog/swift-4-1-release-process/

  

Swift 4.1与4.0不是二进制兼容的。它包含了各种引擎盖下的变化,这些变化是稳定Swift AB中Swift ABI的努力的一部分。

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

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

  

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

这是Swift evolution回购的摘录。

答案 1 :(得分:1)

我认为我们首先应该知道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代码编译为机器代码(位代码,LLVM-IR,yada-yada)时,能够与操作系统的其余部分正确连接,并且(可能更重要的是)不会在iOS / Swift版本之间中断。

就目前的情况而言,Swift语言规范和编译器还没有处于Swift团队为实现ABI稳定性的承诺感到自在的状态;对Swift的更改仍然太频繁,路线图也太长。一旦Swift库合并到iOS中,进行重大更改就变得更加困难。

为什么重要?

  • 是的,由于不再需要在框架文件夹中包含Swift标准库,因此应用程序的捆绑包大小将减小。

  • 语言更改会更小/更不频繁,因此您不必担心诸如从Swift 2-> 3迁移之类的事件(我仍然对此感到恐惧)

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