Rust 团队很高兴宣布 Rust 的最新版本 1.12 发布。Rust 是一种系统编程语言,其口号是“快速、可靠、高效:三者兼得。”
一如既往,您可以从我们的网站上安装 Rust 1.12,并查看 GitHub 上的1.12 详细发布说明。此版本共合并了 1361 个补丁。
1.12 稳定版有什么?
1.12 的发布可能是自 1.0 版本以来最重要的 Rust 版本之一。我们有很多内容要介绍,但如果您没有时间细读,这里有一个总结
1.12 稳定版中面向用户的最大变化是 rustc 发出的新错误消息格式。我们之前曾讨论过这种格式,而这是它们首次在稳定版中广泛可用。这些错误消息是经过许多小时的志愿者努力设计、测试和更新 rustc 的每一个错误到新格式的结果。我们很高兴看到您对它们的看法

此版本中最大的内部变化是切换到基于新的 Rust MIR 的新编译器后端。虽然此功能目前尚未带来任何用户可见的变化,但它为未来许多编译器优化铺平了道路,并且对于某些代码库,它已经提高了编译时间并减小了代码大小。
重塑的错误消息
在 1.12 版本中,我们引入了一种新的错误格式,它有助于向开发者您展示许多关于错误发生原因的内部知识。它通过将您的代码置于核心位置,并用注释突出显示与错误相关的部分来描述出错的地方。
例如,在 1.11 版本中,如果一个 trait 的实现与 trait 声明不匹配,您会看到如下所示的错误

在新错误格式中,我们通过显示代码中最关键的点来表示错误。这里是 trait 声明中的相关行,以及实现中的相关行,使用标签来描述它们为何不匹配

最初,这种错误设计是为了帮助理解借用检查错误,但我们发现,正如上面的错误所示,这种格式可以广泛应用于各种错误。如果您想了解更多关于此设计的信息,请查看之前关于此主题的博客文章。
最后,您还可以使用一个标志以 JSON 格式获取这些错误。还记得我们在文章开头展示的那个错误吗?这里是尝试编译该代码并传递 --error-format=json 标志时的示例
}}}}
}
出于简洁考虑,我们实际上省略了一些内容,但您应该明白了。此输出主要用于工具;我们正在继续投入精力支持 IDE 和其他有用的开发工具。此输出是这项努力的一小部分。
MIR 代码生成
新的 Rust“中间级 IR”,通常称为“MIR”,为编译器提供了一种比之前完全基于 Rust 抽象语法树运行更简单的方式来理解 Rust 代码。它使那些历史上难以正确实现的分析和优化成为可能。MIR 带来的许多即将到来的编译器更改中的第一个是对生成 LLVM IR(rustc 称之为“翻译”)的 pass 的重写,经过几个月的努力,基于 MIR 的后端已经证明自己已准备好投入使用。
MIR 暴露了关于程序控制流的完整信息,因此编译器能精确地知道类型是否被移动。这意味着它静态地知道值是否需要运行析构函数。在值可能在作用域结束时被移动或不被移动的情况下,编译器现在只需在栈上使用一个单比特标志,这反过来更容易让 LLVM 中的优化 pass 进行推断。最终结果是编译器的工作量减少,运行时膨胀也减少。此外,由于 MIR 比完整的 AST 更简单,也更容易在其上实现编译器 pass,并且更容易验证它们的正确性。
其他改进
- 文档有许多小改进。
rustc在 ARM 上支持三个新的 MUSL 目标:arm-unknown-linux-musleabi、arm-unknown-linux-musleabihf和armv7-unknown-linux-musleabihf。这些目标会生成静态链接的二进制文件。但目前还没有提供二进制发布版本。- 在错误描述中,引用和未知数值类型的错误更加人性化。
- 编译器现在可以基于 LLVM 3.9 构建
- 测试二进制文件现在支持
--test-threads参数来指定用于运行测试的线程数,其作用与RUST_TEST_THREADS环境变量相同 - 测试运行器现在在测试运行超过 60 秒时发出警告
- Rust 发布版本现在包含可通过 rustup 使用
rustup component add rust-src命令安装的源代码包。生成的源代码可供工具和 IDE 使用,位于 sysroot 下的lib/rustlib/src目录中。
更多内容请参阅详细发布说明。
库稳定化
此版本对标准库中的各种类型进行了一些提升使用体验的小改进
Cell::as_ptr和RefCell::as_ptrIpAddr、Ipv4Addr和Ipv6Addr增加了一些新方法。LinkedList和VecDeque增加了一个新的contains方法。iter::Product和iter::SumOption为其包含的类型实现了FromtraitCell、RefCell和UnsafeCell为其包含的类型实现了FromtraitCow<str>为char、&str和String实现了FromIteratortrait- Linux 上的 Socket 通过
SOCK_CLOEXEC在子进程中正确关闭 String实现了AddAssigntrait- Unicode 定义已更新至 9.0 版本
更多内容请参阅详细发布说明。
Cargo 特性
本周期 Cargo 增加的最大特性是“工作空间 (workspaces)”。在RFC 1525 中定义,工作空间允许一组 Rust 包共享同一个 Cargo.lock 文件。如果您的项目被拆分成多个包,这使得将共享依赖项保持在单个版本上变得容易得多。要启用此特性,大多数多包项目需要在其顶层 Cargo.toml 中添加一个键 [workspace],但更复杂的设置可能需要更多配置。
另一个重要特性是能够覆盖 crate 的来源。结合 cargo-vendor 和 cargo-local-registry 等工具使用此功能,可以以健壮的方式在本地 vendoring 依赖项。最终,此支持也将成为支持 crates.io 镜像的基础。
还有其他一些改进
更多内容请参阅详细发布说明。
1.12 贡献者
共有 176 位个人为 1.12 版本做出了贡献。非常感谢大家!
- Aaron Gallagher
- abhi
- Adam Medziński
- Ahmed Charles
- Alan Somers
- Alexander Altman
- Alexander Merritt
- Alex Burka
- Alex Crichton
- Amanieu d'Antras
- Andrea Pretto
- Andre Bogus
- Andrew
- Andrew Cann
- Andrew Paseltiner
- Andrii Dmytrenko
- Antti Keränen
- Aravind Gollakota
- Ariel Ben-Yehuda
- Bastien Dejean
- Ben Boeckel
- Ben Stern
- bors
- Brendan Cully
- Brett Cannon
- Brian Anderson
- Bruno Tavares
- Cameron Hart
- Camille Roussel
- Cengiz Can
- CensoredUsername
- cgswords
- Chiu-Hsiang Hsu
- Chris Stankus
- Christian Poveda
- Christophe Vu-Brugier
- Clement Miao
- Corey Farwell
- CrLF0710
- crypto-universe
- Daniel Campbell
- David
- decauwsemaecker.glen@gmail.com
- Diggory Blake
- Dominik Boehi
- Doug Goldstein
- Dridi Boukelmoune
- Eduard Burtescu
- Eduard-Mihai Burtescu
- Evgeny Safronov
- Federico Ravasio
- Felix Rath
- Felix S. Klock II
- Fran Guijarro
- Georg Brandl
- ggomez
- gnzlbg
- Guillaume Gomez
- hank-der-hafenarbeiter
- Hariharan R
- Isaac Andrade
- Ivan Nejgebauer
- Ivan Ukhov
- Jack O'Connor
- Jake Goulding
- Jakub Hlusička
- James Miller
- Jan-Erik Rediger
- Jared Manning
- Jared Wyles
- Jeffrey Seyfried
- Jethro Beekman
- Jonas Schievink
- Jonathan A. Kollasch
- Jonathan Creekmore
- Jonathan Giddy
- Jonathan Turner
- Jorge Aparicio
- José manuel Barroso Galindo
- Josh Stone
- Jupp Müller
- Kaivo Anastetiks
- kc1212
- Keith Yeung
- Knight
- Krzysztof Garczynski
- Loïc Damien
- Luke Hinds
- Luqman Aden
- m4b
- Manish Goregaokar
- Marco A L Barbosa
- Mark Buer
- Mark-Simulacrum
- Martin Pool
- Masood Malekghassemi
- Matthew Piziak
- Matthias Rabault
- Matt Horn
- mcarton
- M Farkas-Dyck
- Michael Gattozzi
- Michael Neumann
- Michael Rosenberg
- Michael Woerister
- Mike Hommey
- Mikhail Modin
- mitchmindtree
- mLuby
- Moritz Ulrich
- Murarth
- Nick Cameron
- Nick Massey
- Nikhil Shagrithaya
- Niko Matsakis
- Novotnik, Petr
- Oliver Forral
- Oliver Middleton
- Oliver Schneider
- Omer Sheikh
- Panashe M. Fundira
- Patrick McCann
- Paul Woolcock
- Peter C. Norton
- Phlogistic Fugu
- Pietro Albini
- Rahiel Kasim
- Rahul Sharma
- Robert Williamson
- Roy Brunton
- Ryan Scheel
- Ryan Scott
- saml
- Sam Payson
- Samuel Cormier-Iijima
- Scott A Carr
- Sean McArthur
- Sebastian Thiel
- Seo Sanghyeon
- Shantanu Raj
- ShyamSundarB
- silenuss
- Simonas Kazlauskas
- srdja
- Srinivas Reddy Thatiparthy
- Stefan Schindler
- Stephen Lazaro
- Steve Klabnik
- Steven Fackler
- Steven Walter
- Sylvestre Ledru
- Tamir Duberstein
- Terry Sun
- TheZoq2
- Thomas Garcia
- Tim Neumann
- Timon Van Overveldt
- Tobias Bucher
- Tomasz Miąsko
- trixnz
- Tshepang Lekhonkhobe
- ubsan
- Ulrik Sverdrup
- Vadim Chugunov
- Vadim Petrochenkov
- Vincent Prouillet
- Vladimir Vukicevic
- Wang Xuerui
- Wesley Wiser
- William Lee
- Ximin Luo
- Yojan Shrestha
- Yossi Konstantinovsky
- Zack M. Davis
- Zhen Zhang
- 吴冉波