argra****@users*****
argra****@users*****
2009年 1月 22日 (木) 01:09:34 JST
Index: docs/perl/5.8.8/perlxstut.pod diff -u docs/perl/5.8.8/perlxstut.pod:1.11 docs/perl/5.8.8/perlxstut.pod:1.12 --- docs/perl/5.8.8/perlxstut.pod:1.11 Tue Jan 20 01:17:32 2009 +++ docs/perl/5.8.8/perlxstut.pod Thu Jan 22 01:09:34 2009 @@ -491,7 +491,7 @@ =end original -Mytest.xsの最後に以下の行を追加します。 +Mytest.xs の最後に以下の行を追加します。 int is_even(input) @@ -510,10 +510,10 @@ =end original -“C<int input>”の行の始めにある空白は必須ではありませんが、これがあると +"C<int input>" の行の始めにある空白は必須ではありませんが、これがあると 読みやすさが増します。 同様に、行末のセミコロンも省略可能です。 -任意の空白を “C<int>” と “C<input>”の間に置くことができます。 +任意の空白を "C<int>" と "C<input>" の間に置くことができます。 =begin original @@ -550,7 +550,7 @@ このファイルは Perl 自身が持っている構造をチェックするのと同様のものを 模倣して作ります。 テストスクリプトの中では、エクステンションの動作を確認するたくさんの -テストを置き、正しい動作をしたら“ok”を正しくなければ“not ok”を +テストを置き、正しい動作をしたら "ok" を正しくなければ "not ok" を 出力するようにします。 BEGIN ブロックにある文を print "1..4" に変え、ファイルの末尾に以下の行を 追加します。 @@ -566,7 +566,7 @@ =end original -“C<make test>”というコマンドでテストスクリプトを呼び出します。 +"C<make test>" というコマンドでテストスクリプトを呼び出します。 以下のような出力が出るはずです。 % make test @@ -630,7 +630,7 @@ =end original Makefile を生成し、C<make> を実行することでカレントの作業ディレクトリの -下に blib (“build library”を意味します)と呼ばれるディレクトリが +下に blib ( "build library" を意味します)と呼ばれるディレクトリが 作られます。 このディレクトリには、私たちが作成する共有ライブラリが置かれます。 一度それをテストすれば、最終的な場所にインストールすることができます。 @@ -1070,7 +1070,7 @@ =end original -“XXXXX”というコメントが付けられた二つの行に注意してください。 +"XXXXX" というコメントが付けられた二つの行に注意してください。 typemap ファイルの最初のセクションを確かめれば、doublesT_DOUBLE という型で あることがわかるでしょう。 INPUT セクションでは T_DOUBLE である引数は、SvNv というルーチンを @@ -1079,7 +1079,7 @@ 同様に、OUTPUT セクションでは一度引数が最終的な値を持てば、それは 呼び出された関数に返すために関数 sv_setnv に渡されます。 これら二つの関数は L<perlguts> で説明されています。 -引数スタックにあるセクションの“ST(0)”の意味は後で説明します。 +引数スタックにあるセクションの "ST(0)" の意味は後で説明します。 =head2 Warning about Output Arguments @@ -1302,7 +1302,7 @@ また、ファイル MANIFEST を私たちのエクステンションの内容を反映するように 修正しましょう。 -“mylib”という単一の行を以下の三行で置き換えます。 +"mylib" という単一の行を以下の三行で置き換えます。 mylib/Makefile.PL mylib/mylib.c @@ -1398,7 +1398,7 @@ =end original -“C<make test>”を実行すれば、すべてがうまくいくはずです。 +"C<make test>" を実行すれば、すべてがうまくいくはずです。 =head2 What has happened here? @@ -1899,11 +1899,11 @@ =end original -しかしながらわかりやすくするために、“&”に変数名を続けて変数の型からは -離しておくことと、“*”を型名に近づけるが変数名からは離す(前述した foo の +しかしながらわかりやすくするために、 "&" に変数名を続けて変数の型からは +離しておくことと、 "*" を型名に近づけるが変数名からは離す(前述した foo の 呼び出しのように)ということをお勧めします。 これを行うことで、実際に C の関数に渡されるがなんなのかを簡単に -理解できます -- これは“last column”にあるものでしょう。 +理解できます -- これは "last column" にあるものでしょう。 =begin original @@ -1933,7 +1933,7 @@ 例 1 以外の このチュートリアルで作成した C コードを見たのならば、 たくさんのST(n) (n は通常は 0)に対する参照に気がついたことでしょう。 -“ST”は実際には引数スタック上の n 番目の引数を指し示すマクロです。 +"ST" は実際には引数スタック上の n 番目の引数を指し示すマクロです。 従って ST(0) はスタック上の最初の引数なので、XSUB に渡される最初の 引数であり、ST(1) は二番目の引数となります。 @@ -2265,13 +2265,11 @@ =end original -The INIT: directive contains code that will be placed immediately after -the argument stack is decoded. C does not allow variable declarations at -arbitrary locations inside a function, -so this is usually the best way to declare local variables needed by the XSUB. -(Alternatively, one could put the whole C<PPCODE:> section into braces, and -put these declarations on top.) -(TBT) +INIT: 指示子は、引数スタックがデコードされた直後に置かれるコードを含みます。 +C では関数内の任の市での変数宣言を許していないので、 +これは普通 XSUB によって必要なローカル変数を宣言するための最善の方法です。 +(代替案としては、C<PPCODE:> セクション全体を中かっこで囲って、それらの +宣言を先頭に置くこともできます。) =item * @@ -2286,13 +2284,12 @@ =end original -This routine also returns a different number of arguments depending on the -success or failure of the call to statfs. If there is an error, the error -number is returned as a single-element array. If the call is successful, -then a 9-element array is returned. Since only one argument is passed into -this function, we need room on the stack to hold the 9 values which may be -returned. -(TBT) +このルーチンはまた、statfs の呼び出しが成功か失敗かに依存して、異なった +数の値を返します。 +エラーの場合は、エラー番号が単一の要素の配列として返されます。 +呼び出しが成功した場合は、9 要素の配列が返されます。 +この関数には引数が 1 つだけ渡されるので、返す 9 つの値を保持するために +スタックに空きを作る必要があります。 =begin original @@ -2302,10 +2299,9 @@ =end original -We do this by using the PPCODE: directive, rather than the CODE: directive. -This tells B<xsubpp> that we will be managing the return values that will be -put on the argument stack by ourselves. -(TBT) +これを、CODE: 指示子ではなく PPCODE: 指示子を使うことで行います。 +これは、引数スタックに置かれる返り値の管理を自分自身で行うことを +B<xsubpp> に知らせます。 =item * @@ -2320,13 +2316,12 @@ =end original -When we want to place values to be returned to the caller onto the stack, -we use the series of macros that begin with "XPUSH". There are five -different versions, for placing integers, unsigned integers, doubles, -strings, and Perl scalars on the stack. In our example, we placed a -Perl scalar onto the stack. (In fact this is the only macro which -can be used to return multiple values.) -(TBT) +呼び出し元に返す値を置くための場所がスタック上にほしい時、 +"XPUSH" で始まる一連のマクロを使います。 +これには、スタック上に整数、符号なし整数、double、文字列、Perl スカラを +置くための 5 種類があります。 +この例では、スタック上に Perl スカラをおきます。 +(実際のところ、これは複数の値を返すときに使える唯一のマクロです。) =begin original @@ -2336,10 +2331,9 @@ =end original -The XPUSH* macros will automatically extend the return stack to prevent -it from being overrun. You push values onto the stack in the order you -want them seen by the calling program. -(TBT) +XPUSH* マクロは、返り値スタックがオーバーランすることを防ぐために、自動的に +返り値スタックを拡張します。 +呼び出しプログラムから見えてほしい順番にスタックに値をプッシュします。 =item * @@ -2353,12 +2347,12 @@ =end original -The values pushed onto the return stack of the XSUB are actually mortal SV's. -They are made mortal so that once the values are copied by the calling -program, the SV's that held the returned values can be deallocated. -If they were not mortal, then they would continue to exist after the XSUB -routine returned, but would not be accessible. This is a memory leak. -(TBT) +XSUB の返り値スタックにプッシュされた値は実際には揮発性の SV です。 +これは揮発性なので、一旦呼び出しプログラムによって値がコピーされれば、 +返り値を保持している SV は開放できます。 +もしこれらが揮発性でないなら、XSUB ルーチンから返った後も存在し続けますが、 +アクセスできなくなります。 +これはメモリリークです。 =item * @@ -2370,10 +2364,9 @@ =end original -If we were interested in performance, not in code compactness, in the success -branch we would not use C<XPUSHs> macros, but C<PUSHs> macros, and would -pre-extend the stack before pushing the return values: -(TBT) +もしコードサイズではなく性能に興味があるのなら、成功時には +C<XPUSHs> ではなく C<PUSHs> を使って、返り値をプッシュする前に予めスタックを +拡張しておきます: EXTEND(SP, 9); @@ -2385,10 +2378,9 @@ =end original -The tradeoff is that one needs to calculate the number of return values -in advance (though overextending the stack will not typically hurt -anything but memory consumption). -(TBT) +トレードオフは、予め返り値の数を計算しておく必要があることです +(しかしスタックを余分に拡張しても、典型的にはメモリ消費以外にはなんの問題も +ありません)。 =begin original @@ -2398,10 +2390,9 @@ =end original -Similarly, in the failure branch we could use C<PUSHs> I<without> extending -the stack: the Perl function reference comes to an XSUB on the stack, thus -the stack is I<always> large enough to take one return value. -(TBT) +同様に、失敗時にはスタックを I<拡張せずに> C<PUSHs> を使えます: +Perl 関数のリファレンスはスタックで XSUB に渡されるので、 +スタックは I<常に> 一つの返り値を返すには十分な大きさがあります。 =back @@ -2530,12 +2521,11 @@ =end original -This function does not use a typemap. Instead, we declare it as accepting -one SV* (scalar) parameter, and returning an SV* value, and we take care of -populating these scalars within the code. Because we are only returning -one value, we don't need a C<PPCODE:> directive - instead, we use C<CODE:> -and C<OUTPUT:> directives. -(TBT) +この関数は typemap を使いません。 +代わりに、一つの SV* (スカラ) 引数を受け入れ、一つの SV* 値を返すように +定義して、これらのスカラをコード内で引き受けます。 +一つの値だけを返すので、 C<PPCODE:> 指示子は不要です - 代わりに、 +C<CODE:> と C<OUTPUT:> の指示子を使います。 =item * @@ -2553,16 +2543,16 @@ =end original -When dealing with references, it is important to handle them with caution. -The C<INIT:> block first checks that -C<SvROK> returns true, which indicates that paths is a valid reference. It -then verifies that the object referenced by paths is an array, using C<SvRV> -to dereference paths, and C<SvTYPE> to discover its type. As an added test, -it checks that the array referenced by paths is non-empty, using the C<av_len> -function (which returns -1 if the array is empty). The XSRETURN_UNDEF macro -is used to abort the XSUB and return the undefined value whenever all three of -these conditions are not met. -(TBT) +リファレンスを扱うとき、これを注意して扱うことが重要です。 +C<INIT:> ブロックはまず、C<SvROK> が真を返すことろチェックします; +これをパスが正当なリファレンスであることを示しています。 +それから、C<SvRV> でパスをデリファレンスして、C<SvTYPE> でその型を +調べることで、パスでリファレンスされているオブジェクトが配列であることを +検証します。 +追加のテストとして、(配列が空の場合に -1 を返す)C<av_len> 関数を使って、 +パスでリファレンスされた配列が空でないことをチェックします。 +XSRETURN_UNDEF マクロは、これら 3 つの条件のどれかが成立しないときに +XSUB を中断して未定義値を返すために使われます。 =item * @@ -2577,13 +2567,12 @@ =end original -We manipulate several arrays in this XSUB. Note that an array is represented -internally by an AV* pointer. The functions and macros for manipulating -arrays are similar to the functions in Perl: C<av_len> returns the highest -index in an AV*, much like $#array; C<av_fetch> fetches a single scalar value -from an array, given its index; C<av_push> pushes a scalar value onto the -end of the array, automatically extending the array as necessary. -(TBT) +この XSUB でいくつかの配列を操作します。 +配列は内部的に AV* ポインタで表現されていることに注意してください。 +配列操作のための関数とマクロは Perl の関数と似ています: C<av_len> は、 +$#array と同様、AV* の最大の添え字を返します; C<av_fetch> は添え字を +取って、配列から 1 つのスカラ値を取り出します; C<av_push> はスカラ値を +配列の最後にスカラ値をプッシュし、もし必要なら自動的に配列を拡張します。 =begin original @@ -2596,13 +2585,12 @@ =end original -Specifically, we read pathnames one at a time from the input array, and -store the results in an output array (results) in the same order. If -statfs fails, the element pushed onto the return array is the value of -errno after the failure. If statfs succeeds, though, the value pushed -onto the return array is a reference to a hash containing some of the -information in the statfs structure. -(TBT) +特に、入力配列から一度に 1 つだけパス名を読み込み、結果を出力配列に +同じ順序で保管します。 +もし statfs が失敗すると、返り値配列にプッシュされる要素は失敗時の +errno です。 +しかし、statfs が成功すると、返り値配列にプッシュされる値は statfs 構造体の +情報を含むハッシュへのリファレンスです。 =begin original @@ -2612,10 +2600,9 @@ =end original -As with the return stack, it would be possible (and a small performance win) -to pre-extend the return array before pushing data into it, since we know -how many elements we will return: -(TBT) +返り値スタックに関して、いくつの要素が返されるかは分かっているので、 +データをプッシュする前に返り値配列を予め拡張しておくことが可能です +(そして少し性能がよくなります): av_extend(results, numpaths); @@ -2631,12 +2618,12 @@ =end original -We are performing only one hash operation in this function, which is storing -a new scalar under a key using C<hv_store>. A hash is represented by an HV* -pointer. Like arrays, the functions for manipulating hashes from an XSUB -mirror the functionality available from Perl. See L<perlguts> and L<perlapi> -for details. -(TBT) +この関数では、C<hv_store> を使ってキーに対して新しいスカラを保管するという、 +1 つのハッシュ操作のみを行います。 +ハッシュは HV* ポインタで表現されます。 +配列と同様、XSUB からハッシュを操作する関数は、Perl から利用可能な機能と +鏡写しです。 +詳しくは L<perlguts> と L<perlapi> を参照してください。 =item * @@ -2651,13 +2638,13 @@ =end original -To create a reference, we use the C<newRV> function. Note that you can -cast an AV* or an HV* to type SV* in this case (and many others). This -allows you to take references to arrays, hashes and scalars with the same -function. Conversely, the C<SvRV> function always returns an SV*, which may -need to be cast to the appropriate type if it is something other than a -scalar (check with C<SvTYPE>). -(TBT) +リファレンスを作るには、 C<newRV> 関数を使います。 +この場合(およびその他多くの場合)、AV* か HV* を SV* 型に +キャストできることに注意してください。 +これにより、同じ関数で配列、ハッシュ、スカラのリファレンスを得ることが +できます。 +反対に、 C<SvRV> 関数は常に SV* を返すので、もしこれが(C<SvTYPE> を +チェックして)スカラ以外の場合、適切な型にキャストする必要があります。 =item *