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 策略:中止整个进程(可能是在运行一个通用的钩子之后)。对于某些应用程序,这是处理程序员错误的最合理方式,避免展开可以带来性能和代码大小方面的优势。

弃用警告

我们为库作者引入了一个新的属性:#[deprecated]。此属性允许您为 API 添加弃用警告,当用户使用该 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,该 API 以前相对较慢,而自定义 to_owned 实现提供了更好的性能。使用特化,这两个函数现在等效

有了对特化的简单测试,我们将在即将发布的版本中带来更多性能改进。

库稳定化

1.9 中大约有 80 个库函数和方法现在是稳定的。最主要的是前面描述的 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 此标志允许您通过环境变量指定要传递给 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
  • Валерий Лашманов