什么是 Rust 2018?

2018 年 7 月 27 日 · Rust 核心团队

早在 3 月份,我们宣布了一些新东西

今年,我们将发布 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,或者 gccclang 如何支持 C++14 和 C++17。此外,每个编译器都将了解如何将这两种代码链接在一起。这意味着,如果你使用的是 Rust 2018,你可以使用使用 Rust 2015 的依赖项,没有任何问题。如果你坚持使用 Rust 2015,你可以使用使用 Rust 2018 的库。它们都可以协同工作。这使得想要使用新事物的人可以立即开始,而那些想要慢慢来的人可以按照自己的时间安排进行升级。

除此之外,还要提一下,这次发布将是 Rust 2018 的初始发布;从某种意义上说,这是一个开始,而不是结束。我们还没有正式承诺版本的发布计划,但下一个版本很可能是 Rust 2021。我们将在发布 Rust 2018 之后继续为其添加功能,就像我们在发布 Rust 1.0 之后继续为其添加功能一样。

同样重要的是要注意,Rust 2015 并没有被冻结。任何不需要成为 Rust 2018 一部分的东西在 Rust 2015 上也能正常工作。这是由于版本的工作方式;鉴于可能的更改的性质很小,编译器对所有版本使用相同的内部表示。

关于长期支持的几句话

Rust 项目目前只支持最新版本的稳定编译器。有些人想知道版本的概念是否与某种形式的更长时间的支持相关联。然而,事实并非如此,我们一直在讨论引入某种形式的 LTS 策略,并且可能在将来这样做。

试一试

我们将发布几个 Rust 2018 的预览版本。最具冒险精神的 Rust 用户已经在 nightly 上尝试了它;一旦我们从他们那里获得反馈并进行一些完善,我们将宣布一个适合更广泛使用者的测试版,供你在博客上尝试。