通往 Rust 1.0 的道路

2014 年 9 月 15 日 · Niko Matsakis

Rust 1.0 即将到来!我们已经确定了具体的功能列表,并且正在努力实现它们。我们计划在今年年底发布 1.0 beta 版。如果一切顺利,这将在 beta 阶段之后成为 1.0 正式版。1.0 发布后,未来的 1.x 版本将向后兼容,这意味着现有代码将继续编译(当然,编译器错误除外)。

当然,Rust 1.0 版本意味着不仅仅是“你的代码将继续编译”。基本上,这意味着我们认为 Rust 的设计终于感觉对了。更具体地说,它感觉很简洁。语言本身现在专注于一个简单的核心概念,我们称之为所有权和借用(稍后会详细介绍)。利用所有权和借用,我们已经能够在库中构建我们需要的其他所有东西。这非常令人兴奋,因为我们可以编写的任何库,你也可以编写。这让我们真正相信 Rust 不仅会实现其最初的目标,而且还会超越并用于我们甚至没有设想过的各种事物。

通往 Rust 1.0 的道路

Rust 经历了漫长的演变。如果你有一段时间没有关注 Rust,你可能会对看到的内容感到惊讶:在过去的一年中,我们一直在彻底简化设计。一个突出的例子是,Rust 曾经包含几种指针类型,用各种符号表示:这些都消失了,只剩下引用类型(&T&mut T)。我们还能够合并和简化许多其他语言特性,例如闭包,这些特性曾经拥有各种各样的选项。(其中一些更改仍在进行中。)

所有这些更改的关键是专注于所有权和借用的核心概念。最初,我们引入所有权作为一种在任务之间安全高效地传输数据的方法,但随着时间的推移,我们意识到相同的机制允许我们将各种东西从语言中移到库中。由此产生的设计不仅更易于学习,而且比我们以前认为的更“接近金属”。所有 Rust 语言结构都与机器操作有非常直接的映射,并且 Rust 没有必需的运行时或外部依赖项。在它自己的最简配置中使用时,甚至可以编写用 Rust 编写的操作系统系统内核

然而,在所有这些变化中,Rust 一直忠于其提供现代编程语言的安全性便利性,同时仍然提供 C 和 C++ 提供的效率底层控制的目标。基本上,如果你想亲自动手操作裸机,但又不想花几个小时追踪段错误和数据竞争,Rust 就是你的语言。

如果你还不熟悉 Rust,别担心。在接下来的几个月里,我们计划定期发布一系列博客文章来探讨这门语言。前几篇将重点介绍所有权的不同方面以及如何使用它来实现安全的手动内存管理、并发等。之后,我们将转向 Rust 语言和生态系统的其他方面。

还有哪些工作要做

我们已经取得了很大进展,但在发布之前还有很多工作要做。以下是我们目前正在进行的大型变更列表

  • 动态大小类型:类型系统中的此扩展允许我们统一处理大小在编译时未知的类型,例如数组类型。这使我们能够支持包含数组或对象的由用户设计的智能指针。Nicholas Cameron 最近提交了一个英雄般的提交,实现了大部分工作。
  • 未装箱闭包:我们的新闭包设计统一了闭包和对象类型。规范的大部分内容已经实现。
  • 关联类型:我们正在将我们的特征系统迁移到使用关联类型,这确实有助于减少编写高级泛型库所需的泛型注释级别。Patrick Walton 已经完成了初始实现。
  • where 子句:我们正在添加一种灵活的新约束形式,称为where 子句。Patrick Walton 已经实现了对基本语法的支持,我已经在一个分支上实现了剩余的功能,该分支应该很快就会合并。
  • 多重分派特征:我们正在扩展特征,以便它们可以一次匹配多个类型,这为更符合人体工程学的 API 开辟了许多新机会。我已经在一个分支上对这项工作进行了原型设计。
  • 析构函数:我们正在改进析构函数语义,使其不再需要对内存进行清零,这应该会提高编译和执行时间。Felix Klock 已经实现了必要的分析,并且正在进行合并。
  • 绿色线程:我们正在从标准库中删除对绿色线程的支持,并将其移到外部包中。这使得 Rust 模型与底层操作系统更加匹配,从而使程序更加高效。Aaron Turon 已经编写了 RFC,并且现在正在开始这项工作。

在库级别,我们目前正在对 libstd 进行全面检查,以确定哪些部分是稳定的,哪些部分不是。你可以在这里监控进度。(但请注意,许多“不稳定”项只是名称将略微更改以符合约定或其他细微调整。)

Cargo 和库生态系统

我之前写过 Rust 1.0 不仅仅是一个终点,而是一个起点。这是非常真实的。Rust 1.0 的目标是成为构建高效库的灵活基底——但如果没有人能找到它们或者它们难以安装,库就毫无用处。

进入Cargo,Rust 包管理器。Cargo 最近一直在快速发展,并且已经相当实用。到 1.0 发布时,我们计划也启动一个中央存储库,这意味着创建和分发 Rust 库(我们称之为“板条箱”)将变得很简单。哦,当然,Cargo 及其关联服务器都是用 Rust 编写的。

发布流程

Rust 版本长期以来一直遵循火车时间表,我们不打算改变这一点。但是,一旦我们开始发布稳定版本,我们也会建立更多基础设施。我们的计划是采用许多其他项目(如FirefoxChromeEmber.js)使用的“通道”系统。

这个想法是,有三个通道:Nightly、Beta 和 Stable。如果你想要最新的版本,可以使用 Nightly 通道:它包含不稳定的功能和库,这些功能和库可能仍然会以向后不兼容的方式发生变化。每六周,我们都会创建一个新分支并将其称为 Beta。此分支排除所有不稳定的部分,因此你知道如果你使用的是 Beta 或 Stable,你的代码将继续编译。同时,现有的 Beta 分支将提升到 Stable 版本。我们预计生产用户会更喜欢在 Beta 分支上进行测试,并在 Stable 分支上发布。在 Beta 上进行测试可以确保我们能够提前收到通知,如果我们不小心破坏了你依赖的任何东西。

关于 1.0 版本,具体计划是发布 1.0 beta 版,然后遵循相同的流程过渡到 1.0 正式版。但是,如果我们在 1.0 beta 版中发现严重缺陷,我们可能会推迟并运行一个或两个额外的 beta 阶段。毕竟,等待更长时间比最终承诺一个有缺陷的东西要好。

展望未来

在许多方面,Rust 1.0 不仅仅是一个终点,而是一个起点。当然,我们计划继续开发 Rust:我们有很多想要添加的功能,其中许多功能已经列入计划。但对我来说最令人兴奋的工作不是 Rust 团队将要做的工作。相反,我预计拥有一个稳定的基础将使 Rust 社区和生态系统比现在发展得更快。我迫不及待地想看看会发生什么。