Rust 1.12の新しいバージョンをご紹介します。 Rustは、メモリ、速度、およびコードの並列実行による安全な作業を目的としたシステムプログラミング言語です。
通常どおり、公式Webサイトの対応するページからRust 1.12をインストールできます。また、GitHubでこのバージョンの変更点の詳細なリストを確認できます。 このリリースには1361個のパッチが含まれています。
安定バージョン1.12に含まれるもの
リリース1.12は、おそらくリリース1.0以降で最も重要です。 伝えたいことがありますが、時間が足りない場合は、ここに簡単な要約があります。
1.12のユーザーにとって最も顕著な変更は、 rustc
によってrustc
れた新しいエラー形式です。 以前にそれについて話しましたが、これは誰もが新しい形式を利用できる最初の安定版リリースです。 これらのエラーメッセージは、各rustc
エラーを新しい形式で設計、テスト、および更新したボランティアの多くの努力の結果です。 私たちはあなたが新しいバグについてどう思うか知りたいです:

最大の内部変更は、Rust MIR ( Eng。Medium Intermediate Representation)に基づいた新しいバックエンドコンパイラの使用への切り替えです。 現在、この機能はユーザーに表示されるものを提供していませんが、いくつかの将来のコンパイラー最適化への道を開いており、一部のコードベースでは、コンパイル速度の向上と生成コードのサイズの縮小をすでに提供しています。
再設計されたエラーメッセージ
1.12では、エラーメッセージの新しい形式を導入しています。 コンパイラーがコードのコンパイルを拒否する理由を詳述します。 これを行うために、コードにスポットライトを当て、それぞれの場合に重要な部分を強調表示します。 また、すべての間違った場所に注釈を付け、何が間違っていたかを詳細に説明します。
たとえば、タイプの実装が1.11の宣言と一致しなかった場合、次のエラーが表示されます。

新しい形式では、主にコードの最も重要な部分を示しています。 この場合、型宣言の行、その定義の行、および不一致を示すラベルです。

最初に、このタイプのエラーを設計して、ボローアナライザーが報告した問題(ボローボローアー)を理解できるようにしました。 しかし、途中で、この形式は多くの異なるエラーに適用できることに気付きました-たとえば、上記の例のように。 新しいエラーシステムの詳細については、このトピックに関する以前のブログ投稿を参照してください。
最後に、フラグを使用してJSONでこれらのエラーを取得することもできます。 投稿の冒頭で示した間違いを覚えていますか? そのコードをコンパイルしようとすると、フラグ--error-format=json
。
$ rustc borrowck-assign-comp.rs --error-format=json {"message":"cannot assign to `px` 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 `px` occurs here","suggested_replacement":null,"expansion":null}],"label":"assignment to borrowed `px` 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およびその他の便利な開発者ツールのサポートに引き続き取り組んでいます。 このタイプのエラー出力は、この作業のほんの一部です。
MIRを介したコード生成
通常「MIR」と呼ばれる新しい中間レベルのIR中間表現により、コンパイラはRustコードを以前よりも簡単に処理できるようになります。これは、抽象Rust構文ツリーを処理したときのものです。 MIRにより、以前は不可能と考えられていた検証と最適化が可能になります。 MIRのおかげで利用可能になった最初のコンパイラの変更は、LLVM IRを生成したパッセージ( rustc
が「翻訳」と呼ぶもの)をrustc
ことrustc
。 何ヶ月もの作業を経て、MIRバックエンドはついに大きな舞台で演奏する準備が整いました。
MIRにはプログラムの制御フローに関する正確な情報が含まれているため、コンパイラーは型が移動されたかどうかを確実に把握できます。 これは、値デストラクタを実行するかどうかを静的に知っていることを意味します。 ブロックの最後で値を移動できる場合と移動できない場合、コンパイラーはスタック上の1ビットのみのフラグを使用します。LLVMで最適化する方がはるかに優れています。 最終結果は、コンパイラーの作業が減り、実行時の肥大化したコードが少なくなります。 また、MIRでは新しいコンパイラパスを実装し、それらが正しく機能することを確認するのが簡単です。これは、MIRが完全なASTよりも単純な「言語」だからです。
その他の改善
詳細については、 リリースノートを参照してください。
ライブラリの安定化
このリリースでは、多くのタイプがもう少し使いやすくなりました。
詳細については、 リリースノートを参照してください。
貨物の特徴
このシリーズでCargoに追加された最も興味深い機能は、「 ワークスペース 」です。 これらはRFC 1525で定義されており、パッケージのグループが同じCargo.lock
ファイルを共有できるようにします。 複数のパッケージに分割されているプロジェクトに関与している場合、ワークスペースにより、共通の依存関係の単一バージョンの修正が大幅に簡素化されます。 ほとんどのプロジェクトでは、この機能を有効にするには、 Cargo.toml
先頭行[workspace]
1行追加する必要があり[workspace]
。 より複雑なプロジェクトでは、より複雑なセットアップが必要になる場合があります。
もう1つの重要な機会は、コンテナのソースコードへのパスをオーバーロードすることです。 それをcargo-vendorやcargo-local-registryなどのツールと組み合わせて使用すると、依存関係をローカルに簡単に配布(ベンダー化)できます 。 時間の経過とともに、これに基づいてcrates.ioミラーインフラストラクチャが構築されます。
いくつかのマイナーな改善がまだあります:
詳細については、 リリースノートを参照してください。
開発者バージョン1.12
バージョン1.12のリリースには176人が参加しました。 どうもありがとう!