宣布 Rust 1.18

2017 年 6 月 8 日 · Rust 核心团队

Rust 团队很高兴宣布 Rust 的最新版本 1.18.0。Rust 是一种系统编程语言,专注于安全、速度和并发性。

如果您已经安装了以前的 Rust 版本,获取 Rust 1.18 非常简单

$ rustup update stable

如果您还没有,您可以从我们网站上的相应页面获取 rustup,并查看 GitHub 上的1.18.0 的详细发行说明

1.18.0 稳定版中的内容

像往常一样,Rust 1.18.0 包含一系列改进、清理和新功能。

其中最大的变化是酝酿已久:核心团队成员 Carol Nichols 和 Steve Klabnik 一直在编写“Rust 编程语言”的新版本,这是关于 Rust 的官方书籍。它正在GitHub 上公开编写,总共有超过一百位贡献者。此版本包含第二版的第一稿,在我们的在线文档中。20 章中有 19 章有草稿;第 20 章的草稿将在 Rust 1.19 中发布。当这本书完成时,将通过No Starch Press 提供印刷版,如果您想要纸质版。我们仍在与 No Starch 的编辑合作改进文本,但我们希望现在开始让更广泛的受众参与进来。

新版本从头开始进行了完全重写,利用了过去两年我们在教授人们 Rust 时获得的知识。您将找到对 Rust 许多核心概念的全新解释、新的项目构建以及各种其他好东西。请查看并告诉我们您的想法

至于语言本身,一个旧的功能学习了一些新技巧:pub 关键字已经扩展了一点。经验丰富的 Rustaceans 会知道,Rust 中的项目默认情况下是私有的,您可以使用 pub 关键字使它们公开。在 Rust 1.18.0 中,pub获得了一种新形式

pub(crate) bar;

() 内的位是一个“限制”,它细化了如何使它公开的概念。使用上面的示例中的 crate 关键字意味着 bar 对整个板条箱是公开的,但不在其外部。这使得声明对“您的板条箱公开”但未公开给您的用户的 API 变得更容易。这在现有的模块系统中是可能的,但通常非常笨拙。

您还可以指定路径,如下所示

pub(in a::b::c) foo;

这意味着“在 a::b::c 的层次结构中可用,但在其他地方不可用”。此功能在RFC 1422 中定义,并在参考中记录

对于我们的 Windows 用户,Rust 1.18.0 有一个新的属性,#![windows_subsystem]。它的工作原理如下

#![windows_subsystem = "console"]
#![windows_subsystem = "windows"]

这些控制链接器中的/SUBSYSTEM 标志。目前,只支持 "console""windows"

这什么时候有用?简单来说,如果您正在开发一个图形应用程序,并且没有指定 "windows",则在应用程序启动时会弹出一个控制台窗口。使用此标志,它不会出现。

最后,Rust 的元组、枚举变体字段和结构体(没有 #[repr])一直具有未指定的布局。我们启用了自动重新排序,这可以通过减少填充来减少大小。考虑一个这样的结构体

struct Suboptimal(u8, u16, u8);

在以前的 Rust 版本中,在 x86_64 平台上,此结构体的大小为六个字节。但是查看源代码,您会期望它有四个字节。多出的两个字节来自填充;鉴于我们这里有一个 u16,它应该与两个字节对齐。但在这种情况下,它位于偏移量 1 处。为了将其移动到偏移量 2 处,在第一个 u8 之后放置另一个字节的填充。为了使整个结构体具有适当的对齐方式,在第二个 u8 之后也添加另一个字节,从而得到 1 + 1 (填充) + 2 + 1 + 1 (填充) = 6 字节

但是如果我们的结构体看起来像这样呢?

struct Optimal(u8, u8, u16);

此结构体已正确对齐;u16 位于两个字节边界上,整个结构体也是如此。不需要填充。这给了我们 1 + 1 + 2 = 4 字节

在设计 Rust 时,我们故意将内存布局的细节留空,正是出于这个原因。因为我们没有承诺特定的布局,所以我们可以对其进行改进,例如在这种情况下,编译器可以自动将 Suboptimal 优化为 Optimal。如果您检查 Rust 1.18.0 上 SuboptimalOptimal 的大小,您会发现它们的大小都是四个字节。

我们一直在计划这项更改有一段时间了;以前的 Rust 版本在 nightly 通道中包含此优化,但有些人编写了假定表示形式的精确细节的不安全代码。我们在修复了我们知道的此类所有实例时将其回滚,但如果您发现某些代码因此而中断,请告诉我们,以便我们帮助您修复它!用于 FFI 的结构体可以添加 #[repr(C)] 注解以防止重新排序,以及与 C 兼容的字段布局。

我们一直计划将 rustdoc 迁移到使用符合 CommonMark 的 Markdown 解析器。但是,仅仅切换过来可能会导致回归,因为 CommonMark 规范与我们现有的解析器 Hoedown 不同。作为过渡计划的一部分,rustdoc 中添加了一个新标志--enable-commonmark。这将使用新的解析器而不是旧的解析器。请试一试!据我们所知,这两个解析器将产生相同的结果,但我们想知道您是否发现渲染结果不同的情况!

最后,编译 rustc 本身现在快了 15%-20%。此 PR 中的每个提交消息都详细介绍了细节;存在一些低效之处,现在它们已被清理。

有关更多信息,请参阅详细的发行说明

库稳定化

此版本稳定了七个新的 API

有关更多信息,请参阅详细的发行说明

Cargo 功能

Cargo 已添加对 Pijul VCS 的支持,该 VCS 是用 Rust 编写的。cargo new my-awesome-project --vcs=pijul 将帮助您开始!

为了补充 --all 标志,Cargo 现在有几个新标志,例如 --bins--examples--tests--benches,这些标志将允许您构建所有类型的程序。

最后,Cargo 现在支持HaikuAndroid

有关更多信息,请参阅详细的发行说明

1.18.0 的贡献者

许多人共同创建了 Rust 1.18。没有你们,我们不可能做到。感谢大家