Rust 1.10 がリリースされました

Rust 1.10 が 2016年7月8日（日本時間）にリリースされました。Rust は、安全性、スピード、並列プログラミングにフォーカスした、システムプログラミング向けの言語です。

- オフィシャルブログの [リリースアナウンス](http://blog.rust-lang.org/2016/07/07/Rust-1.10.html)
- [リリースノート](https://github.com/rust-lang/rust/blob/master/RELEASES.md#version-1100-2016-07-07)（GitHubリリースページ）
- Rust の [ダウンロードページ](https://www.rust-lang.org/downloads.html)

また同時に、次のバージョン 1.11 がベータ版になりました。1.11 のリリース予定日は、６週間後の2016年8月19日（日本時間）です。

もしこれから Rust を始めるのなら、オフィシャルガイドの [日本語翻訳版](https://rust-lang-ja.github.io/the-rust-programming-language-ja/1.6/book/) を読むのがいいでしょう。また、「Rust by Example」の [日本語翻訳](http://rust-lang-ja.org/rust-by-example/) 作業も現在進行中で、翻訳の [協力者を募集中](https://github.com/rust-lang-ja/rust-by-example-ja/blob/master/CONTRIBUTING.md) です。

リリースアナウンスに書かれている内容から、主なものを紹介します。（この記事は翻訳ではなく、リリースアナウンスをベースに大幅に加筆修正したものです）


## 1.10 安定版の内容

### panic abort フラグの追加

Rust 1.10 では特に要望が多かった機能の一つが実現されました。[`-C panic=abort` フラグ](https://github.com/rust-lang/rust/pull/32900) や [`Cargo.toml` の設定](https://github.com/rust-lang/cargo/pull/2687) を通して、`panic!` 時にアンワインド(unwind、コールスタックの巻き戻し) させる代わりに、単にアボート(abort) させることが可能になりました。この機能は [RFC 1513](https://github.com/rust-lang/rfcs/blob/master/text/1513-less-unwinding.md) で定義されました。

アボートを選択すると、main スレッドが panic した時だけでなく、他のスレッドが panic した時もプログラム全体がアボートされます。panic は想定外の問題を意味しますので、一部のアプリケーションではこのような動作を望むでしょう。また、コンパイラが生成するコードの量が減りますので、わずかではありますが、コンパイル時間の短縮やバイナリの小型化なども期待できます。


### 他言語向けの動的ライブラリに最適な `cdylib`

1.10 では新しいクレートタイプとして [cdylib](https://github.com/rust-lang/rust/pull/33553) が加わりました。cdylib は他言語から呼び出すのに最適な形式の動的ライブラリを作成します。この機能は [RFC 1510](https://github.com/rust-lang/rfcs/blob/master/text/1510-rdylib.md) で定義されました。

いままでは動的ライブラリを作成するために dylib が使われてきました。しかし dylib は Rust コンパイラのプラグインにも使われる形式で、他言語から使うには無駄な情報が多く含まれます。今後は、ほとんどの動的ライブラリで、cdylib 形式が採用されるでしょう。

なお、RFC 1510 によると、元々は現在の dylib を rdylib として提供し、dylib から不要な情報をそぎ落とす計画でしたが、後方互換性を維持できなくなるため断念したそうです。議論の結果、dylib は従来のまま変更せず、新たに cdylib が追加されることになりました。


### その他の改良

リリースノートの [Performance セクション](https://github.com/rust-lang/rust/blob/master/RELEASES.md#performance) に書かれているように、コンパイラやライブラリにいくつかの性能上の改良が施されました。

- **コンパイラ**
  * `rustc` において型チェック時のメモリ使用量を削減（[#33425](https://github.com/rust-lang/rust/pull/33425)）
  * トレイト選択処理に最適化を施し、型チェック処理が約15%高速化（[#33138](https://github.com/rust-lang/rust/pull/33138)）
  * `#[derive(Copy, Clone)]` 指定時、可能ならコード生成量を削減（[#31414](https://github.com/rust-lang/rust/pull/31414)）
- **ライブラリ**
  * HashMap の作成を高速化。ハッシュステートの初期化に使用した乱数キーをキャッシュすることにより実現（[#33118](https://github.com/rust-lang/rust/pull/33318)）
  * Chain イテレータに専用の `find()` を実装したことにより、従来のイテレータの `find()` 実装を継承した場合と比較して、約２倍の高速化を実現（[#33289](https://github.com/rust-lang/rust/pull/33289)）
  * Unicode コードポイントのルックアップを、従来のバイナリーサーチからトライ(trie)木へ変更。約10倍の高速化を実現（[#33098](https://github.com/rust-lang/rust/pull/33098)）

また、[Usability セクション](https://github.com/rust-lang/rust/blob/master/RELEASES.md#usability) にあるように、ドキュメントや `rustdoc` 自体の使い勝手の向上や、エラーメッセージの改良なども行われました。


### スナップショット・コンパイラを廃止し、Linux ディストリビュータによる Rust パッケージの作成を推進

Rust のコンパイラは Rust 自身で書かれていますので、コンパイラをソースコードからビルドするには、それをコンパイルするためのコンパイラ・バイナリが必要です。また従来は安定版のコンパイラが使用できず、非安定な nightly ビルド版のコンパイラ・バイナリが必要でした。そのため、Rust のビルド処理では、Rust プロジェクトが用意した nightly 版コンパイラのバイナリ・スナップショットを自動的にダウンロードする仕組みになっていました。

このことは、Linux のディストリビュータが Rust のパッケージを作成する際の障害となっていました。一般的にディストリビュータは、信頼できない他者が用意したバイナリではなく、自身のパッケージ管理システムの管理下にある Rust パッケージを使うことを望みます。

この障害を取り除くために、Rust のビルド方式が [変更されました](https://github.com/rust-lang/rust/pull/32942) 。Rust 1.10 では、スナップショット・コンパイラ・バイナリによるビルドを廃止し、安定版のコンパイラ・バイナリからビルドできるようになりました。つまり、ディストリビュータは、自分のパッケージ管理システムにある現バージョンの Rust パッケージ（例：1.9）を使って、次のバージョンの Rust（例：1.10）パッケージを、ソースコードから作成できます。


### ライブラリの安定化

このリリースでは、約70の API が安定化されました。

* Windows 特有のファイル操作を可能にする [`std::os::windows::fs::OpenOptionsExt`](https://github.com/rust-lang/rfcs/pull/1252)
* [panic フックの登録と解除を可能にする](https://github.com/rust-lang/rfcs/pull/1328) `std::panic::{set,take}_hook`
* バイト・スライスから `CStr` を作成する [`CStr::from_bytes_with_nul`](http://doc.rust-lang.org/std/ffi/struct.CStr.html#method.from_bytes_with_nul)（と、[それのチェック省略版](http://doc.rust-lang.org/std/ffi/struct.CStr.html#method.from_bytes_with_nul_unchecked)）
* [`std::fs::Metadata`](http://doc.rust-lang.org/std/fs/struct.Metadata.html) に対する小さな改良
* [`Atomic*` 型に `compare_exchange()` を追加](https://github.com/rust-lang/rfcs/pull/1443)
* `std::os::unix::net::{UnixStream, UnixListener, UnixDatagram, SocketAddr}` による [UNIX 特有のネットワーク機能のサポート](https://github.com/rust-lang/rfcs/pull/1479)

さらに、次の型に対する `Default` 実装の追加：`&CStr`、`CString`、`UnsafeCell`、`fmt::Error`、`Condvar`、`Mutex`、`RwLock`

Linux で HashMap が `getrandom` で初期化できなかった場合に、[一時的に `/dev/urandom` へフォールバック](https://github.com/rust-lang/rust/pull/33086) するようになりました。これにより、初期化時の一時的なフリーズを回避できます。

詳しくは、[詳細なリリースノート](https://github.com/rust-lang/rust/blob/master/RELEASES.md#version-1100-2016-07-07) をご覧ください。


### Cargo の機能

Cargo にも改良が加えられました。

* 前述の panic abort を指定するために [`profile.*.panic`](https://github.com/rust-lang/cargo/pull/2687) が追加されました
* Cargo が [状態を stdout ではなく、stderr へ報告するようになりました](https://github.com/rust-lang/cargo/pull/2693).
* Rust の言語キーワードを [クレート名から弾く](https://github.com/rust-lang/cargo/pull/2707) ようになりました。
* `cargo install` に [`--force` フラグ](https://github.com/rust-lang/cargo/pull/2405) が追加されました。
* `cargo test` にドキュメント・テストだけを行う [`--doc` フラグ](https://github.com/rust-lang/cargo/pull/2578) が追加されました。
* `rustc --explain` を呼び出す [`cargo --explain` が追加されました](https://github.com/rust-lang/cargo/pull/2551)

詳しくは、[詳細なリリースノート](https://github.com/rust-lang/rust/blob/master/RELEASES.md#version-1100-2016-07-07) をご覧ください。