Rust 2018 是什么?

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

回到三月,我们宣布了一项新内容

今年,我们将交付 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',如果你的 Cargo.toml 中完全没有 edition 键,它将默认为此值。这些项目将一如既往地继续运行。我们将发布一个工具,帮助你自动升级代码以使用这些新特性和惯用法。运行 cargo fix 将以自动化方式准备好你的代码。

从一个角度来看,版本(editions)主要关乎那个统一的包:它们旨在庆祝我们所取得的成就,并向世界宣告。从另一个角度来看,版本是我们可以在不破坏你的代码的情况下进行“破坏性”更改的一种方式。例如,在 Rust 2018 中,try 将成为一个关键字。我们不能在 Rust 2015 中进行此更改,因为它可能会破坏使用 try 作为变量名的代码。但由于你选择加入 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 版本上试用了;一旦我们收到他们的反馈并进行一些完善,我们将在博客上宣布一个准备好供大家广泛使用的 beta 版本供你尝试。