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 一直在编写新版的“The Rust Programming Language”,这是关于 Rust 的官方书籍。它正在GitHub 上公开编写,共有 100 多位贡献者。此版本在我们的在线文档中包含了第二版的第一稿。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 公开”但不暴露给用户的 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);

在以前版本的 x86_64 平台上的 Rust 中,此结构体的大小为六个字节。但是查看源代码,您会期望它有四个字节。多出的两个字节来自填充;鉴于这里有一个 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 通道中包含此优化,但有些人编写了不安全的代码,假设表示形式的精确细节。我们在修复了我们所知道的所有此类实例时将其回滚,但是如果您发现由于此原因而导致某些代码中断,请告诉我们,以便我们可以帮助修复!用于 FFI 的结构体可以给出 #[repr(C)] 注释以防止重新排序,以及 C 兼容的字段布局。

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

最后,编译 rustc 本身现在速度提高了 15%-20%。此 PR 中的每个提交消息都详细介绍了细节;存在一些效率低下之处,现在已清理完毕。

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

库的稳定化

此版本稳定了七个新的 API

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

Cargo 的特性

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

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

最后,Cargo 现在支持 HaikuAndroid

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

1.18.0 的贡献者

许多人共同努力创建了 Rust 1.18。没有大家,我们就无法做到这一点。谢谢!