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 中,如果特征的实现与特征声明不匹配,您将看到如下所示的错误。
在新错误格式中,我们通过显示代码中最相关的部分来表示错误。以下是特征声明中的相关行,以及实现中的相关行,使用标签来描述它们不匹配的原因。
最初,这种错误设计是为了帮助理解借用检查错误,但我们发现,与上面的错误一样,这种格式可以广泛应用于各种错误。如果您想了解更多关于设计的信息,请查看关于此主题的先前博客文章。
最后,您还可以使用标志以 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 component add rust-src
使用 rustup 安装。生成的源代码可供工具和 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]
,但更复杂的设置可能需要更多配置。
另一个重要功能是能够覆盖包的来源。使用像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
- 罗希敏
- Yojan Shrestha
- Yossi Konstantinovsky
- Zack M. Davis
- 张震
- 吴冉波