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よりも単純な「言語」だからです。
その他の改善
- ドキュメントの多くのマイナーな改善。
-
rustc
は、rustc
3つの新しいARMターゲットをサポートするようになりました:arm-unknown-linux-musleabi
、arm-unknown-linux-musleabihf
およびarmv7-unknown-linux-musleabihf
。
これらのターゲットは、静的実行可能ファイルを生成します。 ただし、組み立てられた時点ではまだ配布されていません。 - リンクおよび不明な数値タイプは 、エラーメッセージでより適切に表示されるようになりました。
- LLVM 3.9でコンパイラをコンパイルできるようになりました
- テスト実行可能ファイルは、テストの実行に使用されるスレッドの数を示す
--test-threads
引数をサポートするようになりました。 環境変数もこの設定を制御します。
RUST_TEST_THREADS
- テストに60秒以上かかる場合、テストを実行すると警告が表示されるようになりました
- Rustのリリースとともに、
rustup component add rust-src
コマンドを使用してrustup component add rust-src
インストールできるソースパッケージが利用可能になりました 。
結果のソースコードはツールとIDEで使用でき、lib/rustlib/src
ディレクトリのlib/rustlib/src
ます。
詳細については、 リリースノートを参照してください。
ライブラリの安定化
このリリースでは、多くのタイプがもう少し使いやすくなりました。
-
Cell::as_ptr
およびRefCell::as_ptr
-
IpAddr
、Ipv4Addr
およびIpv6Addr
はいくつかの新しいメソッドを受け取りました。 -
LinkedList
とVecDeque
にはcontains
メソッドがありcontains
。 -
iter::Product
とiter::Sum
-
Option
は、それに含まれるタイプのFrom
を実装します -
Cell
、RefCell
およびUnsafeCell
は、それらに含まれる型のFrom
を実装します。 -
Cow<str>
は、char
、&str
、およびString
FromIterator
を実装し&str
-
SOCK_CLOEXEC
を使用する場合、Linuxのソケットはサブプロセスで正しく閉じます -
String
はAddAssign
実装しAddAssign
- バージョン9.0に更新されたUnicode定義
詳細については、 リリースノートを参照してください。
貨物の特徴
このシリーズでCargoに追加された最も興味深い機能は、「 ワークスペース 」です。 これらはRFC 1525で定義されており、パッケージのグループが同じCargo.lock
ファイルを共有できるようにします。 複数のパッケージに分割されているプロジェクトに関与している場合、ワークスペースにより、共通の依存関係の単一バージョンの修正が大幅に簡素化されます。 ほとんどのプロジェクトでは、この機能を有効にするには、 Cargo.toml
先頭行[workspace]
1行追加する必要があり[workspace]
。 より複雑なプロジェクトでは、より複雑なセットアップが必要になる場合があります。
もう1つの重要な機会は、コンテナのソースコードへのパスをオーバーロードすることです。 それをcargo-vendorやcargo-local-registryなどのツールと組み合わせて使用すると、依存関係をローカルに簡単に配布(ベンダー化)できます 。 時間の経過とともに、これに基づいてcrates.ioミラーインフラストラクチャが構築されます。
いくつかのマイナーな改善がまだあります:
- 何も更新する必要がない場合、更新が加速されます
-
cargo new
受信フラグ--lib
- コンパイル後、このプロセスにかかった時間が表示されます。
-
cargo publish
受領--dry-run
フラグ
詳細については、 リリースノートを参照してください。
開発者バージョン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・デイビス
- ジェン・チャン
- 吴冉波