Swift编程中ABI稳定性到底在哪里

时间:2019-10-22 23:18:41

标签: swift abi swift5.1 swift-abi

首先,我已经成为Objective C开发人员多年了,在宣布Swift的那段时间,我主要是维护现有的Obj C项目。无论是从零开始还是进行维护,都从未有机会完全投入到Swift应用中。当时我的工作主要针对.Net和React Native。

我已经对what ABI is进行了研究。一切都很好,花花公子。从这个答案中,我只能假设Swift会如何发挥作用,因为我对Swift的参与并不多。

因此,从简单的猜测来看,Swift ABI中的所有骚动,球拍和残骸都与“假设”的事实有关,即当使用{{1} {1}}(在Swift 5之前),它将可以用1.0编写的应用正常运行。当用Swift编写该库的下一个版本时,除非用1.0编译,否则上述用Swift 2.0编写的应用将无法使用它?假设我对此是正确的,如果我有一个用Swift 1.0编写的应用程序,而我想使用的库是用Swift 2.0编写的,那我可以使用它吗?随着Swift 4的发布,Swift 1.0个库和应用程序Swift 5的{​​{1}}问题现在已解决,而不是ABISwift进行交互吗?

如果我亲身经历了这些问题,我可能会对Swift ABI问题有更好的了解。

请提供涵盖所有案例的实际示例(如果可能)进行解释。

更新:请说明ABI是否存在小版本增加的问题,例如从4.0迅速升级到4.1

2 个答案:

答案 0 :(得分:1)

关于ABI稳定性的主要有趣信息是,对于iOS 10.2之前的系统和5.0之前的Swift语言版本,Swift语言框架必须嵌入到应用程序中,这会增加其大小几个MB,并可能增加其他运行时开销。但是在iOS 10.2+和Swift 5.0+中,现在有了ABI稳定性,东西就在运行时中了,Swift应用程序要小得多,可能更快,而且启动也更快。

换句话说,由于ABI的稳定性,Swift现在是Objective C和Cocoa一直以来的头等公民。

答案 1 :(得分:0)

应用程序二进制接口。 Swift的ABI稳定性是关于使用几种语言版本的通用接口将源代码编译为二进制文件。由于没有ABI稳定性,因此跨语言版本的二进制文件彼此不兼容,因为它们的格式不同。例如,动态库具有静态调用表。正如Wikipedia中引述的那样:“ ABI定义了如何在机器代码中访问数据结构或计算例程”。 ABI稳定性可确​​保库和调用方(应用程序)使用相同的二进制协议来调用功能,即使未针对同一语言版本进行编译也是如此。

出于Swift的目的,ABI稳定性将允许开发人员切换到语言的较新版本,而无需更新其库/框架,从而利用该语言的较新功能,而无需等待库被更新。来自a Swift.org article back in February:“今天,当Swift库更改时,必须重新编译使用该库的所有应用程序。”再次,从那篇文章:

  

Apple OS的ABI稳定性意味着部署到这些OS即将发行版本的应用程序将不再需要在应用程序包中嵌入Swift标准库和“覆盖”库,从而缩小了下载量;操作系统会附带Swift运行时和标准库,如Objective-C运行时。

对于开发人员而言,Swift中的ABI稳定性意味着与库的更多兼容性。由于Swift语言开发人员需要确保ABI稳定性不会受到破坏,因此新功能的添加率将下降。