BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

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の詳細は,公式発表で確認することができる。

 
 

この記事を評価

関連性
スタイル
 
 

この記事に星をつける

おすすめ度
スタイル

特集コンテンツ一覧

BT