5
5
6
6
<!-- What's the relationship between Safe Rust and Unsafe Rust? How do they
7
7
interact? -->
8
- 安全な Rust と危険な Rust とはどう関係しているのでしょうか? どのように影響し合うのでしょうか?
8
+ 安全な Rust とアンセーフな Rust とはどう関係しているのでしょうか? どのように影響し合うのでしょうか?
9
9
10
10
<!-- The separation between Safe Rust and Unsafe Rust is controlled with the
11
11
`unsafe` keyword, which acts as an interface from one to the other. This is
12
12
why we can say Safe Rust is a safe language: all the unsafe parts are kept
13
13
exclusively behind the boundary. -->
14
14
15
- ` unsafe ` キーワードがインターフェースとなり、安全な Rust と危険な Rust とを分離します。
16
- このため、安全な Rust は安全な言語で、危険な部分は完全に境界外に管理されている 、と言うことができるのです。
15
+ ` unsafe ` キーワードがインターフェースとなり、安全な Rust とアンセーフな Rust とを分離します。
16
+ このため、安全な Rust は安全な言語で、アンセーフな部分は完全に境界外に管理されている 、と言うことができるのです。
17
17
18
18
<!--
19
19
The `unsafe` keyword has two uses: to declare the existence of contracts the
@@ -34,10 +34,10 @@ trait must check the trait documentation to ensure their implementation
34
34
maintains the contracts the trait requires.
35
35
-->
36
36
37
- _ 関数_ と _ trait の宣言 _ に未チェックな契約が存在する事を、` unsafe ` を使って示すことができます。
37
+ _ 関数_ と _ トレイトの宣言 _ に未チェックな契約が存在する事を、` unsafe ` を使って示すことができます。
38
38
関数に ` unsafe ` を使うと、ドキュメントを読んで、
39
39
要求された契約を守るように関数を使うことを、その関数のユーザーに要請することになります。
40
- trait の宣言に ` unsafe ` を使うと、その trait を実装するユーザーに対し 、ドキュメントをチェックして契約を守るよう要請します。
40
+ トレイトの宣言に ` unsafe ` を使うと、そのトレイトを実装するユーザーに対し 、ドキュメントをチェックして契約を守るよう要請します。
41
41
42
42
<!--
43
43
You can use `unsafe` on a block to declare that all constraints required
@@ -47,13 +47,13 @@ to declare that the implementation of that trait has adhered to whatever
47
47
contracts the trait's documentation requires.
48
48
-->
49
49
50
- コードブロックに使われた ` unsafe ` は、そのブロックで呼ばれている危険な関数が要求する契約は守られていて 、コードが信頼出来る事を意味します。` unsafe ` を trait の実装に使うと、その実装が trait のドキュメントに書かれている契約に準拠している事を示します 。
50
+ コードブロックに使われた ` unsafe ` は、そのブロックで呼ばれているアンセーフな関数が要求する契約は守られていて 、コードが信頼出来る事を意味します。` unsafe ` をトレイトの実装に使うと、その実装がトレイトのドキュメントに書かれている契約に準拠している事を示します 。
51
51
52
52
<!--
53
53
The standard library has a number of unsafe functions, including:
54
54
-->
55
55
56
- 標準ライブラリにはいくつもの危険な関数があります 。例えば、
56
+ 標準ライブラリにはいくつものアンセーフな関数があります 。例えば、
57
57
58
58
<!--
59
59
* `slice::get_unchecked`, which performs unchecked indexing, allowing
@@ -66,36 +66,36 @@ The standard library has a number of unsafe functions, including:
66
66
* All FFI functions are `unsafe` because the other language can do arbitrary
67
67
operations that the Rust compiler can't check.
68
68
-->
69
-
69
+
70
70
* ` slice::get_unchecked ` は未チェックのインデックス参照を実行します。自由自在にメモリ安全性に違反できます。
71
71
* ` mem::transmute ` は、型安全の仕組みを好きなようにすり抜けて、ある値が特定の型であると再解釈します(詳細は [ 変換] をみてください)。
72
- * サイズが確定している型の生のポインタには 、固有の ` offset ` メソッドがあります。渡されたオフセットが LLVM が定める "境界内" になければ、未定義の挙動を引き起こします。
72
+ * サイズが確定している型の生ポインタには 、固有の ` offset ` メソッドがあります。渡されたオフセットが LLVM が定める "境界内" になければ、未定義の挙動を引き起こします。
73
73
* すべての FFI 関数は ` unsafe ` です。なぜなら Rust コンパイラは、他の言語が実行するどんな操作もチェックできないからです。
74
74
75
75
<!--
76
76
As of Rust 1.0 there are exactly two unsafe traits:
77
77
-->
78
78
79
- Rust 1.0 現在、危険な traits は 2 つしかありません。
79
+ Rust 1.0 現在、アンセーフなトレイトは 2 つしかありません。
80
80
81
81
<!--
82
82
* `Send` is a marker trait (a trait with no API) that promises implementors are
83
83
safe to send (move) to another thread.
84
84
* `Sync` is a marker trait that promises threads can safely share implementors
85
85
through a shared reference.
86
86
-->
87
-
88
- * ` Send ` は API を持たないマーカー trait で 、実装された型が他のスレッドに安全に送れる(move できる )ことを約束します。
89
- * ` Sync ` もマーカー trait で、この trait を実装した型は、共有リファレンスを使って安全に複数のスレッドで共有できる事を約束します 。
87
+
88
+ * ` Send ` は API を持たないマーカートレイトで 、実装された型が他のスレッドに安全に送れる(ムーブできる )ことを約束します。
89
+ * ` Sync ` もマーカートレイトで、このトレイトを実装した型は、共有された参照を使って安全に複数のスレッドで共有できる事を約束します 。
90
90
91
91
<!--
92
92
Much of the Rust standard library also uses Unsafe Rust internally, although
93
93
these implementations are rigorously manually checked, and the Safe Rust
94
94
interfaces provided on top of these implementations can be assumed to be safe.
95
95
-->
96
96
97
- また、多くの Rust 標準ライブラリは内部で危険な Rust を使っています。ただ、標準ライブラリの
98
- 実装はプログラマが徹底的にチェックしているので、危険な Rust の上に実装された安全な Rust は安全であると仮定して良いでしょう。
97
+ また、多くの Rust 標準ライブラリは内部でアンセーフな Rust を使っています。ただ、標準ライブラリの
98
+ 実装はプログラマが徹底的にチェックしているので、アンセーフな Rust の上に実装された安全な Rust は安全であると仮定して良いでしょう。
99
99
100
100
<!--
101
101
The need for all of this separation boils down a single fundamental property
@@ -116,9 +116,9 @@ maintain). On the other hand, Unsafe Rust has to be very careful about
116
116
trusting Safe Rust.
117
117
-->
118
118
119
- このように安全と危険の分けると 、安全な Rust は、自分が利用する危険な Rust が正しく書かれている事、
120
- つまり危険な Rust がそれが守るべき契約を実際に守っている事、を本質的に信頼しなくてはいけません。
121
- 逆に、危険な Rust は安全な Rust を注意して信頼しなくてはいけません。
119
+ このように安全とアンセーフを分けると 、安全な Rust は、自分が利用するアンセーフな Rust が正しく書かれている事、
120
+ つまりアンセーフな Rust がそれが守るべき契約を実際に守っている事、を本質的に信頼しなくてはいけません。
121
+ 逆に、アンセーフな Rust は安全な Rust を注意して信頼しなくてはいけません。
122
122
123
123
<!--
124
124
As an example, Rust has the `PartialOrd` and `Ord` traits to differentiate
@@ -134,13 +134,13 @@ maintain all necessary contracts, even if a key type's `Ord` implementation
134
134
does not implement a total ordering.
135
135
-->
136
136
137
- 例えば、Rust には ` PartialOrd ` trait と ` Ord ` trait があり 、単に比較可能な型と全順序が
137
+ 例えば、Rust には ` PartialOrd ` トレイトと ` Ord ` トレイトがあり 、単に比較可能な型と全順序が
138
138
定義されている型(任意の値が同じ型の他の値と比べて等しいか、大きいか、小さい)とを区別します。
139
- 順序つきマップの ` BTreeMap ` は半順序の型には使えないので、キーとして使われる型が ` Ord ` trait を
139
+ 順序つきマップの ` BTreeMap ` は半順序の型には使えないので、キーとして使われる型が ` Ord ` トレイトを
140
140
実装している事を要求します。
141
- しかし ` BTreeMap ` の実装は危険な Rust が使っていて、危険な Rust は渡された ` Ord ` の実装が
141
+ しかし ` BTreeMap ` の実装ではアンセーフな Rust が使われていて、アンセーフな Rust は渡された ` Ord ` の実装が
142
142
適切であるとは仮定できません。
143
- ` BTreeMap ` 内部の危険な部分は 、キー型の ` Ord ` の実装が全順序ではない場合でも、必要な契約が
143
+ ` BTreeMap ` 内部のアンセーフな部分は 、キー型の ` Ord ` の実装が全順序ではない場合でも、必要な契約が
144
144
すべて守られるよう注意深く書かれなくてはいけません。
145
145
146
146
<!--
@@ -150,7 +150,7 @@ assumptions about potential future Safe Rust code providing the same
150
150
guarantees.
151
151
-->
152
152
153
- 危険な Rust は安全な Rust を無意識には信頼できません。危険な Rust コードを書くときには、
153
+ アンセーフな Rust は安全な Rust を無意識には信頼できません。アンセーフな Rust コードを書くときには、
154
154
安全な Rust の特定のコードのみに依存する必要があり、
155
155
安全な Rust が将来にわたって同様の安全性を提供すると仮定してはいけません。
156
156
@@ -160,8 +160,8 @@ type could theoretically require that keys implement a new trait called
160
160
`UnsafeOrd`, rather than `Ord`, that might look like this:
161
161
-->
162
162
163
- この問題を解決するために ` unsafe ` な trait が存在します 。理論上は、` BTreeMap ` 型は
164
- キーが ` Ord ` ではなく、新しい trait ` UnsafeOrd ` を実装する事を要求する事ができます。
163
+ この問題を解決するために ` unsafe ` なトレイトが存在します 。理論上は、` BTreeMap ` 型は
164
+ キーが ` Ord ` ではなく、新しいトレイト ` UnsafeOrd ` を実装する事を要求する事ができます。
165
165
このようなコードになるでしょう。
166
166
167
167
``` rust
@@ -181,10 +181,10 @@ correct. If it isn't, it's the fault of the unsafe trait implementation
181
181
code, which is consistent with Rust's safety guarantees.
182
182
-->
183
183
184
- この場合、` UnsafeOrd ` を実装する型は、この trait が期待する契約に準拠している事を示すために
184
+ この場合、` UnsafeOrd ` を実装する型は、このトレイトが期待する契約に準拠している事を示すために
185
185
` unsafe ` キーワードを使うことになります。
186
- この状況では、` BTreeMap ` 内部の危険な Rust は、キー型が ` UnsafeOrd ` を正しく実装していると
187
- 信用する事ができます。もしそうで無ければ、それは trait の実装の問題であり 、
186
+ この状況では、` BTreeMap ` 内部のアンセーフな Rust は、キー型が ` UnsafeOrd ` を正しく実装していると
187
+ 信用する事ができます。もしそうで無ければ、それはトレイトの実装の問題であり 、
188
188
これは Rust の安全性の保証と一致しています。
189
189
190
190
<!--
@@ -199,14 +199,14 @@ expect to defend against a bad implementation of the trait, then marking the
199
199
trait `unsafe` is a reasonable choice.
200
200
-->
201
201
202
- trait に ` unsafe ` をつけるかどうかは API デザインにおける選択です。
203
- Rust では従来 ` unsafe ` な trait を避けてきました。そうしないと危険な Rust が
202
+ トレイトに ` unsafe ` をつけるかどうかは API デザインにおける選択です。
203
+ Rust では従来 ` unsafe ` なトレイトを避けてきました。そうしないとアンセーフな Rust が
204
204
蔓延してしまい、好ましくないからです。
205
205
` Send ` と ` Sync ` が ` unsafe ` となっているのは、スレッドの安全性が * 基本的な性質* であり、
206
206
間違った ` Ord ` の実装に対して危険なコードが防衛できるのと同様の意味では防衛できないからです。
207
- あなたが宣言した trait を ` unsafe ` とマークするかどうかも、同じようにじっくりと考えてください。
208
- もし ` unsafe ` なコードがその trait の間違った実装から防御することが合理的に不可能であるなら 、
209
- その trait を ` unsafe ` とするのは合理的な選択です。
207
+ あなたが宣言したトレイトを ` unsafe ` とマークするかどうかも、同じようにじっくりと考えてください。
208
+ もし ` unsafe ` なコードがそのトレイトの間違った実装から防御することが合理的に不可能であるなら 、
209
+ そのトレイトを ` unsafe ` とするのは合理的な選択です。
210
210
211
211
<!--
212
212
As an aside, while `Send` and `Sync` are `unsafe` traits, they are
@@ -216,7 +216,7 @@ whose types also implement `Send`. `Sync` is automatically derived for all
216
216
types composed only of values whose types also implement `Sync`.
217
217
-->
218
218
219
- 余談ですが、` unsafe ` な trait である ` Send ` と ` Sync ` は、それらを実装する事が安全だと
219
+ 余談ですが、` unsafe ` なトレイトである ` Send ` と ` Sync ` は、それらを実装する事が安全だと
220
220
実証可能な場合には自動的に実装されます。
221
221
` Send ` は、` Send ` を実装した型だけから構成される型に対して、自動的に実装されます。
222
222
` Sync ` は、` Sync ` を実装した型だけから構成される型に対して、自動的に実装されます。
@@ -229,11 +229,11 @@ of care that must be taken, and what contracts it is expected of Unsafe Rust
229
229
to uphold.
230
230
-->
231
231
232
- これが安全な Rust と危険な Rust のダンスです。
233
- これは、安全な Rust をできるだけ快適に使えるように、しかし危険な Rust を書くには
232
+ これが安全な Rust とアンセーフな Rust のダンスです。
233
+ これは、安全な Rust をできるだけ快適に使えるように、しかしアンセーフな Rust を書くには
234
234
それ以上の努力と注意深さが要求されるようなデザインになっています。
235
235
この本の残りでは、どういう点に注意しなくはいけないのか、
236
- 危険な Rust を維持するための契約とは何なのかを議論します。
236
+ アンセーフな Rust を維持するための契約とは何なのかを議論します。
237
237
238
238
239
239
0 commit comments