Rust 1.12の発表

Rust 1.12の新しいバージョンをご紹介します。 Rustは、メモリ、速度、およびコードの並列実行による安全な作業を目的としたシステムプログラミング言語です。







通常どおり、公式Webサイトの対応するページからRust 1.12インストールできます。また、GitHubでこのバージョンの変更点の詳細なリストを確認できます。 このリリースには1361個のパッチが含まれています。







安定バージョン1.12に含まれるもの



リリース1.12は、おそらくリリース1.0以降で最も重要です。 伝えたいことがありますが、時間が足りない場合は、ここに簡単な要約があります。







1.12のユーザーにとって最も顕著な変更は、 rustc



によってrustc



れた新しいエラー形式です。 以前にそれについて話しましたが、これは誰もが新しい形式を利用できる最初の安定版リリースです。 これらのエラーメッセージは、各rustc



エラーを新しい形式で設計、テスト、および更新したボランティアの多くの努力の結果です。 私たちはあなたが新しいバグについてどう思うか知りたいです:









新しい借用エラー



最大の内部変更は、Rust MIREng。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-vendorcargo-local-registryなどのツールと組み合わせて使用​​すると、依存関係をローカルに簡単に配布(ベンダー化)できます 。 時間の経過とともに、これに基づいてcrates.ioミラーインフラストラクチャが構築されます。







いくつかのマイナーな改善がまだあります:









詳細については、 リリースノートを参照してください。







開発者バージョン1.12



バージョン1.12のリリースには176人が参加しました。 どうもありがとう!







参加者リスト
  • アーロン・ギャラガー
  • アブヒ
  • アダム・メジスキ
  • アーメド・チャールズ
  • アラン・サマーズ
  • アレクサンダー・アルトマン
  • アレクサンダー・メリット
  • アレックスブルカ
  • アレックス・クリトン
  • アマニユー・ダントラス
  • アンドレア・プレット
  • アンドレ・ボーガス
  • アンドリュー
  • アンドリュー・カン
  • アンドリュー・パセルティナー
  • アンドリー・ドミトレンコ
  • アンティ・ケラネン
  • アラビンド・ゴラコタ
  • アリエル・ベン・イェフダ
  • バスティアン・デジャン
  • ベン・ブッケル
  • ベン・スタン
  • ボール
  • ブレンダン・カリー
  • ブレットキャノン
  • ブライアン・アンダーソン
  • ブルーノ・タヴァレス
  • キャメロンハート
  • カミーユ・ラッセル
  • センギス缶
  • 検閲されたユーザー名
  • cgswords
  • チウ・シアン・ス
  • クリス・スタンクス
  • クリスチャン・ポベダ
  • クリストフ・ヴ・ブルジェ
  • クレメントミアオ
  • コリー・ファーウェル
  • CrLF0710
  • 暗号宇宙
  • ダニエル・キャンベル
  • デビッド
  • decauwsemaecker.glen@gmail.com
  • ディゴリーブレイク
  • ドミニク・ボエヒ
  • ダグ・ゴールドスタイン
  • ドリディ・ブーケルムーヌ
  • エデュアルド・ブルテスク
  • エドゥアルド・ミハイ・ブルテスク
  • エフゲニー・サフロノフ
  • フェデリコ・ラバシオ
  • フェリックス・ラッシュ
  • フェリックス・S・クロックII
  • フラン・ギハロ
  • ゲオルグ・ブランドル
  • ゴメス
  • gnzlbg
  • ギョーム・ゴメス
  • ハンク・デル・ハーフェナルバイター
  • はりはらん
  • アイザック・アンドラーデ
  • イワン・ネイゲバウアー
  • イワン・ウホフ
  • ジャック・オコナー
  • ジェイク・ゴールディング
  • ヤクブ・フルシチュカ
  • ジェームズ・ミラー
  • ヤン・エリック・レディガー
  • ジャレッド・マニング
  • ジャレッド・ワイルズ
  • ジェフリー・セイフリード
  • ジェスロ・ビークマン
  • ジョナス・シエヴィンク
  • ジョナサン・A・コラシュ
  • ジョナサンクリークモア
  • ジョナサン・ギディ
  • ジョナサン・ターナー
  • ホルヘ・アパリシオ
  • ホセ・マヌエル・バローゾ・ガリンド
  • ジョシュ・ストーン
  • ジュップ・ミュラー
  • カイボアナステティック
  • kc1212
  • キース・ヨン
  • 騎士
  • クシシュトフ・ガルチンスキ
  • ロイックダミアン
  • ルーク・ハインド
  • ラクマン・アデン
  • m4b
  • マニッシュゴレガオカル
  • マルコ・アル・バルボサ
  • マーク・バウアー
  • マークシミュレーション
  • マーティンプール
  • マスード・マレカッセミ
  • マシュー・ピジアック
  • マティアス・ラボー
  • マットホーン
  • マカートン
  • Mファルカスダイク
  • マイケル・ガトッツィ
  • マイケル・ノイマン
  • マイケル・ローゼンバーグ
  • マイケル・ウーリスター
  • マイク・ホミー
  • ミハイル・モディン
  • ミッチマインドツリー
  • mLuby
  • モリッツ・ウルリッヒ
  • ムラース
  • ニック・キャメロン
  • ニック・マッセイ
  • ニヒル・シャグリタヤ
  • ニコ・マタキス
  • ノヴォトニク、ペトル
  • オリバー・フォラル
  • オリバー・ミドルトン
  • オリバー・シュナイダー
  • オメル・シェイク
  • パナシェ・M・ファンディラ
  • パトリック・マッカン
  • ポール・ウールコック
  • ピーター・C・ノートン
  • フロッグふぐ
  • ピエトロアルビニ
  • ラヒエル・カシム
  • ラフル・シャルマ
  • ロバート・ウィリアムソン
  • ロイ・ブルントン
  • ライアン・シェール
  • ライアン・スコット
  • サム
  • サム・ペイソン
  • サミュエル・コルミエ・イイジマ
  • スコット・ア・カー
  • ショーン・マクター
  • セバスチャン・チール
  • ソ・サンヒョン
  • シャンタヌ・ラジ
  • シャムサンダーB
  • シレヌス
  • シモナス・カズラウスカス
  • srdja
  • スリニバス・レディ・サティパルティ
  • ステファン・シンドラー
  • スティーブン・ラザロ
  • スティーブ・クラブニック
  • スティーブン・ファクラー
  • スティーブン・ウォルター
  • シルベストルLEDRU
  • タミール・デュベルスタイン
  • テリー・サン
  • TheZoq2
  • トーマス・ガルシア
  • ティム・ノイマン
  • ティモン・ヴァン・オーバーベルト
  • トビアス・ブッチャー
  • トマス・ミエスコ
  • trixnz
  • シェパンレコンホーベ
  • ub山
  • ウルリック・スヴェルドラップ
  • ヴァディム・チュグノフ
  • ヴァディム・ペトロチェンコフ
  • ヴィンセント・プロイエ
  • ウラジミール・ブキチェビッチ
  • ワン・スエルイ
  • ウェズリー・ワイザー
  • ウィリアム・リー
  • シミン・ルオ
  • ヨヤン・シュレスタ
  • ヨッシ・コンスタンティノフスキー
  • ザック・M・デイビス
  • ジェン・チャン
  • 吴冉波



All Articles