1
+ <!--
1
2
# Unwinding
3
+ -->
4
+
5
+ # 巻き戻し
2
6
3
7
<!--
4
8
Rust has a *tiered* error-handling scheme:
@@ -13,8 +17,8 @@ Rustのエラーハンドリングには**階層的な**スキームが存在し
13
17
-->
14
18
* もし何かが、明確な理由があって欠如しうる場合、Optionが使われます
15
19
* もし何かおかしなことが起こった際に合理的な対処方法がある場合、Resultが使われます
16
- * もし何かおかしなことが起こった際に合理的な対処方法がない場合、そのスレッドはpanicします
17
- * もし何か破滅的な出来事が起こった場合、プログラムはabortします
20
+ * もし何かおかしなことが起こった際に合理的な対処方法がない場合、そのスレッドはパニックします
21
+ * もし何か破滅的な出来事が起こった場合、プログラムはアボートします
18
22
19
23
<!--
20
24
Option and Result are overwhelmingly preferred in most situations, especially
@@ -23,8 +27,8 @@ Panics cause the thread to halt normal execution and unwind its stack, calling
23
27
destructors as if every function instantly returned.
24
28
-->
25
29
大抵の状況では圧倒的にOptionとResultが好まれます。というのもAPIのユーザーの
26
- 裁量次第でpanicやabortさせることも可能だからです。panicはスレッドの正常処理を
27
- 停止し、stackをunwind、全ての関数が即座にreturnしたかのようにデストラクタ
30
+ 裁量次第でパニックやアボートさせることも可能だからです。パニックはスレッドの正常処理を
31
+ 停止し、スタックを巻き戻し、全ての関数が即座にリターンしたかのようにデストラクタ
28
32
を呼び出します。
29
33
30
34
<!--
@@ -35,22 +39,22 @@ untenable state. Unlike an exception in Java or C++, a panic could not be
35
39
caught at any time. Panics could only be caught by the owner of the task, at which
36
40
point they had to be handled or *that* task would itself panic.
37
41
-->
38
- バージョン1.0以降のRustはpanic時に2種類の対処法を用いるようになりました 。
42
+ バージョン1.0以降のRustはパニック時に2種類の対処法を用いるようになりました 。
39
43
大昔、Rustは今よりもErlangによく似ていました。Erlangと同様、Rustには軽量のタスク
40
- が存在し、タスクが続行不可能な状態に陥った際にはタスクが自分自身をpanicによって
41
- killすることを意図して設計されていました。JavaやC++の例外と違い、panicはいかなる
42
- 場合においてもcatchすることはできませんでした。panicをcatchできるのはタスクの
44
+ が存在し、タスクが続行不可能な状態に陥った際にはタスクが自分自身をパニックによって
45
+ killすることを意図して設計されていました。JavaやC++の例外と違い、パニックはいかなる
46
+ 場合においても捕捉することはできませんでした。パニックを捕捉できるのはタスクの
43
47
オーナーのみであり、その時点で適切にハンドリングされるか、** その** タスク
44
- (訳注: オーナーとなるタスク)自体がpanicするかのどちらかでした 。
48
+ (訳注: オーナーとなるタスク)自体がパニックするかのどちらかでした 。
45
49
46
50
<!--
47
51
Unwinding was important to this story because if a task's
48
52
destructors weren't called, it would cause memory and other system resources to
49
53
leak. Since tasks were expected to die during normal execution, this would make
50
54
Rust very poor for long-running systems!
51
55
-->
52
- この一連の流れの中では、タスクのデスクトラクタが呼ばれなかった場合にメモリー及び
53
- その他のシステムリソースがリークを起こす可能性があったため、unwindingが重要でした 。
56
+ この一連の流れの中では、タスクのデスクトラクタが呼ばれなかった場合にメモリ及び
57
+ その他のシステムリソースがリークを起こす可能性があったため、巻き戻しが重要でした 。
54
58
タスクは通常の実行中にも死ぬ可能性があると想定されていたため、Rustのこういった
55
59
特徴は長期間実行されるシステムを作る上でとても不適切でした。
56
60
@@ -66,8 +70,8 @@ Rustが現在の形に近づく過程で、より抽象化を少なくしたい
66
70
スタイルのプログラミングが確立していき、その過程で軽量のタスクは重量級の
67
71
OSスレッドに駆逐・統一されました
68
72
(訳注: いわゆるグリーンスレッドとネイティブスレッドの話)。しかしながら
69
- Rust1.0の時点ではpanicはその親スレッドによってのみ補足が可能という仕様であった
70
- ため、 panicの補足時にOSのスレッドを丸ごとunwindしてしまう必要
73
+ Rust1.0の時点ではパニックはその親スレッドによってのみ補足が可能という仕様であった
74
+ ため、 パニックの補足時にOSのスレッドを丸ごと巻き戻してしまう必要
71
75
があったのです!不幸なことにこれはゼロコスト抽象化というRustの思想と
72
76
真っ向からぶつかってしまいました。
73
77
@@ -82,16 +86,16 @@ Don't build your programs to unwind under normal circumstances. Ideally, you
82
86
should only panic for programming errors or *extreme* problems.
83
87
-->
84
88
一応 ` catch_panic ` というunstableなAPIが存在し、これによってスレッドをspawn
85
- することなくpanicを補足することはできます 。
89
+ することなくパニックを補足することはできます 。
86
90
87
91
> 訳注: その後 ` recover ` -> ` catch_unwind ` と変更され、Rust1.9でstableになりました。
88
92
89
- とはいえあくまでこれは代替手段として用いることを推奨します。現在のRustのunwind
90
- は「unwindしない 」ケースに偏った最適化をしています。unwindが発生しないとわかって
91
- いれば、プログラムがunwindの ** 準備** をするためのランタイムコストも無くなるためです。
92
- 結果として、実際にはJavaのような言語よりもunwindのコストは高くなっています 。
93
- したがって通常の状況ではunwindしないようなプログラムの作成を心がけるべきです 。
94
- ** 非常に大きな** 問題の発生時やプログラミングエラーに対してのみpanicすべきです 。
93
+ とはいえあくまでこれは代替手段として用いることを推奨します。現在のRustの巻き戻し
94
+ は「巻き戻ししない 」ケースに偏った最適化をしています。巻き戻しが発生しないとわかって
95
+ いれば、プログラムが巻き戻しの ** 準備** をするためのランタイムコストも無くなるためです。
96
+ 結果として、実際にはJavaのような言語よりも巻き戻しのコストは高くなっています 。
97
+ したがって通常の状況では巻き戻ししないようなプログラムの作成を心がけるべきです 。
98
+ ** 非常に大きな** 問題の発生時やプログラミングエラーに対してのみパニックすべきです 。
95
99
96
100
<!--
97
101
Rust's unwinding strategy is not specified to be fundamentally compatible
@@ -102,10 +106,10 @@ point is up to you, but *something* must be done. If you fail to do this,
102
106
at best, your application will crash and burn. At worst, your application *won't*
103
107
crash and burn, and will proceed with completely clobbered state.
104
108
-->
105
- Rustのunwindの取り扱い方針は 、他の言語のそれと根本から同等になるように設計されて
106
- はいません。したがって他の言語で発生したunwindががRustに波及したり 、逆にRustから
109
+ Rustの巻き戻しの取り扱い方針は 、他の言語のそれと根本から同等になるように設計されて
110
+ はいません。したがって他の言語で発生した巻き戻しがRustに波及したり 、逆にRustから
107
111
多言語に波及したりといった動作は未定義となっています。
108
- FFIの構築時には** 絶対に** 全てのpanicを境界部でキャッチしなくてはなりません 。
112
+ FFIの構築時には** 絶対に** 全てのパニックを境界部でキャッチしなくてはなりません 。
109
113
キャッチの結果どのように対処するかはプログラマ次第ですが、とにかく** 何か** を
110
114
しなくてはなりません。そうしなければ、良くてアプリケーションがクラッシュ・炎上します。
111
115
最悪のケースではアプリケーションがクラッシュ・炎上** しません** 。完全にボロボロの状態
0 commit comments