Skip to content

Commit dae4703

Browse files
authored
Fix unwinding.md (#46)
1 parent 87a4b45 commit dae4703

File tree

2 files changed

+28
-24
lines changed

2 files changed

+28
-24
lines changed

src/SUMMARY.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
* [コンストラクタ](constructors.md)
3434
* [Destructors](destructors.md)
3535
* [Leaking](leaking.md)
36-
* [Unwinding](unwinding.md)
36+
* [巻き戻し](unwinding.md)
3737
* [例外安全性](exception-safety.md)
3838
* [Poisoning](poisoning.md)
3939
* [Concurrency](concurrency.md)

src/unwinding.md

Lines changed: 27 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1+
<!--
12
# Unwinding
3+
-->
4+
5+
# 巻き戻し
26

37
<!--
48
Rust has a *tiered* error-handling scheme:
@@ -13,8 +17,8 @@ Rustのエラーハンドリングには**階層的な**スキームが存在し
1317
-->
1418
* もし何かが、明確な理由があって欠如しうる場合、Optionが使われます
1519
* もし何かおかしなことが起こった際に合理的な対処方法がある場合、Resultが使われます
16-
* もし何かおかしなことが起こった際に合理的な対処方法がない場合、そのスレッドはpanicします
17-
* もし何か破滅的な出来事が起こった場合、プログラムはabortします
20+
* もし何かおかしなことが起こった際に合理的な対処方法がない場合、そのスレッドはパニックします
21+
* もし何か破滅的な出来事が起こった場合、プログラムはアボートします
1822

1923
<!--
2024
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
2327
destructors as if every function instantly returned.
2428
-->
2529
大抵の状況では圧倒的にOptionとResultが好まれます。というのもAPIのユーザーの
26-
裁量次第でpanicやabortさせることも可能だからです。panicはスレッドの正常処理を
27-
停止し、stackをunwind、全ての関数が即座にreturnしたかのようにデストラクタ
30+
裁量次第でパニックやアボートさせることも可能だからです。パニックはスレッドの正常処理を
31+
停止し、スタックを巻き戻し、全ての関数が即座にリターンしたかのようにデストラクタ
2832
を呼び出します。
2933

3034
<!--
@@ -35,22 +39,22 @@ untenable state. Unlike an exception in Java or C++, a panic could not be
3539
caught at any time. Panics could only be caught by the owner of the task, at which
3640
point they had to be handled or *that* task would itself panic.
3741
-->
38-
バージョン1.0以降のRustはpanic時に2種類の対処法を用いるようになりました
42+
バージョン1.0以降のRustはパニック時に2種類の対処法を用いるようになりました
3943
大昔、Rustは今よりもErlangによく似ていました。Erlangと同様、Rustには軽量のタスク
40-
が存在し、タスクが続行不可能な状態に陥った際にはタスクが自分自身をpanicによって
41-
killすることを意図して設計されていました。JavaやC++の例外と違い、panicはいかなる
42-
場合においてもcatchすることはできませんでした。panicをcatchできるのはタスクの
44+
が存在し、タスクが続行不可能な状態に陥った際にはタスクが自分自身をパニックによって
45+
killすることを意図して設計されていました。JavaやC++の例外と違い、パニックはいかなる
46+
場合においても捕捉することはできませんでした。パニックを捕捉できるのはタスクの
4347
オーナーのみであり、その時点で適切にハンドリングされるか、**その**タスク
44-
(訳注: オーナーとなるタスク)自体がpanicするかのどちらかでした
48+
(訳注: オーナーとなるタスク)自体がパニックするかのどちらかでした
4549

4650
<!--
4751
Unwinding was important to this story because if a task's
4852
destructors weren't called, it would cause memory and other system resources to
4953
leak. Since tasks were expected to die during normal execution, this would make
5054
Rust very poor for long-running systems!
5155
-->
52-
この一連の流れの中では、タスクのデスクトラクタが呼ばれなかった場合にメモリー及び
53-
その他のシステムリソースがリークを起こす可能性があったため、unwindingが重要でした
56+
この一連の流れの中では、タスクのデスクトラクタが呼ばれなかった場合にメモリ及び
57+
その他のシステムリソースがリークを起こす可能性があったため、巻き戻しが重要でした
5458
タスクは通常の実行中にも死ぬ可能性があると想定されていたため、Rustのこういった
5559
特徴は長期間実行されるシステムを作る上でとても不適切でした。
5660

@@ -66,8 +70,8 @@ Rustが現在の形に近づく過程で、より抽象化を少なくしたい
6670
スタイルのプログラミングが確立していき、その過程で軽量のタスクは重量級の
6771
OSスレッドに駆逐・統一されました
6872
(訳注: いわゆるグリーンスレッドとネイティブスレッドの話)。しかしながら
69-
Rust1.0の時点ではpanicはその親スレッドによってのみ補足が可能という仕様であった
70-
ため、 panicの補足時にOSのスレッドを丸ごとunwindしてしまう必要
73+
Rust1.0の時点ではパニックはその親スレッドによってのみ補足が可能という仕様であった
74+
ため、 パニックの補足時にOSのスレッドを丸ごと巻き戻してしまう必要
7175
があったのです!不幸なことにこれはゼロコスト抽象化というRustの思想と
7276
真っ向からぶつかってしまいました。
7377

@@ -82,16 +86,16 @@ Don't build your programs to unwind under normal circumstances. Ideally, you
8286
should only panic for programming errors or *extreme* problems.
8387
-->
8488
一応 `catch_panic` というunstableなAPIが存在し、これによってスレッドをspawn
85-
することなくpanicを補足することはできます
89+
することなくパニックを補足することはできます
8690

8791
> 訳注: その後 `recover` -> `catch_unwind` と変更され、Rust1.9でstableになりました。
8892
89-
とはいえあくまでこれは代替手段として用いることを推奨します。現在のRustのunwind
90-
は「unwindしない」ケースに偏った最適化をしています。unwindが発生しないとわかって
91-
いれば、プログラムがunwindの**準備**をするためのランタイムコストも無くなるためです。
92-
結果として、実際にはJavaのような言語よりもunwindのコストは高くなっています
93-
したがって通常の状況ではunwindしないようなプログラムの作成を心がけるべきです
94-
**非常に大きな**問題の発生時やプログラミングエラーに対してのみpanicすべきです
93+
とはいえあくまでこれは代替手段として用いることを推奨します。現在のRustの巻き戻し
94+
は「巻き戻ししない」ケースに偏った最適化をしています。巻き戻しが発生しないとわかって
95+
いれば、プログラムが巻き戻しの**準備**をするためのランタイムコストも無くなるためです。
96+
結果として、実際にはJavaのような言語よりも巻き戻しのコストは高くなっています
97+
したがって通常の状況では巻き戻ししないようなプログラムの作成を心がけるべきです
98+
**非常に大きな**問題の発生時やプログラミングエラーに対してのみパニックすべきです
9599

96100
<!--
97101
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,
102106
at best, your application will crash and burn. At worst, your application *won't*
103107
crash and burn, and will proceed with completely clobbered state.
104108
-->
105-
Rustのunwindの取り扱い方針は、他の言語のそれと根本から同等になるように設計されて
106-
はいません。したがって他の言語で発生したunwindががRustに波及したり、逆にRustから
109+
Rustの巻き戻しの取り扱い方針は、他の言語のそれと根本から同等になるように設計されて
110+
はいません。したがって他の言語で発生した巻き戻しがRustに波及したり、逆にRustから
107111
多言語に波及したりといった動作は未定義となっています。
108-
FFIの構築時には**絶対に**全てのpanicを境界部でキャッチしなくてはなりません
112+
FFIの構築時には**絶対に**全てのパニックを境界部でキャッチしなくてはなりません
109113
キャッチの結果どのように対処するかはプログラマ次第ですが、とにかく**何か**
110114
しなくてはなりません。そうしなければ、良くてアプリケーションがクラッシュ・炎上します。
111115
最悪のケースではアプリケーションがクラッシュ・炎上**しません**。完全にボロボロの状態

0 commit comments

Comments
 (0)