Tag: Abi

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 […]

ABI稳定性:Swift 5.0中的功能

Apple Swift 5将于2019年初发布。这是Swift的下一个主要版本。 目前,Swift的首要任务之一是在未来的Swift版本之间实现兼容性。 其中一个主要组件是ABI稳定性,它使应用程序和使用不同版本的Swift编译的库之间具有二进制兼容性。 Swift 5为应用程序提供了二进制兼容性:保证以后,使用一个版本的Swift编译器构建的应用程序将能够与使用另一版本的编译器进行通信。 ABI稳定性 应用程序二进制接口(ABI)是程序调用函数并使用其他编译程序中的数据结构的一种方式。 它是应用程序编程接口(API)的编译版本 。 对于使用外部库的应用程序,ABI非常重要。 如果程序是为使用特定库而构建的,而该库后来又进行了更新,则您不必重新编译该应用程序。 如果更新的库使用相同的ABI,则无需更改程序。 具有相同ABI的两个库版本称为“二进制兼容”,因为它们具有相同的低级接口。 ABI稳定性意味着将ABI锁定到某种程度,以便将来的编译器版本可以生成符合稳定ABI的二进制文件。 Swift的当前版本不稳定,因此每个二进制文件(App)都捆绑了自己的Swift动态库版本。 例如,如果App1使用的是Swift 3.0 ,则它将内部的Swift 3.0动态库 (包含3.0 ABI )捆绑在一起。 如果App2使用的是Swift 3.2 ,它将捆绑Swift 3.2和3.2 ABI 。 在这里,Swift并不存在于iOS操作系统中,而是存在于每个App中。 Swift 5.0中的ABI将使将来的编译器版本能够生成符合稳定ABI的二进制文件。 如果Swift成为ABI Stable,则Swift将被嵌入到iOS操作系统中,并且其ABI将与每个Swift版本兼容。 例如,如果App1使用Swift 5.0 ,但是App2使用Swift 5.3 ,则两者都将使用嵌入在操作系统中的Swift ABI。 在此示例中,使用Swift 5.0构建的应用程序将在安装了Swift 5标准库的系统以及假定的Swift 5.1或Swift 6的系统上运行。 为什么ABI稳定性很重要? 捆绑包大小将减小:您不再需要在Frameworks文件夹中包括Swift标准库。 更少的移植工作:较新的编译器可以编译用较早版本的Swift编写的代码。 这旨在减轻开发人员面临的迁移痛苦。 二进制框架和运行时兼容性:由于无需嵌入Swift,开发人员可以在Swift中创建预编译框架(当前,在编译应用程序时会编译框架)。