先日発表された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の詳細は,公式発表で確認することができる。
この記事を評価
- 編集者評
- 編集長アクション