Rust 团队很高兴地宣布 Rust 的最新版本 1.18.0。Rust 是一种专注于安全性、速度和并发性的系统编程语言。
如果您已经安装了早期版本的 Rust,获取 Rust 1.18 就像执行以下命令一样简单:
如果您还没有安装,可以从我们网站的相应页面获取 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 bar;
() 内的部分是一个“限制”,它细化了公开的方式。使用示例中的 crate 关键字意味着 bar 对整个 crate 是公共的,但不在 crate 外部。这使得声明对“您的 crate 公共”但不暴露给用户使用的 API 变得更容易。使用现有的模块系统也可以实现这一点,但通常非常笨拙。
您还可以指定一个路径,像这样:
pub foo;
这意味着“在 a::b::c 的层次结构内可用,但在其他地方不可用”。此功能在 RFC 1422 中定义,并在参考文档中记录。
对于 Windows 用户,Rust 1.18.0 引入了一个新属性 #![windows_subsystem]。它像这样工作:
这些控制链接器中的/SUBSYSTEM 标志。目前,只支持 "console" 和 "windows"。
这在什么时候有用?最简单地说,如果您正在开发图形应用程序,并且没有指定 "windows",那么您的应用程序启动时会闪现一个控制台窗口。使用此标志,它就不会出现。
最后,Rust 的元组、枚举变体字段和结构体(不带 #[repr])的内存布局一直是不确定的。我们开启了自动重排序,这可以通过减少填充来减小尺寸。考虑这样一个结构体:
;
在之前版本的 Rust 的 x86_64 平台上,这个结构体的尺寸是六字节。但是看源代码,您可能会期望它是四字节。额外的两字节来自填充;考虑到这里有一个 u16,它应该对齐到两字节。但在这种情况下,它位于偏移量一。为了将它移动到偏移量二,在第一个 u8 之后放置了一个字节的填充。为了使整个结构体获得适当的对齐,在第二个 u8 之后也添加了一个字节,这样我们就得到了 1 + 1(填充)+ 2 + 1 + 1(填充)= 6 字节。
但是如果我们的结构体看起来像这样呢?
;
这个结构体是正确对齐的;u16 位于两字节边界上,整个结构体也是如此。不需要填充。这使得我们得到 1 + 1 + 2 = 4 字节。
在设计 Rust 时,我们正是出于这个原因,将内存布局的细节保留为未定义。因为我们没有承诺特定的布局,所以我们可以对其进行改进,比如在这种情况下编译器可以自动将 Suboptimal 优化为 Optimal。如果您检查 Rust 1.18.0 上 Suboptimal 和 Optimal 的尺寸,您会发现它们都只有四字节。
我们为此变化计划了一段时间;之前版本的 Rust 在 nightly 通道中包含了此优化,但有些人编写了假设精确表示细节的 unsafe 代码。我们在修复所有已知实例的同时回滚了它,但如果您发现有代码因此而中断,请告知我们,以便我们协助修复!用于 FFI 的结构体可以添加 #[repr(C)] 注解来防止重排序,此外还遵循 C 兼容的字段布局。
我们计划将 rustdoc 迁移到使用 CommonMark 兼容的 markdown 解析器已经很久了。然而,直接切换可能会引入回归,因为 CommonMark 规范与我们现有的解析器 Hoedown 不同。作为过渡计划的一部分,rustdoc 添加了一个新标志,--enable-commonmark。这将使用新解析器而不是旧解析器。请尝试一下!据我们所知,两个解析器将产生相同的结果,但如果您发现渲染结果不同的场景,我们会很感兴趣!
最后,编译 rustc 本身现在快了 15%-20%。此 PR 中的每个提交消息都详细说明了细节;之前存在一些低效率,现在已经清理完毕。
更多信息请参阅详细发布说明。
标准库稳定性改进
此版本稳定了七个新的 API:
Child::try_wait是Child::wait的非阻塞形式。HashMap::retain和HashSet::retain将Vec拥有的retainAPI 带给了这两个哈希数据结构。PeekMut::pop允许您在已经窥视过BinaryHeap的顶部元素后将其弹出,而无需二次重排序堆。TcpStream::peek、UdpSocket::peek和UdpSocket::peek_from允许您窥视流或套接字。
更多信息请参阅详细发布说明。
Cargo 特性
Cargo 添加了对 Pijul VCS 的支持,Pijul 是用 Rust 编写的。cargo new my-awesome-project --vcs=pijul 可以让您开始使用!
为了补充 --all 标志,Cargo 现在有几个新标志,例如 --bins、--examples、--tests 和 --benches,这些标志允许您构建所有该类型的程序。
最后,Cargo 现在支持 Haiku 和 Android!
更多信息请参阅详细发布说明。
1.18.0 的贡献者
许多人共同努力创造了 Rust 1.18。没有你们所有人,我们不可能做到。感谢你们!