BT

InfoQ ホームページ ニュース エラー処理を改善しコンパイル時間を短縮したRust 1.9

エラー処理を改善しコンパイル時間を短縮したRust 1.9

ブックマーク

原文(投稿日:2016/06/03)へのリンク

先日発表されたRust 1.9の新しい例外処理APIには,スレッド間の例外パラダイムをコントロールするための機能が,これまで以上に実装されている。また,変数の等価性を決定する時のコンパイラのパフォーマンスも向上している。

前述のように,std::panic内で新たに利用可能になったcatch_unwind(/0} APIでは,例外によって発生するスタックの巻き戻し処理を,これまで以上に詳細にコントロールできるようになった。Rustの例外は,予期しない問題を扱うために使用される。この場合のRustの哲学は“早く失敗する”,すなわち,スタックを巻き戻したら例外を投げたスレッドを停止させる,というものだ。一方,それ以外のスレッドは放置されて,パニックを起こしたスレッドと通信するまで実行を続けるため,そのようなケースでは何らかのリカバリ処理が必要になる。しかしcatch_unwindを使用すれば,panicをキャッチして,それをダウンしたスレッド内で共通エラーに変換することが可能になる。

let result = panic::catch_unwind(|| {
    panic!("oh no!");
});
assert!(result.is_err());

この機能が最も有用と思われるシナリオは2つある。

  • Rustが他の言語に組み込まれる場合。この時には,巻き戻しが言語の境界でセグメンテーション違反を起こす可能性がある。
  • 例えば,スレッド管理ライブラリを作成する場合。この場合には,エラーを起こしたスレッドを停止するのではなく,そのエラーをクライアントに通知することが望ましい。

現時点ではスタックの巻き戻しがRustの唯一のpanic処理方法だが,これは将来変更される予定である点にも注目すべきだろう。実際に,スタック巻き戻しのコストを回避する必要があるならば,新たに“中止(abort)”戦略を設けることで実現できるはずだ。

Rustの新バージョンでは,2つの変数が等しいかどうかを決定する場合のコンパイラのパフォーマンスも改善されている。PRのサブミッタであるMarkus Westerlind氏は,O(n!)の複雑性をO(n)に変換することで大きな改善が得られたことを発表した。Westerlinds氏がRedditで説明したように,通常nの値は十分に小さいが,コードの多少の違いなどはこのnによって消し飛んでしまうだろう。そういった場合には,Westerlind氏が結合ライブラリでデモしているように,Rust 1.9では大きなパフォーマンス向上が図られる筈だ。

さらにRust 1.9には,ネットワークやエンコーディング,エンコーディング,ポインタ操作などのライブラリ関数を安定化するコントリビューションも含まれている。

Rust 1.9の詳細は,公式発表で確認することができる。

 
 

この記事を評価

関連性
スタイル
 
 

この記事に星をつける

おすすめ度
スタイル

特集コンテンツ一覧

C# 8の非同期ストリーム

Bassam Alugili 2018年10月11日 午前3時13分

こんにちは

コメントするには InfoQアカウントの登録 または が必要です。InfoQ に登録するとさまざまなことができます。

アカウント登録をしてInfoQをお楽しみください。

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

コミュニティコメント

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

BT

あなたのプロファイルは最新ですか?プロフィールを確認してアップデートしてください。

Eメールを変更すると確認のメールが配信されます。

会社名:
役職:
組織規模:
国:
都道府県:
新しいメールアドレスに確認用のメールを送信します。このポップアップ画面は自動的に閉じられます。