LoginSignup
40
36

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-10-03

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


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

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

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


Rust 1.12.0 のリリースについて

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

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

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

1.12.0 安定版の変更点

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

目に見える一番の変化は、rustc が出力するエラーメッセージの書式が一新されたことでしょう。この書式については、以前公式ブログでも 英語で紹介しましたが、今回のリリースが、それをお披露目する最初の安定版となります。これらのエラーメッセージは、設計やテスト、rustc のエラーを1つずつ新書式へ修正するといった、途方もない ボランティア活動 によって実現に至りました。皆さんからどのような反応がいただけるか、楽しみにしています。

借用チェッカーの新しいエラーメッセージ

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

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

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

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

古い形式のトレイト不一致エラー

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

新しい形式の形式のトレイト不一致エラー

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

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

$ 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 は、Rust が使用しているオープンソースのコンパイラ・バックエンドであり、LLVM IR はその入力形式です。数ヶ月に渡る作業を通して、ついに、MIR ベースのバックエンドが、本番利用に耐えうるレベルまで熟成されました。

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

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

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

その他の改良

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

TODO

See the detailed release notes for more.

ライブラリの安定化

TODO

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

Cargo の機能

TODO

40
36
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
40
36