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

Where exactly is the issue with ABI stability in Swift programming

首先,我多年来一直是 Objective C 开发人员,在宣布 Swift 前后,我主要维护现有的 Obj C 项目。从来没有机会完全投资于 Swift 应用程序,无论是从头开始还是维护。当时我的努力主要针对 .Net 和 React Native。

我研究过 what ABI is。一切都很好,花花公子。从那个答案,我只能假设它是如何对 Swift 起作用的,因为我没有太多参与 Swift

因此,从简单的猜测来看,Swift ABI 中的所有骚动、吵闹和争吵都与 'assumed' 事实有关,即当库 written/compiled 的版本为 1.0Swift(在 Swift 5 之前),它将与用 1.0 编写的应用程序一起正常工作。当该库的下一个版本用 Swift 2.0 编写时,上述用 Swift 1.0 编写的应用程序将无法使用它,除非为 Swift 2.0 编译?假设我是正确的,如果我有一个用 Swift 4 编写的应用程序,而我想使用的库是用 Swift 1.0 编写的,我可以使用它吗?随着 Swift 5 现已发布,ABI 问题现在是否已解决 Swift 库和应用程序 5+,而不是 5+5- 交互?

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

请用涵盖所有案例的实例进行解释(如果可能的话)。

更新:如果小版本增加的 ABI 有任何问题,请包括,例如从 swift 4.0 到 4.1

关于 ABI 稳定性最有趣的事情是,对于 iOS 10.2 之前的系统和 5.0 之前的 Swift 语言版本,必须将 Swift 语言框架嵌入到应用程序,其大小增加了数 MB,可能还增加了一些其他运行时开销。但在 iOS 10.2+ 和 Swift 5.0+ 中,现在有了 ABI 稳定性,这些东西在运行时,Swift 应用程序更小,可能更快,启动也更快。

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

应用程序二进制接口。 Swift 的 ABI 稳定性是关于将源代码编译成二进制文件,并在多个语言版本上使用通用接口。没有 ABI 稳定性,跨语言版本的二进制文件彼此不兼容,因为它们的格式不同。例如,动态库有一个静态调用 table。引自 Wikipedia:"An ABI defines how data structures or computational routines are accessed in machine code"。 ABI 稳定性确保库和调用者(应用程序)使用相同的二进制协议来调用函数,即使不是针对相同版本的语言编译。

出于 Swift 的目的,ABI 稳定性将允许开发人员切换到该语言的更新版本,而无需更新他们的 libraries/frameworks,这样可以利用该语言的更新功能无需等待库更新。来自 a Swift.org article back in February:"Today, when a Swift library changes, any apps using that library have to be recompiled." 同样,来自那篇文章:

ABI stability for Apple OSes means that apps deploying to upcoming releases of those OSes will no longer need to embed the Swift standard library and “overlay” libraries within the app bundle, shrinking their download size; the Swift runtime and standard library will be shipped with the OS, like the Objective-C runtime.

对于作为开发人员的您来说,Swift 中的 ABI 稳定性意味着与库的更多兼容性。由于 Swift 语言开发人员需要确保 ABI 稳定性不被破坏,因此添加新功能的速度将会下降。