BT

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

| 作者: Sergio De Simone フォローする 17 人のフォロワー , 翻訳者 吉田 英人 フォローする 0 人のフォロワー 投稿日 2016年7月22日. 推定読書時間: 2 分 |

原文(投稿日: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の詳細は,公式発表で確認することができる。

 
 

この記事を評価

関連性
スタイル
 
 

この記事に星をつける

おすすめ度
スタイル

こんにちは

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

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

あなたの意見をお聞かせください。

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

このスレッドのメッセージについてEmailでリプライする
コミュニティコメント

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

このスレッドのメッセージについてEmailでリプライする

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

このスレッドのメッセージについてEmailでリプライする

ディスカッション

特集コンテンツ一覧

.NETの派生を理解する

Wayne Citrin 2018年7月18日 午前3時44分

InfoQにログインし新機能を利用する


パスワードを忘れた方はこちらへ

Follow

お気に入りのトピックや著者をフォローする

業界やサイト内で一番重要な見出しを閲覧する

Like

より多いシグナル、より少ないノイズ

お気に入りのトピックと著者を選択して自分のフィードを作る

Notifications

最新情報をすぐ手に入れるようにしよう

通知設定をして、お気に入りコンテンツを見逃さないようにしよう!

BT