Swift 5和ABI稳定性-最佳迁移时间
Swift是一种快速,安全且有趣的语言,具有充分的堆栈潜力和强大的社区支持,可以进行编码。 据Apple称,它比Objective-C快2.6倍,但是,一些研究表明,两者之间的差异并不大。 Swift代码更容易维护,因为没有单独的接口和实现文件,语法较短,并且该语言支持动态框架。
该语言已显着发展,并已被众多开发人员采用。 根据StackOverflow开发人员调查2018,它是第六受欢迎的语言 。对于仅在2014年发布的一种语言,采用率是惊人的。
这些是Swift的一些优点,现在让我们从开发人员的角度来看这些缺点。 Swift仍不成熟,就像一个移动的目标,每个新发行版都引入了重大更改。 许多开发人员指出的关键问题之一是缺乏与较旧语言版本的向后兼容性以及版本锁定,这意味着整个项目及其外部依赖项中只能有一个Swift版本。 因此,如果开发人员想要切换到最新的Swift版本并更新其外部依赖关系,则被迫完全重写其项目。 对于开发框架的开发人员,他们必须为每个新的Swift版本更新其框架,并且不能将其作为二进制预编译框架进行分发。
幸运的是,Swift团队和开放源代码社区正在努力解决此问题,并有望在Swift的下一个主要版本(即Swift 5.0)中解决此问题,自Swift 3.0以来,Swift已向前推进。 ABI稳定宣言指出,他们的目标是:
- 源代码兼容性,这意味着较新的编译器可以编译用较早版本的Swift编写的代码。 这将删除Swift中当前的版本锁定。
- 二进制框架和运行时兼容性,从而可以以二进制形式分发框架,该框架可在多个Swift版本中使用。 二进制框架兼容性将通过稳定模块文件的模块格式稳定性来实现,该模块文件格式是编译器对框架公共接口的表示,而ABI稳定性使应用程序和使用不同Swift版本编译的库之间具有二进制兼容性。
在运行时,Swift程序二进制文件与其他库和组件进行交互。 应用程序二进制接口是独立编译的二进制实体必须遵循的规范,才能链接在一起并执行。 这些二进制实体必须在许多底层细节上达成共识,例如如何调用函数,内存中的数据表示,甚至它们的元数据在哪里以及如何访问它。
ABI稳定性意味着将ABI锁定到将来的编译器版本可以生成符合稳定ABI的二进制文件的程度。 一旦ABI稳定下来,它就会在平台的整个生命周期中持续存在。
ABI稳定性仅影响外部可见的公共接口和符号的不变性。 例如,只要保留公共接口,以后的编译器就可以自由更改内部函数调用的调用约定。
- 类型(例如结构和类)必须具有针对该类型实例的已定义内存中布局,并共享相同的布局约定。
- 类型元数据被Swift程序广泛使用。 此元数据必须具有定义的内存布局,或者必须具有一组定义的API来查询类型的元数据。
- 库中的每个导出或外部符号都需要一个唯一的名称,二进制实体可以同意该名称。 Swift提供了函数重载和上下文名称空间(例如模块和类型),这意味着源代码中的任何名称都可能不是全局唯一的。 唯一名称是通过称为名称修饰的技术产生的。
- 函数必须遵守调用约定,这涉及诸如调用堆栈的布局,保留哪些寄存器以及所有权约定之类的事情。
- Swift附带一个运行时库,该库处理诸如动态转换,引用计数,反射等操作。编译的Swift程序对该运行时进行外部调用。 因此,Swift运行时API是Swift ABI。
- Swift随附一个标准库,该库定义了许多常见的类型,结构和操作。 为了使出厂的标准库能够与用不同版本的Swift编写的应用程序一起使用,它必须公开一个稳定的API。 因此,Swift标准库API是Swift ABI,以及它定义的许多类型的布局。
所有这些任务已由Swift核心团队完成,但尚未在GitHub上发布。 通过查看任务的状态,我们可以放心地期望Swift的下一个主要版本是ABI稳定的。
- 因此,一旦宣布Swift是ABI稳定的,此后编写的代码将与该语言的新版本兼容,并且开发人员在迁移到新版本的Java时不必更新项目的所有外部依赖项。迅速。
- 一旦实现了模块格式的稳定性,库作者就可以将其框架作为二进制框架提供。
- 由于可以在操作系统内合并稳定的Swift运行时,因此应用程序包的大小将减小。
- 语言将不断发展,但从那时起对ABI的更改将是可加的。 当最低目标Swift版本支持它们时,可以利用ABI附加更改,因为ABI稳定性仅锁定外部可见的公共接口和符号。 较新的编译器可以进行内部更改,以提高效率。
Swift显然是Apple生态系统中发展的未来,一旦稳定了ABI和模块格式,该语言将摆脱最大的劣势。 请仔细阅读本文,以了解2019年Swift和Objective-C之间的详细比较。
如果您希望将Objective-C代码库转换为Swift,那么现在是开始的最佳时间。 我写了一篇文章,内容涵盖了从SVProgressHUD到IHProgressHUD的转换,该文章完全是用Swift编写的,具有线程安全性,并且具有与使用Swiftify for Xcode的SVProgressHUD相同的API设计。
- https://github.com/apple/swift/blob/master/docs/ABIStabilityManifesto.md
- https://swift.org/abi-stability/
- https://www.altexsoft.com/blog/engineering/the-good-and-the-bad-of-swift-programming-language/
- https://www.altexsoft.com/blog/engineering/swift-vs-objective-c-out-with-the-old-in-with-the-new/
- https://medium.com/swift-india/swift-5-abi-stability-769ccb986d79
- https://www.ca.com/cn/blog-developers/dynamic-versus-static-framework-in-ios.html
- https://www.youtube.com/watch?v=GzP2oaZRi7Q
您可以通过Twitter,Linkedin,Facebook和Github与我们联系。