宣布 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 中,如果特征的实现与特征声明不匹配,您将看到如下所示的错误。

An old mismatched trait error

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

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],但更复杂的设置可能需要更多配置。

另一个重要功能是能够覆盖包的来源。使用像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
  • 罗希敏
  • Yojan Shrestha
  • Yossi Konstantinovsky
  • Zack M. Davis
  • 张震
  • 吴冉波