在Xcode 13.2中宣布iOS 13的Swift并发-他们是如何实现的?



Xcode 13.2测试版发布说明承诺在iOS 13中支持Swift并发。

您现在可以在部署到macOS 10.15, iOS 13, tvOS 13和watchOS 6或更新版本的应用程序中使用Swift Concurrency。这种支持包括async/await、actor、全局actor、结构化并发和任务api。(70738378)

然而,回到2021年夏天,当它第一次出现在WWDC上时,它很难被限制只能在iOS 15+上运行。

我的问题是:什么改变了?它们是如何实现向后兼容性的?它的运行方式是否与iOS 15中的运行方式有很大不同?

将并发向后部署到旧版本的操作系统中,在应用程序中捆绑了一个并发运行时库,该库支持该特性,就像Swift在ABI稳定之前在Swift 5中使用标准库一样,当时Swift可以随操作系统一起发布。

这捆绑了标准库的并发部分(稳定链接)以及一些额外的支持和功能存根(稳定链接)。

当部署到足以包含这些运行时特性作为操作系统一部分的新操作系统版本时,此绑定是不必要的。


由于iOS 15+(和相关的操作系统版本)上的功能被声明需要内核更改(对于新的协作线程模型),而内核更改本身不能被反向移植,因此某些功能的实现包括基于在这些操作系统上存在的现有功能的shims,但可能执行略有不同,或效率较低。

你可以在Doug Gregor关于并发后移植的一些地方看到这一点——在一些地方,SWIFT_CONCURRENCY_BACK_DEPLOYMENT的检查改变了一些假设不再成立的实现,或者功能不存在。例如,GlobalExecutor不能假设dispatch_get_global_queue是协作的(因为在旧的操作系统上不存在线程模型),所以当反向移植时,它必须创建自己的队列作为全局协作队列使用。基于@objc的参与者还需要对其超类进行混合,这在非反向部署的运行时不需要发生。(符号也必须在某些地方注入到后部署库,某些行为必须被存根,但这有点不那么有趣。)

总的来说,没有关于反向部署和非反向部署之间确切的差异的全面文档(缺少阅读所有代码),但是应该可以安全地假设反向部署库的有效的行为将是相同的,尽管可能以性能为代价。

相关内容

最新更新