<p style="text-align: center;"><a href="/misc/goto?guid=4958988741681151932" title="swift"><img alt="Swift 5确立了目标,定义了新的演进过程" src="https://simg.open-open.com/show/ff16f5b0fb28155fafa3c5e0a3ec0ed7.png" /></a></p> <p><a href="/misc/goto?guid=4958973894126248237">Swift 5</a>预计将于 2018 年发布,Swift 5 将会带来更好的 ABI 稳定性,并将进一步关注 API 弹性(resilience)和内存所有权(memory ownership)。新的演进过程将有助于确保 Swift 5 将开发重点放在其既定目标上。</p> <p>ABI 稳定性在早先的 Swift 发布版本中<a href="/misc/goto?guid=4959010492503027063">被推迟</a>之后,目前已经成为 Swift 5 中一个必要的功能。Apple 工程师、Swift 维护者 Teb Kremenek 这样<a href="/misc/goto?guid=4959010492599096591">写道</a>:“对于第三方框架开发人员来说,ABI 稳定性是至关重要的,并且为了<a href="/misc/goto?guid=4959010492687395535">扩大</a>Swift 在 Apple 公司内部的使用范围,ABI 稳定性的实现不能再被推迟了,并且它将会成为 Swift 5 的重中之重。”然而,Swift 5 对 ABI 稳定性的官方定义不包括<a href="/misc/goto?guid=4959010492775374812">模块稳定性</a>,模块稳定性被认为是一个难以达成的目标,可能不会出现在下个版本的 Swift 语言中。模块稳定性涉及到模块文件的格式,它定义了编译器是如何表示框架中的公共接口的。因此,只有当开发代码依赖于一个二进制模块并且其不可用性不会影响到运行时加载共享库的时候,模块稳定性才是必需的。为了让 ABI 稳定性可控,<a href="/misc/goto?guid=4959010492865535461">必须要确定出一些底层实现的细节</a>,其中包括标准库中所使用的通用特性,如<a href="/misc/goto?guid=4959010492949171341">条件性符合(conditional conformances)</a>以及<a href="/misc/goto?guid=4959010493044387788">协议递归约束(recursive protocol requirements)</a>;API 弹性,确保库 API 能够在保持其 ABI 稳定性的同时进行演进;另外还有<a href="/misc/goto?guid=4959010493136275813">内存所有权(memory ownership)</a>。</p> <p>Swift 5 另外一个主要目标是源稳定性(source stability),这使得 Swift 5 编译器能够接受使用之前版本的 Swift 编写的代码。为此,只有当满足以下三种情况时,才会接受源代码的更改:当实际语法很明显会引发问题时;当新语法明显更好时;当存在现有代码自动迁移路径时。源稳定性将会支持 Swift 4 的代码,也有可能支持 Swift 3 的代码。</p> <p>对于<a href="/misc/goto?guid=4959010493229342728">字符串人机工程学(string ergonomics)</a>领域的额外改进也被列入计划,它可以使字符串更易于使用,除此之外,还有对标准库的改进,它为新的并发模型奠定了基础。</p> <p>最后但同样重要的是,Swift 5 的演进过程已经被重新定义,避免过多的演进提案对 ABI 稳定性的专注度造成影响。特别是从 2018 年 3 月 1 日起,每个新提案都需要一个可行的实现,其中包括测试用例。缺少可行实现的提案也可以被提交,但是不会被审查通过。</p> <p>来自: <a href="/misc/goto?guid=4959010493315126283" id="link_source2">InfoQ</a></p>