Rust 1.9 发布

2016年5月26日 · Rust 核心团队

Rust 团队很高兴地宣布 Rust 的最新版本 1.9 发布。Rust 是一种专注于安全性、速度和并发性的系统编程语言。

与往常一样,您可以从我们网站上的相应页面安装 Rust 1.9,并在 GitHub 上查看1.9 的详细发布说明。此版本中大约有 1000 个补丁被合并。

1.9 稳定版中的新功能

受控展开

Rust 1.9 中最大的变化是 `std::panic` 模块的稳定化,其中包括用于停止 panic 启动的展开过程的方法。

use std::panic;

let result = panic::catch_unwind(|| {
    println!("hello!");
});
assert!(result.is_ok());

let result = panic::catch_unwind(|| {
    panic!("oh no!");
});
assert!(result.is_err());

这个新的 API 在 RFC 1236 中定义。

一般来说,Rust 区分了操作失败的两种方式

  • 由于预期问题,例如找不到文件。
  • 由于意外问题,例如数组的索引超出范围。

预期问题通常来自您无法控制的条件;健壮的代码应该为环境可能抛出的任何情况做好准备。在 Rust 中,预期问题通过 `Result` 类型处理,该类型允许函数将其问题的信息返回给调用者,然后调用者可以以细粒度的方式处理错误。

意外问题是错误:它们是由于违反了契约或断言而引起的。由于它们是意外的,因此以细粒度的方式处理它们是没有意义的。相反,Rust 采用“快速失败”方法,即panic,默认情况下会展开发现错误的线程的堆栈(运行析构函数,但不运行其他代码)。其他线程继续运行,但只要它们尝试与发生 panic 的线程通信(无论是通过通道还是共享内存),就会发现 panic。因此,panic 会中止执行到某个“隔离边界”,边界另一侧的代码仍然可以运行,并且可能会以非常粗粒度的方式从 panic 中“恢复”。例如,服务器不一定需要仅仅因为它其中一个线程中的断言失败而关闭。

新的 `catch_unwind` API 提供了一种在线程内引入新的隔离边界的方法。有几个关键的动机示例

  • 在其他语言中嵌入 Rust
  • 管理线程的抽象

对于第一种情况,跨语言边界展开是未定义的行为,并且在实践中经常导致段错误。允许捕获 panic 意味着您可以安全地通过 C API 公开 Rust 代码,并将展开转换为 C 端的错误。

对于第二种情况,请考虑一个线程池库。如果池中的线程发生 panic,通常您不希望杀死线程本身,而是捕获 panic 并将其传递给池的客户端。`catch_unwind` API 与 `resume_unwind` 配对,后者可用于在池的客户端上重新启动 panic 过程,这才是它应该存在的地方。

在这两种情况下,您都在线程内引入新的隔离边界,然后将 panic 转换为其他地方的其他形式的错误。

最后一点:为什么是 `catch_unwind` 而不是 `catch_panic`?我们正在添加一种额外的 panic 策略:中止整个进程(可能在运行通用的hook之后)。对于某些应用程序,这是处理程序员错误的最合理方法,并且避免展开可以提高性能并减小代码大小。

弃用警告

我们为库作者引入了一个新的属性:`#[deprecated]`。此属性允许您使用弃用警告标记 API,他们的 crate 的用户每当使用该 API 时都会收到该警告,并将其定向到替换 API。弃用警告长期以来一直是标准库的一部分,但由于 RFC 1270,它们现在可以在整个生态系统中使用。

新目标

我们现在为几个新目标发布标准库二进制文件

  • mips-unknown-linux-musl,
  • mipsel-unknown-linux-musl
  • i586-pc-windows-msvc.

从交叉编译的角度来看,前两个目标特别有趣;有关更多详细信息,请参阅最近关于 `rustup` 的博客文章

编译时改进

在类型统一期间比较变量是否等效的时间复杂度从 O(n!) 降低到 O(n)。因此,某些编程模式的编译速度要快得多。

推出专业化的使用

此版本首次在标准库中使用专业化。专业化目前仅在 nightly 版本中可用,它允许根据更具体的类型信息自动专业化通用代码。

标准库中出现这种情况的一个示例:从字符串切片 (&str) 转换为拥有的 String。一种方法 `to_string` 来自以前相对较慢的通用 API,而自定义的 `to_owned` 实现提供了更好的性能。使用专业化,这两个函数现在是等效的

在我们掌握了这个简单的专业化测试后,我们将在即将发布的版本中推出更多性能改进。

库稳定化

大约 80 个库函数和方法现在在 1.9 中是稳定的。最主要的是前面描述的 `std::panic` 模块,但还有更多

网络

  • TcpStreamTcpListenerUdpSocket 获得了一些用于配置连接的方法。
  • SocketAddr 及其变体获得了 set_ip()set_port() 的便利方法。

集合

  • BTreeSetHashSet 获得了 take()replace()get() 方法,这些方法可以恢复原始键的所有权。
  • OsString 获得了一些方法,使其更接近于 String 的奇偶校验。
  • 切片获得了 copy_from_slice(),这是一种安全的 memcpy 形式。

编码

  • char 获得了解码为 UTF-16 的能力。

指针

  • 原始指针获得了 as_ref()as_mut(),它们返回一个 Option<&T>,将空指针转换为 None
  • ptr::{read,write}_volatile() 允许从原始指针进行易失性读取和写入。

最后,libcore 中的许多类型不包含 Debug 实现。此问题已在 1.9 版本中修复。

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

Cargo 功能

Cargo 有两个主要更改

首先,Cargo 现在可以并发运行

其次,添加了一个新的标志 `RUSTFLAGS`,was added。此标志允许您指定要通过环境变量传递给 `rustc` 的任意标志,例如,这对于打包程序很有用。

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

1.9 的贡献者

我们有 127 位个人为 1.9 做出了贡献。非常感谢你们!

  • Aaron Turon
  • Abhishek Chanda
  • Adolfo Ochagavía
  • Aidan Hobson Sayers
  • Alan Somers
  • Alejandro Wainzinger
  • Aleksey Kladov
  • Alex Burka
  • Alex Crichton
  • Amanieu d'Antras
  • Andrea Canciani
  • Andreas Linz
  • Andrew Cantino
  • Andrew Horton
  • Andrew Paseltiner
  • Andrey Cherkashin
  • Angus Lees
  • Ariel Ben-Yehuda
  • Benjamin Herr
  • Björn Steinbrink
  • Brian Anderson
  • Brian Bowman
  • Christian Wesselhoeft
  • Christopher Serr
  • Corey Farwell
  • Craig M. Brandenburg
  • Cyryl Płotnicki-Chudyk
  • Daniel J Rollins
  • Dave Huseby
  • David AO Lozano
  • David Henningsson
  • Devon Hollowood
  • Dirk Gadsden
  • Doug Goldstein
  • Eduard Burtescu
  • Eduard-Mihai Burtescu
  • Eli Friedman
  • Emanuel Czirai
  • Erick Tryzelaar
  • Evan
  • Felix S. Klock II
  • Florian Berger
  • Geoff Catlin
  • Guillaume Gomez
  • Gökhan Karabulut
  • JP Sugarbroad
  • James Miller
  • Jeffrey Seyfried
  • John Talling
  • Jonas Schievink
  • Jonathan S
  • Jorge Aparicio
  • Joshua Holmer
  • Kai Noda
  • Kamal Marhubi
  • Katze
  • Kevin Brothaler
  • Kevin Butler
  • Manish Goregaokar
  • Markus Westerlind
  • Marvin Löbel
  • Masood Malekghassemi
  • Matt Brubeck
  • Michael Huynh
  • Michael Neumann
  • Michael Woerister
  • Ms2ger
  • NODA, Kai
  • Nathan Kleyn
  • Nick Cameron
  • Niko Matsakis
  • Noah
  • Novotnik, Petr
  • Oliver Middleton
  • Oliver Schneider
  • Philipp Oppermann
  • Piotr Czarnecki
  • Pyfisch
  • Richo Healey
  • Ruud van Asseldonk
  • Scott Olson
  • Sean McArthur
  • Sebastian Wicki
  • Seo Sanghyeon
  • Simon Sapin
  • Simonas Kazlauskas
  • Steve Klabnik
  • Steven Allen
  • Steven Fackler
  • Stu Black
  • Sébastien Marie
  • Tang Chenglong
  • Ted Horst
  • Ticki
  • Tim Montague
  • Tim Neumann
  • Timon Van Overveldt
  • Tobias Bucher
  • Tobias Müller
  • Todd Lucas
  • Tom Tromey
  • Tshepang Lekhonkhobe
  • Ulrik Sverdrup
  • Vadim Petrochenkov
  • Valentin Lorentz
  • Varun Vats
  • Wang Xuerui
  • Wangshan Lu
  • York Xiang
  • arcnmx
  • ashleysommer
  • bors
  • ggomez
  • gohyda
  • ituxbag
  • mitaa
  • nicholasf
  • petevine
  • pierzchalski
  • pravic
  • srinivasreddy
  • tiehuis
  • ubsan
  • vagrant
  • vegai
  • vlastachu
  • Валерий Лашманов