From cc5199ea96f47f61ab0e8e2d1f76f081834a7d11 Mon Sep 17 00:00:00 2001 From: Nnwww Date: Fri, 5 Feb 2016 18:49:10 +0900 Subject: [PATCH 1/5] start translating --- 1.6/ja/book/raw-pointers.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/1.6/ja/book/raw-pointers.md b/1.6/ja/book/raw-pointers.md index 679f5489..d1d8bb0c 100644 --- a/1.6/ja/book/raw-pointers.md +++ b/1.6/ja/book/raw-pointers.md @@ -1,4 +1,5 @@ -% Raw Pointers +% 生ポインタ + Rust has a number of different smart pointer types in its standard library, but there are two types that are extra-special. Much of Rust’s safety comes from From 7fc21781beec4b72172cb56b2dfc3b3351b6dbb1 Mon Sep 17 00:00:00 2001 From: Nnwww Date: Sun, 7 Feb 2016 01:38:17 +0900 Subject: [PATCH 2/5] finish a provisionally translation --- 1.6/ja/book/raw-pointers.md | 91 +++++++++++++++++++++++-------------- 1 file changed, 57 insertions(+), 34 deletions(-) diff --git a/1.6/ja/book/raw-pointers.md b/1.6/ja/book/raw-pointers.md index d1d8bb0c..139647b1 100644 --- a/1.6/ja/book/raw-pointers.md +++ b/1.6/ja/book/raw-pointers.md @@ -1,37 +1,48 @@ % 生ポインタ -Rust has a number of different smart pointer types in its standard library, but + +Rustは標準ライブラリに異なるスマートポインタの型を幾つか用意していますが、更に特殊な型が2つあります。Rustの安全性の多くはコンパイル時のチェックに起因するものですが、生ポインタや [unsafe][unsafe] を使用するとそういった保証が得られません。 -`*const T` and `*mut T` are called ‘raw pointers’ in Rust. Sometimes, when + +`*const T` と `*mut T` はRustにおいて「生ポインタ」と呼ばれます。時々、特定の種類のライブラリを書く時に、あなたは幾つかの理由でRustが行う安全性の保証を避けなければならないこともあります。今回のケースでは、ユーザに安全なインターフェースを提供するライブラリの実装に生ポインタを使用できます。例えば、 `*` ポインタはエイリアスとして振る舞うこともできるので、所有権を共有する型を書くのに用いたり、スレッドセーフな共有メモリ型でさえも実装できます。( `Rc` と `Arc` 型は完全にRustのみで実装されています) + + +以下は覚えておくべき生ポインタとその他のポインタ型との違いです。 + + +- 有効なメモリを指していることが保証されないどころか、nullでないことも保証されない( `Box` と `&` では保証される) + +- `Box` とは異なり、自動的な後処理が一切行われないため、手動のリソース管理が必要 + +- plain-old-dataであるため、Rustコンパイラはuse-after-freeのようなバグから保護できない + +- `&` と異なり、ライフタイムの機能が無効化されるため、コンパイラはダングリングポインタを推論できない +- また、 `*const T` を直接介した変更は拒むが、それ以外のエイリアシングやミュータビリティに関する保証はない + -# Basics + +# 基本 -Creating a raw pointer is perfectly safe: + +生ポインタを作成すること自体は絶対に安全です。 ```rust let x = 5; @@ -41,7 +52,9 @@ let mut y = 10; let raw_mut = &mut y as *mut i32; ``` -However, dereferencing one is not. This won’t work: + +しかしながら参照外しは安全ではありません。以下は動作しないでしょう。 + ```rust,ignore let x = 5; @@ -50,7 +63,8 @@ let raw = &x as *const i32; println!("raw points at {}", *raw); ``` -It gives this error: + +このコードは以下のエラーが発生します。 ```text error: dereference of raw pointer requires unsafe function or block [E0133] @@ -58,8 +72,9 @@ error: dereference of raw pointer requires unsafe function or block [E0133] ^~~~ ``` -When you dereference a raw pointer, you’re taking responsibility that it’s not -pointing somewhere that would be incorrect. As such, you need `unsafe`: + +生ポインタを参照外しする時、あなたは間違っている場所を指していないという責任を負うことになります。そういう時は、 `unsafe` を付けなければなりません。 ```rust let x = 5; @@ -70,7 +85,8 @@ let points_at = unsafe { *raw }; println!("raw points at {}", points_at); ``` -For more operations on raw pointers, see [their API documentation][rawapi]. + +生ポインタの操作に関する詳細は、 [APIドキュメント][rawapi] を参照してください。 [unsafe]: unsafe.html [rawapi]: ../std/primitive.pointer.html @@ -80,33 +96,39 @@ For more operations on raw pointers, see [their API documentation][rawapi]. Raw pointers are useful for FFI: Rust’s `*const T` and `*mut T` are similar to C’s `const T*` and `T*`, respectively. For more about this use, consult the [FFI chapter][ffi]. +生ポインタはFFIを使う際に役立ちます。Rustの `*const T` と `*mut T` はそれぞれC言語の `const T*` と `T*` に似ているからです。これの使い方に関する詳細は、 [FFIの章][ffi] を参照してください。 [ffi]: ffi.html -# References and raw pointers + +# 参照と生ポインタ -At runtime, a raw pointer `*` and a reference pointing to the same piece of + +実行時において、同じデータを指す生ポインタ `*` と参照は内部的に同一です。事実、 `unsafe` 外の安全なコードにおいて `&T` 参照は `*const T` 生ポインタへ暗黙的に型強制されますし、 `mut` の場合でも同様です。(これら型強制は、それぞれ `value as *const T` と `value as *mut T` のように、明示的に行うこともできます。) -Going the opposite direction, from `*const` to a reference `&`, is not safe. A + +逆に、 `*const` から 参照 `&` へ遡るのは安全ではありません。 `&T` は常に有効であるため、最低でも `*const T` は型 `T` の有効な実体を指さなければならないのです。その上、ポインタは参照のエイリアシングとミュータビリティの規則も満たす必要があります。コンパイラはあらゆる参照についてこれらのプロパティが真であると仮定しており、その生成方法によらず適用するため、生ポインタからのあらゆる変換もまた真であると断言します。プログラマがこのことを保証 _しなければならない_ のです。 + +おすすめの変換の方法は以下のとおりです。 ```rust -// explicit cast +# // explicit cast +// 明示的キャスト let i: u32 = 1; let p_imm: *const u32 = &i as *const u32; -// implicit coercion +# // implicit coercion +// 暗黙的キャスト let mut m: u32 = 2; let p_mut: *mut u32 = &mut m; @@ -116,7 +138,8 @@ unsafe { } ``` -The `&*x` dereferencing style is preferred to using a `transmute`. The latter + +`&*x` 参照外し方式は `transmute` を用いるよりも好ましいです。後者は必要以上に強力ですから、より用途が限定されている操作の方が間違って使いにくいでしょう。例えば、前者の方法は `x` がポインタである必要があります。( `transmute` とは異なります) From cc940e186835688c2caadcf99cf7df50ddc1eb00 Mon Sep 17 00:00:00 2001 From: Nnwww Date: Sun, 7 Feb 2016 18:17:04 +0900 Subject: [PATCH 3/5] correct mistakes --- 1.6/ja/book/raw-pointers.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/1.6/ja/book/raw-pointers.md b/1.6/ja/book/raw-pointers.md index 139647b1..dea647d4 100644 --- a/1.6/ja/book/raw-pointers.md +++ b/1.6/ja/book/raw-pointers.md @@ -93,9 +93,9 @@ println!("raw points at {}", points_at); # FFI -Raw pointers are useful for FFI: Rust’s `*const T` and `*mut T` are similar to + 生ポインタはFFIを使う際に役立ちます。Rustの `*const T` と `*mut T` はそれぞれC言語の `const T*` と `T*` に似ているからです。これの使い方に関する詳細は、 [FFIの章][ffi] を参照してください。 [ffi]: ffi.html @@ -117,7 +117,7 @@ satisfy the aliasing and mutability laws of references. The compiler assumes these properties are true for any references, no matter how they are created, and so any conversion from raw pointers is asserting that they hold. The programmer *must* guarantee this. --> -逆に、 `*const` から 参照 `&` へ遡るのは安全ではありません。 `&T` は常に有効であるため、最低でも `*const T` は型 `T` の有効な実体を指さなければならないのです。その上、ポインタは参照のエイリアシングとミュータビリティの規則も満たす必要があります。コンパイラはあらゆる参照についてこれらのプロパティが真であると仮定しており、その生成方法によらず適用するため、生ポインタからのあらゆる変換もまた真であると断言します。プログラマがこのことを保証 _しなければならない_ のです。 +逆に、 `*const` から 参照 `&` へ遡るのは安全ではありません。 `&T` は常に有効であるため、最低でも `*const T` は型 `T` の有効な実体を指さなければならないのです。その上、ポインタは参照のエイリアシングとミュータビリティの規則も満たす必要があります。コンパイラはあらゆる参照についてこれらのプロパティが真であると仮定しており、その生成方法によらず適用するため、生ポインタからのあらゆる変換もまた真であると断言します。プログラマがこのことを保証 *しなければならない* のです。 おすすめの変換の方法は以下のとおりです。 From 9e96d23c4e8308d34b6cfde1d62c706219a83008 Mon Sep 17 00:00:00 2001 From: Nnwww Date: Sun, 14 Feb 2016 00:33:58 +0900 Subject: [PATCH 4/5] reflect reviews --- 1.6/ja/book/raw-pointers.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/1.6/ja/book/raw-pointers.md b/1.6/ja/book/raw-pointers.md index dea647d4..cb1da754 100644 --- a/1.6/ja/book/raw-pointers.md +++ b/1.6/ja/book/raw-pointers.md @@ -5,7 +5,7 @@ there are two types that are extra-special. Much of Rust’s safety comes from compile-time checks, but raw pointers don’t have such guarantees, and are [unsafe][unsafe] to use. --> -Rustは標準ライブラリに異なるスマートポインタの型を幾つか用意していますが、更に特殊な型が2つあります。Rustの安全性の多くはコンパイル時のチェックに起因するものですが、生ポインタや [unsafe][unsafe] を使用するとそういった保証が得られません。 +Rustは標準ライブラリに異なるスマートポインタの型を幾つか用意していますが、更に特殊な型が2つあります。Rustの安全性の多くはコンパイル時のチェックに依るものですが、生ポインタを用いるとそういった保証が得られないため [unsafe][unsafe] です。 -`*const T` と `*mut T` はRustにおいて「生ポインタ」と呼ばれます。時々、特定の種類のライブラリを書く時に、あなたは幾つかの理由でRustが行う安全性の保証を避けなければならないこともあります。今回のケースでは、ユーザに安全なインターフェースを提供するライブラリの実装に生ポインタを使用できます。例えば、 `*` ポインタはエイリアスとして振る舞うこともできるので、所有権を共有する型を書くのに用いたり、スレッドセーフな共有メモリ型でさえも実装できます。( `Rc` と `Arc` 型は完全にRustのみで実装されています) +`*const T` と `*mut T` はRustにおいて「生ポインタ」と呼ばれます。時々、ある種ののライブラリを書く際に、あなたは何らかの理由でRustが行う安全性の保証を避けなければならないこともあります。このようなケースでは、ユーザに安全なインターフェースを提供しつつ、ライブラリの実装に生ポインタを使用できます。例えば、 `*` ポインタはエイリアスとして振る舞うこともできるので、所有権を共有する型を書くのに用いたり、スレッドセーフな共有メモリ型でさえも実装できます。( `Rc` と `Arc` 型は完全にRustのみで実装されています) @@ -74,7 +74,7 @@ error: dereference of raw pointer requires unsafe function or block [E0133] -生ポインタを参照外しする時、あなたは間違っている場所を指していないという責任を負うことになります。そういう時は、 `unsafe` を付けなければなりません。 +生ポインタを参照外しする時、ポインタが間違った場所を指していないことに対して責任を負うことになります。そういう時は、 `unsafe` を付けなければなりません。 ```rust let x = 5; @@ -117,7 +117,7 @@ satisfy the aliasing and mutability laws of references. The compiler assumes these properties are true for any references, no matter how they are created, and so any conversion from raw pointers is asserting that they hold. The programmer *must* guarantee this. --> -逆に、 `*const` から 参照 `&` へ遡るのは安全ではありません。 `&T` は常に有効であるため、最低でも `*const T` は型 `T` の有効な実体を指さなければならないのです。その上、ポインタは参照のエイリアシングとミュータビリティの規則も満たす必要があります。コンパイラはあらゆる参照についてこれらのプロパティが真であると仮定しており、その生成方法によらず適用するため、生ポインタからのあらゆる変換もまた真であると断言します。プログラマがこのことを保証 *しなければならない* のです。 +逆に、 `*const` から 参照 `&` へ遡るのは安全ではありません。 `&T` は常に有効であるため、最低でも `*const T` は型 `T` の有効な実体を指さなければならないのです。その上、ポインタは参照のエイリアシングとミュータビリティの規則も満たす必要があります。コンパイラはあらゆる参照についてこれらの性質が真であると仮定しており、その生成方法に依らず適用するため、生ポインタからのいかなる変換も、参照先の値が上記の性質を満たすと表明していることになります。プログラマがこのことを保証 *しなければならない* のです。 おすすめの変換の方法は以下のとおりです。 From 8e7707c7df7a63bff5b7fcb74bd6a2c98fe08d01 Mon Sep 17 00:00:00 2001 From: Nnwww Date: Sun, 14 Feb 2016 16:03:22 +0900 Subject: [PATCH 5/5] fix markdown syntax --- 1.6/ja/book/raw-pointers.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/1.6/ja/book/raw-pointers.md b/1.6/ja/book/raw-pointers.md index cb1da754..8df82f6d 100644 --- a/1.6/ja/book/raw-pointers.md +++ b/1.6/ja/book/raw-pointers.md @@ -22,18 +22,18 @@ other pointer types. They: --> -- 有効なメモリを指していることが保証されないどころか、nullでないことも保証されない( `Box` と `&` では保証される) -- `Box` とは異なり、自動的な後処理が一切行われないため、手動のリソース管理が必要 -- plain-old-dataであるため、Rustコンパイラはuse-after-freeのようなバグから保護できない +- 有効なメモリを指していることが保証されないどころか、nullでないことも保証されない( `Box` と `&` では保証される) +- `Box` とは異なり、自動的な後処理が一切行われないため、手動のリソース管理が必要 +- plain-old-dataであるため、Rustコンパイラはuse-after-freeのようなバグから保護できない - `&` と異なり、ライフタイムの機能が無効化されるため、コンパイラはダングリングポインタを推論できない - また、 `*const T` を直接介した変更は拒むが、それ以外のエイリアシングやミュータビリティに関する保証はない @@ -121,6 +121,7 @@ programmer *must* guarantee this. --> おすすめの変換の方法は以下のとおりです。 + ```rust # // explicit cast // 明示的キャスト