发布 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 称之为“翻译”)的 pass 的重写,经过几个月的努力,基于 MIR 的后端已经证明自己已准备好投入使用。

MIR 暴露了关于程序控制流的完整信息,因此编译器能精确地知道类型是否被移动。这意味着它静态地知道值是否需要运行析构函数。在值可能在作用域结束时被移动或不被移动的情况下,编译器现在只需在栈上使用一个单比特标志,这反过来更容易让 LLVM 中的优化 pass 进行推断。最终结果是编译器的工作量减少,运行时膨胀也减少。此外,由于 MIR 比完整的 AST 更简单,也更容易在其上实现编译器 pass,并且更容易验证它们的正确性。

其他改进

更多内容请参阅详细发布说明

库稳定化

此版本对标准库中的各种类型进行了一些提升使用体验的小改进

更多内容请参阅详细发布说明

Cargo 特性

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

另一个重要特性是能够覆盖 crate 的来源。结合 cargo-vendorcargo-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
  • 吴冉波