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
标志的示例:
$ rustc borrowck-assign-comp.rs --error-format=json
{"message":"cannot assign to `p.x` because it is borrowed","level":"error","spans":[{"file_name":"borrowck-assign-comp.rs","byte_start":562,"byte_end":563,"line_start":15,"line_end":15,"column_start":14,"column_end":15,"is_primary":false,"text":[{"text":" let q = &p;","highlight_start":14,"highlight_end":15}],"label":"borrow of `p.x` occurs here","suggested_replacement":null,"expansion":null}],"label":"assignment to borrowed `p.x` occurs here","suggested_replacement":null,"expansion":null}],"children":[],"rendered":null}
{"message":"aborting due to previous error","code":null,"level":"error","spans":[],"children":[],"rendered":null}
实际上,为了简洁起见,我们省略了一些内容,但是您明白了。此输出主要用于工具;我们将继续投资支持 IDE 和其他有用的开发工具。此输出是这项工作的一小部分。
MIR 代码生成
新的 Rust “中间级 IR”,通常称为“MIR”,为编译器提供了一种比以前完全在 Rust 抽象语法树上操作的方式更简单地思考 Rust 代码的方式。它使得历史上难以正确实现的分析和优化成为可能。由 MIR 实现的编译器即将进行的许多更改中的第一个是对生成 LLVM IR 的过程(rustc
称之为“转换”)的重写,经过几个月的努力,基于 MIR 的后端证明了自己已经准备好投入使用。
MIR 公开了有关程序控制流的完整信息,因此编译器确切地知道类型是否被移动。这意味着它可以静态地知道是否需要运行值的析构函数。在值的范围末尾可能被移动也可能不被移动的情况下,编译器现在只是在堆栈上使用一个简单的位标志,这反过来也更容易让 LLVM 中的优化过程进行推理。最终的结果是编译器的工作量减少,并且运行时膨胀减少。此外,由于 MIR 是一种比完整的 AST 更简单的“语言”,因此也更容易在其上实现编译器过程,并且更容易验证它们是否正确。
其他改进
- 文档的许多小改进。
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_ptr
IpAddr
、Ipv4Addr
和Ipv6Addr
有一些新方法。LinkedList
和VecDeque
有一个新的contains
方法。iter::Product
和iter::Sum
Option
为其包含的类型实现了From
。Cell
、RefCell
和UnsafeCell
为其包含的类型实现了From
。Cow<str>
为char
、&str
和String
实现了FromIterator
。- Linux 上的套接字通过
SOCK_CLOEXEC
在子进程中正确关闭。 String
实现了AddAssign
。- Unicode 定义已更新到 9.0。
有关更多信息,请参见详细的发布说明。
Cargo 功能
此周期添加到 Cargo 的最大功能是“工作区”。在 RFC 1525 中定义,工作区允许一组 Rust 包共享同一个 Cargo.lock
文件。如果您的项目被拆分为多个包,这将使保持共享依赖项位于单个版本上变得更加容易。要启用此功能,大多数多包项目需要在其顶层 Cargo.toml
中添加一个键 [workspace]
,但更复杂的设置可能需要更多配置。
另一个重要功能是覆盖 crate 的来源的功能。将其与 cargo-vendor 和 cargo-local-registry 等工具一起使用,可以以可靠的方式在本地打包依赖项。最终,此支持也将成为支持 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
- [email protected]
- 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
- 王学睿
- Wesley Wiser
- William Lee
- Ximin Luo
- Yojan Shrestha
- Yossi Konstantinovsky
- Zack M. Davis
- Zhen Zhang
- 吴冉波