早在三月份,我们就宣布了一些新的东西
今年,我们将发布 Rust 2018,标志着自 1.0(又名 Rust 2015)以来 Rust 的第一个主要新版本。
我们将像往常一样每六周继续发布一次版本。但是,我们将在今年后三分之一(Rust 1.29 - 1.31)的版本中指定一个版本为 Rust 2018。Rust 的这个新“版本”将是今年全年功能稳定的顶峰,并将附带完善的文档、工具和与这些功能相关的库。
现在已经过了一段时间,我们想分享更多关于这对于 Rust 和 Rust 开发人员来说实际上意味着什么。
语言随时间的变化
语言开发人员面临的关键问题之一是“如何管理随时间的变化”?这对你的用户有什么影响?我们坚信语言的稳定性至关重要。语言是你构建应用程序的基础,你不能在沙子上构建可靠、长久的事物。早在 2014 年 10 月,我们博客上的第二篇文章就是“稳定性作为 可交付成果”。这奠定了我们六周发布计划的基础,我们至今仍然遵循这个计划。它还描述了稳定性有多重要。
明确我们所说的稳定是什么很重要。我们不是说 Rust 会停止发展。我们将定期发布新版本的 Rust,我们希望人们也能定期升级。但是,为了实现这一点,这些升级需要是无痛的。
我们投入了大量工作来使升级无痛;例如,我们在每次 Rust 发布之前都会运行一个工具(称为“crater”),该工具会下载 crates.io 上的每个包并尝试构建其代码并运行其测试。我们有强大的测试文化,我们使用工具来确保在每个平台上测试每个拉取请求。虽然我们仍然认为六周的流程是一个绝佳的工程策略,但它存在一些缺陷。
失去全局观
增加发布次数意味着每次发布都更小。这就是重点!从工程角度来看,这很棒。但是从用户角度来看,除非你每六周都密切关注,否则很难跟踪 Rust 中发生的事情。对于我们这些确实密切关注的人来说,很容易忽略全局。在过去的三年里,Rust 已经取得了长足的进步!最后,对于那些尝试过 Rust 并因任何原因停止使用它的人来说,很难知道这些问题是否已得到解决:他们必须每六周都关注,这不太可能发生。
微小但必要的更改
尤其是在具有静态类型的语言中,几乎任何版本都可能包含一些会破坏某人代码的内容。Rust 的 RFC 1105 列出了我们在增加语言的主要、次要或补丁版本时可以进行的更改类型。然而,“2.0”的概念在开发人员的思想中被严重地超载了。2.0 是重大的破坏性更改。是时候把一切都扔掉并重新开始了。因此,我们非常警惕发布 Rust 2.0。有一些小的更改,如果不需要升级到 2.0,就会很高兴进行这些更改。例如,添加新关键字是一个破坏性的更改。但有时,新功能需要新关键字才能正常工作。在许多方面,Rust 都是关于权衡和弯曲曲线的。我们能两者兼得吗?
什么是 Rust 2018?
12 月 6 日发布的 Rust 1.31.0 将是“Rust 2018”的第一个版本。这标志着过去三年 Rust 开发的顶峰,并将其整合到一个整洁的包中。例如,将有 2018 版的书,其中包含自印刷版被认为最终确定以来稳定的功能。
你可以在你的 Cargo.toml
中放入 edition = '2018'
,并且 cargo new
会默认将其添加到新项目中。首先,这将解锁一些没有它就不可能实现的新功能,最终,它将启用一些新的 lint,推动你使用新的习惯用法。你也可以选择 '2015'
,如果你根本没有 edition
键,它将默认为此值。这些项目将像以前一样继续进行。我们将发布一个工具,帮助你自动升级你的代码以使用这些新功能和习惯用法。运行 cargo fix
将以自动方式使你的代码做好准备。
从一个角度来看,版本主要与那个有凝聚力的包有关:它们是关于庆祝我们所取得的成就,并向世界讲述它。从另一个角度来看,版本是我们进行“破坏性”更改而不破坏你的代码的一种方式。例如,try
将成为 Rust 2018 中的一个关键字。我们无法在 Rust 2015 中进行此更改,因为它可能会破坏将其用作变量名称的代码。但由于你选择加入 Rust 2018,我们可以这样做。我们还可以将一些警告转换为硬错误。但是这些更改非常有限;在不深入探讨技术细节的情况下,版本只能更改表面级别的功能;Rust 的核心仍然相同。
管理兼容性
它甚至更进一步:这两个宇宙是相互兼容的。我们对其他语言生态系统中的问题非常敏感,在这些生态系统中,新代码和旧代码无法互操作。确保这一点正常工作是版本设计的关键方面。在某种意义上,版本正在遵循 Java 和 C++ 的步伐,这两种语言以其稳定性故事而闻名。
简而言之,Rust 编译器将知道如何编译这两个版本的代码。这类似于 javac
可以编译 Java 9 和 Java 10,或者 gcc
和 clang
都支持 C++14 和 C++17。此外,每个编译器都将了解如何将这两种代码链接在一起。这意味着,如果你使用的是 Rust 2018,你可以使用使用 Rust 2015 的依赖项,而不会出现任何问题。如果你坚持使用 Rust 2015,你可以使用使用 Rust 2018 的库。它们都可以协同工作。这让那些想要使用新事物的人可以立即开始,而那些想要慢一点的人可以按照自己的时间表升级。
除此之外,还需要提及的是,此版本将是 Rust 2018 的初始版本;在某种意义上,它是开始,而不是结束。我们尚未正式承诺版本的发布时间表,但下一个版本很可能是 Rust 2021。我们将在 Rust 2018 发布后继续向其添加功能,就像我们在 Rust 1.0 版本发布后继续向 Rust 添加功能一样。
还需要注意的是,Rust 2015 并未冻结。任何不需要成为 Rust 2018 一部分的内容都可以在 Rust 2015 上运行。这是由于版本的运作方式;鉴于可能更改的性质很小,编译器对所有版本使用相同的内部表示。
关于长期支持的几句话
Rust 项目目前仅支持最新版本的稳定编译器。有人想知道版本的概念是否与某种形式的长期支持相关联。但事实并非如此,不过我们一直在讨论引入某种 LTS 策略,将来可能会这样做。
试一试
我们将发布 Rust 2018 的几个预览版。最喜欢冒险的 Rust 用户已经在 nightly 上试用了;一旦我们收到他们的反馈并进行一些完善,我们将在博客上宣布一个 beta 版,该版本已准备好供你在此处试用。