宣布 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 stable 版本有什么?

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

其中一个最大的变化已经酝酿了很久:核心团队成员 Carol Nichols 和 Steve Klabnik 一直在编写新版“The Rust Programming Language”,这是关于 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 对整个 crate 是公共的,但不在 crate 外部。这使得声明对“您的 crate 公共”但不暴露给用户使用的 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,它应该对齐到两字节。但在这种情况下,它位于偏移量一。为了将它移动到偏移量二,在第一个 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 通道中包含了此优化,但有些人编写了假设精确表示细节的 unsafe 代码。我们在修复所有已知实例的同时回滚了它,但如果您发现有代码因此而中断,请告知我们,以便我们协助修复!用于 FFI 的结构体可以添加 #[repr(C)] 注解来防止重排序,此外还遵循 C 兼容的字段布局。

我们计划将 rustdoc 迁移到使用 CommonMark 兼容的 markdown 解析器已经很久了。然而,直接切换可能会引入回归,因为 CommonMark 规范与我们现有的解析器 Hoedown 不同。作为过渡计划的一部分,rustdoc 添加了一个新标志--enable-commonmark。这将使用新解析器而不是旧解析器。请尝试一下!据我们所知,两个解析器将产生相同的结果,但如果您发现渲染结果不同的场景,我们会很感兴趣!

最后,编译 rustc 本身现在快了 15%-20%。此 PR 中的每个提交消息都详细说明了细节;之前存在一些低效率,现在已经清理完毕。

更多信息请参阅详细发布说明

标准库稳定性改进

此版本稳定了七个新的 API:

更多信息请参阅详细发布说明

Cargo 特性

Cargo 添加了对 Pijul VCS 的支持,Pijul 是用 Rust 编写的。cargo new my-awesome-project --vcs=pijul 可以让您开始使用!

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

最后,Cargo 现在支持 HaikuAndroid

更多信息请参阅详细发布说明

1.18.0 的贡献者

许多人共同努力创造了 Rust 1.18。没有你们所有人,我们不可能做到。感谢你们!