发布 Rust 1.14

2016 年 12 月 22 日 · Rust 核心团队

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

和往常一样,你可以从我们网站的相应页面安装 Rust 1.14.0,并在 GitHub 上查看 1.14.0 的详细发布说明。此版本共合入了 1230 个补丁。

1.14.0 稳定版有什么?

Rust 1.14 中最大的特性之一实际上不在语言或编译器本身:rustup 工具已经达到了 1.0 版本,现在是直接从项目官方安装 Rust 的推荐方式。rustup 不仅仅是安装 Rust

rustup 从官方发布渠道安装 Rust 编程语言,使你可以轻松地在 stable(稳定版)、beta(测试版)和 nightly(每夜构建版)编译器之间切换,并保持它们更新。它通过为常见平台提供标准库的二进制构建,简化了交叉编译。而且它运行在所有 Rust 支持的平台上,包括 Windows。

我们在五月份曾发表过一篇关于 Rustup 的文章。你可以在那里了解更多信息,或者在 GitHub 上查看它

另一个令人兴奋的特性是实验性地支持将 WebAssembly 作为目标平台,即 wasm32-unknown-emscripten。目前还处于早期阶段,有很多 Bug 需要解决,所以请尝试使用并报告它们!为了让你初步了解它是如何工作的,安装 emscripten 后,将 Rust 代码编译到 WebAssembly 就像这样简单

$ rustup target add wasm32-unknown-emscripten
$ echo 'fn main() { println!("Hello, Emscripten!"); }' > hello.rs
$ rustc --target=wasm32-unknown-emscripten hello.rs
$ node hello.js

社区一直在这一领域进行有趣、实验性的工作:可以看看 Jan-Erik 的幻灯片,了解他在 Rust Belt Rust 大会上举办的研讨会的一些示例,或者查看 Tim 关于经典 TodoMVC 项目的示例。这个实现基于他的 webplatform crate,它将 DOM 暴露给 Rust。

说到平台,大量平台获得了额外的支持

对于 rustc

  • mips-unknown-linux-gnu
  • mipsel-unknown-linux-gnu
  • mips64-unknown-linux-gnuabi64
  • mips64el-unknown-linux-gnuabi64
  • powerpc-unknown-linux-gnu
  • powerpc64-unknown-linux-gnu
  • powerpc64le-unknown-linux-gnu
  • s390x-unknown-linux-gnu

对于 std

  • arm-unknown-linux-musleabi
  • arm-unknown-linux-musleabihf
  • armv7-unknown-linux-musleabihf

如果你正在使用这些平台之一,请按照网站上的说明安装,或者使用 rustup target add 命令将目标添加到现有安装中。

这些平台都属于“二级(tier 2)”支持,请查看我们的平台支持页面了解更多详情。

正如社区正在进行有关 WebAssembly 目标的有趣工作一样,在扩展 Rust 对上述列表之外目标的支持方面也有很棒的进展。xargo 允许轻松地将 Rust 交叉编译到裸机(bare-metal)目标。如果你正在用 Rust 编写操作系统,或者在微控制器上做一些有趣的事情,xargo 可以让你的工作轻松很多。

MIR 在过去几个版本中的落地意味着编译时间获得了一些改进,未来还会更多。

在语言方面,一个小改进已经落地:支持 RFC 1492。这个小小的补充允许你在更多地方使用 ..。以前,假设你有一个这样的结构体

struct Point {
    x: i32,
    y: i32,
    z: i32,
}

在进行模式匹配的任何上下文中,你可以使用 .. 来忽略你不关心的部分。例如

let p = Point { x: 0, y: 1, z: 2 };

match p {
    Point { x, .. } => println!("x is {}", x),
}

.. 忽略了 yz

考虑一个类似的 Point,但作为一个元组结构体(tuple struct)

struct Point(i32, i32, i32);

以前,你可以使用 .. 忽略所有三个元素

let p = Point(0, 1, 2);

match p {
    Point(..) => println!("found a point"),
}

但你不能只忽略元组(tuple)的一部分

let p = Point(0, 1, 2);

match p {
    Point(x, ..) => println!("x is {}", x),
}

这是一个不一致的地方,因此随着 RFC 1492 的稳定化,从本版本开始,代码可以正常编译。这适用于比元组(tuple)更多的场景;请参阅 RFC 了解更多详情。

标准库稳定化

标准库中增加了一些功能,但在本版本中它们没有明确的分类。以下是重点内容

查看详细发布说明了解更多信息。

Cargo 特性

至于 Cargo,RFC 1721 已得到实现。Cargo 现在会将 rustc --print cfg 打印的值传递给构建脚本。此特性的动机是,Cargo 现在可以在 MSVC 平台上编译用于静态链接 msvcrt 的目标文件。

Cargo 现在可以正确处理只读的 CARGO_HOME

最后,Cargo 将忽略 testbench 配置文件的 panic 配置。这很重要,因为测试运行器依赖于将 panic 视为失败的测试,所以如果设置了 panic=abort,一个失败的测试会导致整个测试套件中止。

查看详细发布说明了解更多信息。

1.14.0 贡献者

共有 144 位个人为 1.14.0 做出了贡献。非常感谢你们!

  • Abhishek Chanda
  • Adam Perry
  • Ahmed Charles
  • Aidan Hobson Sayers
  • Aleksey Kladov
  • Alexander von Gluck IV
  • Alex Burka
  • Alex Crichton
  • Alex von Gluck IV
  • Amanieu d'Antras
  • Andrea Corradi
  • Andrea Pretto
  • Andreas Sommer
  • Andre Bogus
  • Andrew Paseltiner
  • angelsl
  • Anthony Ramine
  • Ariel Ben-Yehuda
  • arthurprs
  • Austin Hicks
  • bors
  • Brian Anderson
  • Bunts Thy Unholy
  • CensoredUsername
  • Chris McDonald
  • Christopher
  • christopherdumas
  • Christopher Serr
  • Cobrand
  • Corey Farwell
  • Cristi Cobzarenco
  • Daan Sprenkels
  • Danny Hua
  • David Henningsson
  • Devon Hollowood
  • Dmitry Gritsay
  • Dominik Inführ
  • Duncan
  • Eduard Burtescu
  • Eduard-Mihai Burtescu
  • Eric Roshan-Eisner
  • est31
  • Fabian Frei
  • Federico Mena Quintero
  • Felix S. Klock II
  • Florian Diebold
  • Florian Hartwig
  • Florian Zeitz
  • Frank Rehberger
  • Gavin Baker
  • Geoffry Song
  • Guillaume Gomez
  • iirelu
  • James Miller
  • Jan-Erik Rediger
  • Jared Roesch
  • Jeffrey Seyfried
  • Jesus Garlea
  • Jethro Beekman
  • Joe Neeman
  • Johannes Muenzel
  • John Firebaugh
  • John Hodge
  • johnthagen
  • Jonas Schievink
  • Jonathan Turner
  • Jorge Aparicio
  • Josh Stone
  • Josh Triplett
  • Keegan McAllister
  • Keith Yeung
  • KillTheMule
  • Konrad Borowski
  • leonardo.yvens
  • Liigo Zhuang
  • loggerhead
  • Manish Goregaokar
  • Marcin Fatyga
  • Mark-Simulacrum
  • Martin Glagla
  • Martin Thoresen
  • Mathieu Borderé
  • Mathieu Poumeyrol
  • Matt Brubeck
  • Matthew Piziak
  • Matwey V. Kornilov
  • mcarton
  • Michael Woerister
  • Mikhail Modin
  • Mikko Rantanen
  • msiglreith
  • Nabeel Omer
  • Nathan Musoke
  • Nicholas Nethercote
  • Nick Cameron
  • Nick Fitzgerald
  • Nick Stevens
  • Nikhil Shagrithaya
  • Niko Matsakis
  • Oliver Middleton
  • p512
  • ParkHanbum
  • Paul Lange
  • Paulo Matos
  • Paul Osborne
  • Peter Atashian
  • Peter N
  • Philip Davis
  • Pieter Frenssen
  • Pweaver (Paul Weaver)
  • pweyck
  • QuietMisdreavus
  • Raph Levien
  • Razican
  • Robin Stocker
  • Ross Schulman
  • Ryan Senior
  • Scott Olson
  • Seo Sanghyeon
  • Simonas Kazlauskas
  • Simon Sapin
  • Srinivas Reddy Thatiparthy
  • Stefan Schindler
  • Stephen M. Coakley
  • Steve Klabnik
  • Steven Fackler
  • Tamir Duberstein
  • Taylor Cramer
  • Tim Neumann
  • Tobias Bucher
  • Tomasz Miąsko
  • tormol
  • Tshepang Lekhonkhobe
  • Ulrik Sverdrup
  • Vadim Chugunov
  • Vadim Petrochenkov
  • Vadzim Dambrouski
  • Vangelis Katsikaros
  • Wang Xuerui
  • Wesley Wiser
  • Zack M. Davis
  • Zoffix Znet
  • Артём Павлов [Artyom Pavlov]
  • 石博文