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

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

* * *
**2016年10月21日追記**：
本日 Rust 1.12.1 がリリースされました。主に 1.12.0 で見つかった MIR 関連の不具合の対応がされているようです。

- https://blog.rust-lang.org/2016/10/20/Rust-1.12.1.html

上のリリースアナウンスにも書かれていますが、Rust には６週間のベータ期間が用意されていますので、CI の際に、安定版だけでなく、ベータ版も使ってテストすることをおすすめします。

**2016年10月4日追記**：
「刷新されたエラーメッセージ」と「MIR コード生成」の節を追加しました）
* * *

Rust 1.12.0 のリリースについて

- オフィシャルブログの [リリースアナウンス](https://blog.rust-lang.org/2016/09/29/Rust-1.12.html)
- [リリースノート][notes]（GitHubリリースページ）
- Rust の [ダウンロードページ](https://www.rust-lang.org/downloads.html)

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

これから Rust を始める人には、以下の日本語翻訳版のドキュメントをおすすめします。

- [プログラミング言語 Rust 1.6](https://rust-lang-ja.github.io/the-rust-programming-language-ja/1.6/book/)
  * オフィシャルガイド [The Rust Programming Language](https://doc.rust-lang.org/book/) の日本語翻訳版
- [Rust by Example 日本語版](http://rust-lang-ja.org/rust-by-example/)
  * [Rust by Example](http://rustbyexample.com/) の日本語翻訳版

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

[notes]: https://github.com/rust-lang/rust/blob/master/RELEASES.md#version-1120-2016-09-29

### 1.12.0 安定版の変更点

この 1.12.0 リリースは、恐らく、1.0 のリリース以来、最大のものになるでしょう。まずはそのハイライトを紹介します。

目に見える一番の変化は、`rustc` が出力するエラーメッセージの書式が一新されたことでしょう。この書式については、以前公式ブログでも [英語で紹介しましたが](https://blog.rust-lang.org/2016/08/10/Shape-of-errors-to-come.html)、今回のリリースが、それをお披露目する最初の安定版となります。これらのエラーメッセージは、設計やテスト、`rustc` のエラーを１つずつ新書式へ修正するといった、途方もない [ボランティア活動](https://github.com/rust-lang/rust/issues/35233) によって実現に至りました。皆さんからどのような反応がいただけるか、楽しみにしています。

![借用チェッカーの新しいエラーメッセージ](https://blog.rust-lang.org/images/2016-09-Rust-1.12/borrowck-error.png)

内部的な変更のなかで最大のものは、新しい Rust [MIR](https://blog.rust-lang.org/2016/04/19/MIR.html) に基づく、新たなコンパイラ・バックエンドの導入です。今のところ表面上は、ほとんど変化は感じられないと思いますが、この変更は、今後開発を予定している様々なコンパイラ最適化への道を開く、重要なものでした。また、すでに一部のコードベースでは、コンパイル時間の短縮やバイナリサイズの縮小といった効果が現れているようです。


#### 刷新されたエラーメッセージ

1.12.0 ではエラーメッセージの書式が刷新され、エラー原因の理解に役立つコンパイラ内部の情報が、従来よりも詳細に表示されるようになりました。新書式では、あなたのコード自体が話題の中心となり、エラーに関する部分がハイライト表示されると共に、なにが問題なのか注釈として表示されます。

例をあげましょう。トレイトを実装(`impl`) する際に、トレイトの定義と合わなかった場合、1.11 ならこう表示されます。

![古い形式のトレイト不一致エラー](https://blog.rust-lang.org/images/2016-09-Rust-1.12/old-mismatched-trait-error.png)

新書式では、問題の核心となる部分のコードが表示されます。この例では、関連するトレイトの定義と問題となってる実装が対になって表示され、なにが一致しないのかが一目瞭然です。

![新しい形式の形式のトレイト不一致エラー](https://blog.rust-lang.org/images/2016-09-Rust-1.12/mismatched-trait-error.png)

当初、この新書式は、借用チェッカーに関するエラーの理解を助けるために設計されました。しかし私たちは、上の例のように、この書式が幅広い種類のエラーに対して適用できることに気付きました。もし設計について興味があるなら、[過去の公式ブログの記事][err] をご覧ください。

[err]: https://blog.rust-lang.org/2016/08/10/Shape-of-errors-to-come.html

最後に、フラグを指定することで、エラーを JSON 形式で得ることもできます。最初にお見せしたエラーですが、同じコードを `--error-format=json` 付きでコンパイルするとこうなります。

```bash
$ 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 や開発に使うツールにおいて Rust のサポートを向上するための努力を続けていますが、この出力は、そういった努力のごく一部です。


#### MIR コード生成

ソースコードを機械語などへコンパイルする際、多くのコンパイラは、ソースコードを中間的な表現に変換します。これを Intermediate Representation、または IR と呼びます。「MIR」とは Rust に加わった、中間レベルの IR (Mid-level IR) を指します。従来の `rustc` は、IR として唯一の「Rust 抽象構文木」を全体で使っていましたが、今回、MIR を加えたことで、コンパイラ内部の処理が整理されました。これにより、コンパイラが行う解析と最適化の中で、従来は正しく実装することが困難だったものも、今後、実現できる道が開けました。

MIR 導入後の最初の作業は、`rustc` で「翻訳」と呼ばれる、「LLVM IR を生成する工程」を書き直すことでした。[LLVM](http://llvm.org/) は、Rust が使用しているオープンソースのコンパイラ・バックエンドであり、LLVM IR はその入力形式です。数ヶ月に渡る作業を通して、ついに、MIR ベースのバックエンドが、本番利用に耐えうるレベルまで熟成されました。

MIR ではプログラムの制御フローに関する情報を完全に表現できますので、コンパイラは個々の値がムーブされたかを正確に把握できます。これにより、コンパイラによる静的分析だけで、デストラクタを実行するタイミングが、従来よりもきめ細やかに決定できます。

また、スコープの終端までに値がムーブされたかどうかを、コンパイラはスタック上のビットフラグ１つで表現できるようになりました。これにより、最適化に役立つ情報を LLVM へ渡す処理もシンプルになりました。結果として、コンパイラの作業がより少なくなり、同時に、生成されるバイナリが小さくなる可能性ができました。

MIR は AST（抽象構文木）よりもシンプルな「言語」ですので、コンパイラの各工程も、より簡単に実装できるようになり、さらには、その正確性の検証も、従来より楽になります。

#### その他の改良

（これ以降は後日公開する予定です。Qiita でストックされた方には、完成後、通知いたします。遅くなっていてすみません）

**TODO**

* Many minor improvements to the documentation.
* [`rustc` supports three new MUSL targets on ARM:
  `arm-unknown-linux-musleabi`, `arm-unknown-linux-musleabihf`, and
`armv7-unknown-linux-musleabihf`](https://github.com/rust-lang/rust/pull/35060).
  These targets produce statically-linked binaries. There are no binary release
  builds yet though.
* In error descriptions,
  [references](https://github.com/rust-lang/rust/pull/35611) and [unknown numeric
  types](https://github.com/rust-lang/rust/pull/35080) have more human-friendly errors.
* [The compiler can now be built against LLVM 3.9](https://github.com/rust-lang/rust/pull/35594)
* [Test binaries now support a `--test-threads` argument to specify the number
  of threads used to run tests, and which acts the same as the
  `RUST_TEST_THREADS` environment variable](https://github.com/rust-lang/rust/pull/35414)
* [The test runner now emits a warning when tests run over 60
  seconds](https://github.com/rust-lang/rust/pull/35405)
* [Rust releases now come with source packages that can be installed by rustup
  via `rustup component add
rust-src`](https://github.com/rust-lang/rust/pull/34366).
  The resulting source code can be used by tools and IDES, located in the
  sysroot under `lib/rustlib/src`.

See the [detailed release notes](https://github.com/rust-lang/rust/blob/master/RELEASES.md#version-1120-2016-09-29) for more.


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

**TODO**

This release sees a number of small quality of life improvements for various
types in the standard library:

* [`Cell::as_ptr`](https://doc.rust-lang.org/std/cell/struct.Cell.html#method.as_ptr)
  and
  [`RefCell::as_ptr`](https://doc.rust-lang.org/std/cell/struct.RefCell.html#method.as_ptr)
* `IpAddr`, `Ivp4Addr`, and `Ipv6Addr` have a few new methods.
* [`LinkedList`](https://doc.rust-lang.org/std/collections/linked_list/struct.LinkedList.html#method.contains)
  and
  [`VecDeque`](https://doc.rust-lang.org/std/collections/vec_deque/struct.VecDeque.html#method.contains)
  have a new `contains` method.
* [`iter::Product`](https://doc.rust-lang.org/std/iter/trait.Product.html) and
  [`iter::Sum`](https://doc.rust-lang.org/std/iter/trait.Sum.html)
* [`Option` implements `From` for its contained type](https://github.com/rust-lang/rust/pull/34828)
* [`Cell`, `RefCell` and `UnsafeCell` implement `From` for their contained type](https://github.com/rust-lang/rust/pull/35392)
* [`Cow<str>` implements `FromIterator` for `char`, `&str` and `String`](https://github.com/rust-lang/rust/pull/35064)
* [Sockets on Linux are correctly closed in subprocesses via `SOCK_CLOEXEC`](https://github.com/rust-lang/rust/pull/34946)
* [`String` implements `AddAssign`](https://github.com/rust-lang/rust/pull/34890)
* [Unicode definitions have been updated to 9.0](https://github.com/rust-lang/rust/pull/34599)


#### Cargo の機能

**TODO**