Rust 1.12 发布

2016年9月29日 · Rust 核心团队

Rust 团队很高兴地宣布 Rust 的最新版本 1.12 发布。Rust 是一门系统编程语言,其口号是“快速、可靠、高效:三者选其三”。

像往常一样,您可以从我们网站上的相应页面安装 Rust 1.12,并在 GitHub 上查看1.12 的详细发布说明。此版本中包含了 1361 个补丁。

1.12 稳定版的新功能

1.12 的发布可能是自 1.0 以来最重要的 Rust 版本之一。我们有很多内容要介绍,但如果您没有时间,这里有一个摘要:

1.12 稳定版中最大的用户可见的更改是 rustc 发出的新错误消息格式。我们之前讨论过这种格式,这是它们广泛可用的第一个稳定版本。这些错误消息是许多志愿者花费大量时间设计、测试和更新 rustc 的每个错误到新格式的结果。我们很高兴看到您对它们的看法。

A new borrow-check error

此版本中最大的内部更改是迁移到基于新的 Rust MIR 的新编译器后端。虽然此功能今天不会产生任何用户可见的结果,但它为未来的许多编译器优化铺平了道路,并且对于某些代码库,它已经带来了编译时间的改进和代码大小的减少。

改进的错误消息

在 1.12 中,我们引入了一种新的错误格式,该格式有助于向您(开发人员)展示有关错误发生原因的许多内部知识。它通过将您的代码放在最前面和中心位置来实现这一点,并使用描述错误原因的注释突出显示与错误相关的部分。

例如,在 1.11 中,如果 trait 的实现与 trait 声明不匹配,您将看到如下错误:

An old mismatched trait error

在新的错误格式中,我们通过显示代码中最重要的点来表示错误。以下是 trait 声明中的相关行以及实现中的相关行,使用标签来描述它们不匹配的原因:

A new mismatched trait error

最初,此错误设计旨在帮助理解借用检查错误,但我们发现,与上面的错误一样,该格式可以广泛应用于各种错误。如果您想了解更多有关设计的信息,请查看之前关于该主题的博客文章

最后,您还可以使用标志以 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 更简单的“语言”,因此也更容易在其上实现编译器过程,并且更容易验证它们是否正确。

其他改进

有关更多信息,请参见详细的发布说明

库的稳定化

此版本针对标准库中的各种类型进行了一些小的生活质量改进:

有关更多信息,请参见详细的发布说明

Cargo 功能

此周期添加到 Cargo 的最大功能是“工作区”。在 RFC 1525 中定义,工作区允许一组 Rust 包共享同一个 Cargo.lock 文件。如果您的项目被拆分为多个包,这将使保持共享依赖项位于单个版本上变得更加容易。要启用此功能,大多数多包项目需要在其顶层 Cargo.toml 中添加一个键 [workspace],但更复杂的设置可能需要更多配置。

另一个重要功能是覆盖 crate 的来源的功能。将其与 cargo-vendorcargo-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
  • 吴冉波