5.22.1

名前

perlguts - Introduction to the Perl API

perlguts - Perl API の紹介

説明

This document attempts to describe how to use the Perl API, as well as to provide some info on the basic workings of the Perl core. It is far from complete and probably contains many errors. Please refer any questions or comments to the author below.

このドキュメントでは Perl API の使い方、および Perl コアの基本的な動作に 関するいくばくかの情報を提供しようとしています。 完璧からは程遠いものですし、間違いも多いと思います。 疑問点やコメントは後述する著者に対して行なってください。

変数

データ型

Perl has three typedefs that handle Perl's three main data types:

Perl では、主となる三つのデータ型を扱うために三つの型定義を行なっています:

    SV  Scalar Value
    AV  Array Value
    HV  Hash Value

Each typedef has specific routines that manipulate the various data types.

それぞれの typedef には様々なデータ型を操作するための特別なルーチンが 用意されています。

"IV" ってなに?

Perl uses a special typedef IV which is a simple signed integer type that is guaranteed to be large enough to hold a pointer (as well as an integer). Additionally, there is the UV, which is simply an unsigned IV.

Perl では、符号付き整数でもポインタでも十分に入れることのできる特別な typedef である IV を使います。 更に、単に符号なしの IV である UV もあります。

Perl also uses two special typedefs, I32 and I16, which will always be at least 32-bits and 16-bits long, respectively. (Again, there are U32 and U16, as well.) They will usually be exactly 32 and 16 bits long, but on Crays they will both be 64 bits.

Perl はまた、二つの特殊な typedef である I32 と I16 を使っています; これらはそれぞれ、常に最低 32bit、16bit の長さを持っているものです。 (再び、同様に U32 と U16 もあります。) これらは普通は正確に 32 ビットと 16 ビットですが、Cray では両方とも 64 ビットです。

SV に対する作業

An SV can be created and loaded with one command. There are five types of values that can be loaded: an integer value (IV), an unsigned integer value (UV), a double (NV), a string (PV), and another scalar (SV). ("PV" stands for "Pointer Value". You might think that it is misnamed because it is described as pointing only to strings. However, it is possible to have it point to other things. For example, it could point to an array of UVs. But, using it for non-strings requires care, as the underlying assumption of much of the internals is that PVs are just for strings. Often, for example, a trailing NUL is tacked on automatically. The non-string use is documented only in this paragraph.)

SV は、1 つのコマンドで生成し、値をロードすることができます。 ロードできる値の型には、整数 (IV)、符号なし整数 (UV)、 倍精度 (NV)、文字列 (PV)、その他のスカラ (SV) があります。 ("PV" は "Pointer Value" の意味です。 文字列だけを指すように表現しているので誤った名称であると考えるかもしれません。 しかし、他のものを指すことも可能です。 例えば、UV の配列を指すこともできます。 しかし、非文字列の使用は注意が必要です; 内部の多くの基となる仮定は、 PV は単に文字列であるというものだからです。 しばしば、例えば、末尾の NUL は自動的に連結されます。 非文字列の使用はこの段落でのみ文書化されています。)

The seven routines are:

これらを行なう、7 つのルーチンは:

    SV*  newSViv(IV);
    SV*  newSVuv(UV);
    SV*  newSVnv(double);
    SV*  newSVpv(const char*, STRLEN);
    SV*  newSVpvn(const char*, STRLEN);
    SV*  newSVpvf(const char*, ...);
    SV*  newSVsv(SV*);

STRLEN is an integer type (Size_t, usually defined as size_t in config.h) guaranteed to be large enough to represent the size of any string that perl can handle.

STRLEN は perl が扱えるどんな文字列のサイズも表現するのに十分なだけの 大きさを持つことが保証されている整数型(Size_t, 普通は config.h で size_t として定義されています)。

In the unlikely case of a SV requiring more complex initialization, you can create an empty SV with newSV(len). If len is 0 an empty SV of type NULL is returned, else an SV of type PV is returned with len + 1 (for the NUL) bytes of storage allocated, accessible via SvPVX. In both cases the SV has the undef value.

あまりなさそうですが、SV がもっと複雑な初期化を必要とする場合、 newSV(len) で空の SV も作成できます。 もし len が 0 なら、NULL 型の空の SV が返され、さもなければ PV 型の SV は、SvPVX でアクセスできる len + 1 (NUL のため) バイトの領域を 割り当てられて返されます。 両方の場合で、SV の値は未定義値です。

    SV *sv = newSV(0);   /* no storage allocated  */
    SV *sv = newSV(10);  /* 10 (+1) bytes of uninitialised storage
                          * allocated */

To change the value of an already-existing SV, there are eight routines:

既に存在する スカラの値を変更するために 8 つのルーチンがあります:

    void  sv_setiv(SV*, IV);
    void  sv_setuv(SV*, UV);
    void  sv_setnv(SV*, double);
    void  sv_setpv(SV*, const char*);
    void  sv_setpvn(SV*, const char*, STRLEN)
    void  sv_setpvf(SV*, const char*, ...);
    void  sv_vsetpvfn(SV*, const char*, STRLEN, va_list *,
                                                    SV **, I32, bool *);
    void  sv_setsv(SV*, SV*);

Notice that you can choose to specify the length of the string to be assigned by using sv_setpvn, newSVpvn, or newSVpv, or you may allow Perl to calculate the length by using sv_setpv or by specifying 0 as the second argument to newSVpv. Be warned, though, that Perl will determine the string's length by using strlen, which depends on the string terminating with a NUL character, and not otherwise containing NULs.

代入すべき文字列の長さを sv_setpvnnewSVpv、あるいは newSVpv を使って指定することもできますし、sv_setpv を使ったり newSVpv の第二引数に 0 を指定することによって、Perl 自身に 文字列の長さを計算させることもできます。 ただし Perl は、NUL 文字で終了していて、それ以外に NUL が 含まれていないということに依存している strlen を使って長さを 計算しているということに注意してください。

The arguments of sv_setpvf are processed like sprintf, and the formatted output becomes the value.

sv_setpvf の引数は sprintf と同じように処理され、書式化された 出力が値となります。

sv_vsetpvfn is an analogue of vsprintf, but it allows you to specify either a pointer to a variable argument list or the address and length of an array of SVs. The last argument points to a boolean; on return, if that boolean is true, then locale-specific information has been used to format the string, and the string's contents are therefore untrustworthy (see perlsec). This pointer may be NULL if that information is not important. Note that this function requires you to specify the length of the format.

sv_vsetpvfnvsprintf と同じようなものですが、可変引数リストに対する ポインタか SV の配列のアドレスと長さのいずれかを指定することができます。 最後の引数は真偽値を指し示します; 関数から返ってきたときにこれが 真であれば、フォーマット文字列としてロケール固有の情報が使われているので その文字列の内容は信頼するできないことを表わしています(perlsec を参照)。 ロケールに関する情報が重要でないのなら、このポインタは NULL であっても かまいません。 この関数はフォーマットの長さを要求していることに注意してください。

The sv_set*() functions are not generic enough to operate on values that have "magic". See "Magic Virtual Tables" later in this document.

sv_set*() 関数群は "magic" を持っている値に対する 操作に対して充分に一般化されたものではありません。 後述する "Magic Virtual Tables" を参照してください。

All SVs that contain strings should be terminated with a NUL character. If it is not NUL-terminated there is a risk of core dumps and corruptions from code which passes the string to C functions or system calls which expect a NUL-terminated string. Perl's own functions typically add a trailing NUL for this reason. Nevertheless, you should be very careful when you pass a string stored in an SV to a C function or system call.

すべてのSV は、必須と言うわけではありませんが NUL キャラクターで 終端されているべきです。 この終端の NUL が無かった場合、コアダンプしたり文字列を (文字列が NUL で終端されていることを期待している) C 関数やシステムコールに 渡すコードをおかしくする危険があります。 Perl 自身の典型的な関数は、この理由により終端に NUL を追加します。 そうであったとしても、あなたが SV に格納されている文字列を C の関数や システムコールに渡す時には十二分に気をつけるべきなのです。

To access the actual value that an SV points to, you can use the macros:

SV が指し示す実際の値をアクセスするには、以下のマクロを使えます:

    SvIV(SV*)
    SvUV(SV*)
    SvNV(SV*)
    SvPV(SV*, STRLEN len)
    SvPV_nolen(SV*)

which will automatically coerce the actual scalar type into an IV, UV, double, or string.

これは実際のスカラの型を自動的に IV や UV や倍精度や文字列にします。

In the SvPV macro, the length of the string returned is placed into the variable len (this is a macro, so you do not use &len). If you do not care what the length of the data is, use the SvPV_nolen macro. Historically the SvPV macro with the global variable PL_na has been used in this case. But that can be quite inefficient because PL_na must be accessed in thread-local storage in threaded Perl. In any case, remember that Perl allows arbitrary strings of data that may both contain NULs and might not be terminated by a NUL.

SvPV マクロでは、返される文字列の長さは、変数 len に格納されます (これはマクロですから、&lenしないで ください)。 もしデータの長さを気にしないのであれば、SvPV_nolen マクロを 使ってください。 歴史的に、この場合にはグローバル変数 PL_naSvPV マクロが 使われてきました。 しかしこれは可能ですが効率は良くありません; なぜなら PL_na はスレッド化した Perl ではスレッドローカルな 領域にアクセスしなければならないからです。 いずれの場合にも、Perl は NUL を含んでいる文字列と NUL で 終端されていないような文字列の両方を扱うことができるということを 覚えておいてください。

Also remember that C doesn't allow you to safely say foo(SvPV(s, len), len);. It might work with your compiler, but it won't work for everyone. Break this sort of statement up into separate assignments:

同様に、Cで foo(SvPV(s, len), len); とすることが安全ではないことを 忘れないでください。 これはあなたの使うコンパイラによってはうまくいきますが、 いつでもそうだとは限らないのです。 そこで、こういったステートメントは以下のように分割します:

    SV *s;
    STRLEN len;
    char *ptr;
    ptr = SvPV(s, len);
    foo(ptr, len);

If you want to know if the scalar value is TRUE, you can use:

単にスカラ値が真かどうかを知りたいだけならば、

    SvTRUE(SV*)

Although Perl will automatically grow strings for you, if you need to force Perl to allocate more memory for your SV, you can use the macro

Perl は、SV にもっとメモリを割り当てて欲しいときには自動的に文字列を 大きくしてくれますが、さらにメモリを割り当てさせることが必要であれば

    SvGROW(SV*, STRLEN newlen)

which will determine if more memory needs to be allocated. If so, it will call the function sv_grow. Note that SvGROW can only increase, not decrease, the allocated memory of an SV and that it does not automatically add space for the trailing NUL byte (perl's own string functions typically do SvGROW(sv, len + 1)).

というマクロが使えます。 もし必要なら、このマクロが sv_growを呼びます。 SvGROW は SV に割り当てたメモリを増やすだけで、減らすことは できないということと、終端の NUL の分のバイトが自動的に加算されない (perl 自身の文字列関数は 大概 SvGROW(sv, len + 1) としています)と いうことに注意してください。

If you want to write to an existing SV's buffer and set its value to a string, use SvPV_force() or one of its variants to force the SV to be a PV. This will remove any of various types of non-stringness from the SV while preserving the content of the SV in the PV. This can be used, for example, to append data from an API function to a buffer without extra copying:

もし既存の SV のバッファに書き込みたくて、その値を文字列に設定したいなら、 SV を PV に強制するために SvPV_force() またはその変種の一つを使ってください。 これは SV から様々な種類の非文字列性を除去する一方、PV の中の SV の 内容は保存します。 これは、例えば、追加のコピーなしに API 関数からバッファにデータを 追加するのに使えます:

    (void)SvPVbyte_force(sv, len);
    s = SvGROW(sv, len + needlen + 1);
    /* something that modifies up to needlen bytes at s+len, but
       modifies newlen bytes
         eg. newlen = read(fd, s + len, needlen);
       ignoring errors for these examples
     */
    s[len + newlen] = '\0';
    SvCUR_set(sv, len + newlen);
    SvUTF8_off(sv);
    SvSETMAGIC(sv);

If you already have the data in memory or if you want to keep your code simple, you can use one of the sv_cat*() variants, such as sv_catpvn(). If you want to insert anywhere in the string you can use sv_insert() or sv_insert_flags().

既にメモリにデータを持っている場合や、コードを単純に保ちたい場合は、 sv_catpvn() のような sv_cat*() の変種の一つを使えます。 もし文字列中のどこかに挿入したいなら、sv_insert() や sv_insert_flags() が使えます。

If you don't need the existing content of the SV, you can avoid some copying with:

SV の既存の内容が必要でないなら、次のようにして一部のコピーを 回避できます:

    sv_setpvn(sv, "", 0);
    s = SvGROW(sv, needlen + 1);
    /* something that modifies up to needlen bytes at s, but modifies
       newlen bytes
         eg. newlen = read(fd, s. needlen);
     */
    s[newlen] = '\0';
    SvCUR_set(sv, newlen);
    SvPOK_only(sv); /* also clears SVf_UTF8 */
    SvSETMAGIC(sv);

Again, if you already have the data in memory or want to avoid the complexity of the above, you can use sv_setpvn().

再び、既にメモリにデータを持っている場合や、前述のような複雑さを 避けたい場合は、sv_setpvn() が使えます。

If you have a buffer allocated with Newx() and want to set that as the SV's value, you can use sv_usepvn_flags(). That has some requirements if you want to avoid perl re-allocating the buffer to fit the trailing NUL:

If you have a buffer allocated with Newx() で割り当てられたバッファを持っていて、それを SV の値として 設定したいなら、sv_usepvn_flags() が使えます。 perl が末尾の NUL に収まるようにバッファを再配置するのを避けたいなら、 いくつかの要求事項があります:

   Newx(buf, somesize+1, char);
   /* ... fill in buf ... */
   buf[somesize] = '\0';
   sv_usepvn_flags(sv, buf, somesize, SV_SMAGIC | SV_HAS_TRAILING_NUL);
   /* buf now belongs to perl, don't release it */

If you have an SV and want to know what kind of data Perl thinks is stored in it, you can use the following macros to check the type of SV you have.

ある SV があって、それに保管されているデータの種類が何であると Perl が考えているかを知りたいなら、 その SV の型をチェックするのに次のようなマクロが使えます。

    SvIOK(SV*)
    SvNOK(SV*)
    SvPOK(SV*)

You can get and set the current length of the string stored in an SV with the following macros:

SV に納められた文字列の現在の長さを取得したり設定したりするのには以下の マクロが使えます。

    SvCUR(SV*)
    SvCUR_set(SV*, I32 val)

You can also get a pointer to the end of the string stored in the SV with the macro:

同様に、SV に格納されている文字列の終端へのポインタを以下のマクロを 使って得ることができます。

    SvEND(SV*)

But note that these last three macros are valid only if SvPOK() is true.

ただし、これらは SvPOK() が真のときだけ有効だということに気を つけてください。

If you want to append something to the end of string stored in an SV*, you can use the following functions:

SV* に格納されている文字列の末尾になにかを追加したいときに以下のような 関数が使えます。

    void  sv_catpv(SV*, const char*);
    void  sv_catpvn(SV*, const char*, STRLEN);
    void  sv_catpvf(SV*, const char*, ...);
    void  sv_vcatpvfn(SV*, const char*, STRLEN, va_list *, SV **,
                                                             I32, bool);
    void  sv_catsv(SV*, SV*);

The first function calculates the length of the string to be appended by using strlen. In the second, you specify the length of the string yourself. The third function processes its arguments like sprintf and appends the formatted output. The fourth function works like vsprintf. You can specify the address and length of an array of SVs instead of the va_list argument. The fifth function extends the string stored in the first SV with the string stored in the second SV. It also forces the second SV to be interpreted as a string.

最初の関数は strlen を使って追加する文字列の長さを計算します。 二番目の関数では、関数を使用する人が文字列の長さを指定します。 三番目の関数はその引数を sprintf の様に処理し、整形された結果を追加します。 四番目の関数は vsprintf のように動作します。 va_list 引数の代わりに、SV の配列のアドレスと長さを指定できます。 五番目の関数は最初の SV にある文字列を二番目の SV にある文字列で拡張します。 また、この関数は二番目の SV を強制的に文字列として解釈します。

The sv_cat*() functions are not generic enough to operate on values that have "magic". See "Magic Virtual Tables" later in this document.

sv_cat*() 関数群は "magic" を持っている値に対する 操作に対して充分に一般化されたものではありません。 後述する "Magic Virtual Tables" を参照してください。

If you know the name of a scalar variable, you can get a pointer to its SV by using the following:

スカラ変数の名前がわかれば、その SV へのポインタは以下のようにして 得られます:

    SV*  get_sv("package::varname", 0);

This returns NULL if the variable does not exist.

これは変数が存在していない場合には NULL を返します。

If you want to know if this variable (or any other SV) is actually defined, you can call:

その変数 (もしくは他の任意の SV) が、実際に 定義されているか を 知りたいならば、

    SvOK(SV*)

The scalar undef value is stored in an SV instance called PL_sv_undef.

スカラの undef 値は、PL_sv_undef という SV のインスタンスに 納められています。

Its address can be used whenever an SV* is needed. Make sure that you don't try to compare a random sv with &PL_sv_undef. For example when interfacing Perl code, it'll work correctly for:

そのアドレスは、SV* が必要とされるところで使用することができます。 任意の sv を &PL_sv_undef を比較しようとしないように気をつけてください。 例えば、Perl コードとのインターフェースで、以下は正しく動きます:

  foo(undef);

But won't work when called as:

しかし、以下のように呼び出すと動作しません:

  $x = undef;
  foo($x);

So to repeat always use SvOK() to check whether an sv is defined.

従って、sv が定義されているかをチェックするために、毎回繰り返して SvOK() を使ってください。

Also you have to be careful when using &PL_sv_undef as a value in AVs or HVs (see "AVs, HVs and undefined values").

また、AV や HV の値として &PL_sv_undef を使うときにも 注意しなければなりません ("AVs, HVs and undefined values" を 参照してください)。

There are also the two values PL_sv_yes and PL_sv_no, which contain boolean TRUE and FALSE values, respectively. Like PL_sv_undef, their addresses can be used whenever an SV* is needed.

真偽値の真と偽を表わす、PL_sv_yesPL_sv_no という値もあります。 PL_sv_undef と同様に、これらのアドレスも SV* が必要なところで 使うことができます。

Do not be fooled into thinking that (SV *) 0 is the same as &PL_sv_undef. Take this code:

(SV *0)&PL_sv_undef が同じであると考えて、だまされてはいけません。 次のようなコードを見てください:

    SV* sv = (SV*) 0;
    if (I-am-to-return-a-real-value) {
            sv = sv_2mortal(newSViv(42));
    }
    sv_setsv(ST(0), sv);

This code tries to return a new SV (which contains the value 42) if it should return a real value, or undef otherwise. Instead it has returned a NULL pointer which, somewhere down the line, will cause a segmentation violation, bus error, or just weird results. Change the zero to &PL_sv_undef in the first line and all will be well.

このコードは、実値を返さなければならないときには、(値として 42 を 持つ) 新しい SV を返そうとし、さもなくば undef を返そうとします。 ですが、どこかの行でヌルポインタを返して、セグメントバイオレーションが 起こるか、何かおかしな結果になってしまいます。 最初の行の 0 を &PL_sv_undef に変えれば、すべてがうまくいきます。

To free an SV that you've created, call SvREFCNT_dec(SV*). Normally this call is not necessary (see "Reference Counts and Mortality").

生成した SV を解放するためには、SvREFCNT_dec(SV*) を呼びます。 普通は、この呼び出しは必要ありません("Reference Counts and Mortality" を 参照してください)。

オフセット

Perl provides the function sv_chop to efficiently remove characters from the beginning of a string; you give it an SV and a pointer to somewhere inside the PV, and it discards everything before the pointer. The efficiency comes by means of a little hack: instead of actually removing the characters, sv_chop sets the flag OOK (offset OK) to signal to other functions that the offset hack is in effect, and it moves the PV pointer (called SvPVX) forward by the number of bytes chopped off, and adjusts SvCUR and SvLEN accordingly. (A portion of the space between the old and new PV pointers is used to store the count of chopped bytes.)

Perl は文字列の先頭から効率的に文字を削除するための関数 sv_chop を 提供されています; これに SV と、PV の内側のどこかへのポインタを渡すと、 そのポインタより手前の全てを削除します。 効率性はちょっとしたハックによるものです: 実際に文字を削除する代わりに、 sv_chop は、他の関数にオフセットハックが有効であることを示す OOK (offset OK) フラグを設定して、 切り落としたバイト数だけ (SvPVX と呼ばれる) PV ポインタを前に進め、 SvCURSvLEN をそれぞれ調整します。 (新旧の PV ポインタの間のスペースの部分は、切り落としたバイト数を 保管するために使われます。)

Hence, at this point, the start of the buffer that we allocated lives at SvPVX(sv) - SvIV(sv) in memory and the PV pointer is pointing into the middle of this allocated storage.

従って、この時点で、割り当てられたバッファの先頭はメモリ中の SvPVX(sv) - SvIV(sv) であり、PV ポインタは割り当てられた保管領域の中間を 指しています。

This is best demonstrated by example. Normally copy-on-write will prevent the substitution from operator from using this hack, but if you can craft a string for which copy-on-write is not possible, you can see it in play. In the current implementation, the final byte of a string buffer is used as a copy-on-write reference count. If the buffer is not big enough, then copy-on-write is skipped. First have a look at an empty string:

This is best demonstrated by example. Normally copy-on-write will prevent the substitution from operator from using this hack, but if you can craft a string for which copy-on-write is not possible, you can see it in play. In the current implementation, the final byte of a string buffer is used as a copy-on-write reference count. If the buffer is not big enough, then copy-on-write is skipped. First have a look at an empty string: (TBT)

  % ./perl -Ilib -MDevel::Peek -le '$a=""; $a .= ""; Dump $a'
  SV = PV(0x7ffb7c008a70) at 0x7ffb7c030390
    REFCNT = 1
    FLAGS = (POK,pPOK)
    PV = 0x7ffb7bc05b50 ""\0
    CUR = 0
    LEN = 10

Notice here the LEN is 10. (It may differ on your platform.) Extend the length of the string to one less than 10, and do a substitution:

ここで、LEN が 10 であることに気付きます。 (プラットフォームによって異なるかもしれません。) 文字列の長さを 10 より一つ小さくして、置換を行います:

  % ./perl -Ilib -MDevel::Peek -le '$a=""; $a.="123456789"; $a=~s/.//; Dump($a)'
  SV = PV(0x7ffa04008a70) at 0x7ffa04030390
    REFCNT = 1
    FLAGS = (POK,OOK,pPOK)
    OFFSET = 1
    PV = 0x7ffa03c05b61 ( "\1" . ) "23456789"\0
    CUR = 8
    LEN = 9

Here the number of bytes chopped off (1) is shown next as the OFFSET. The portion of the string between the "real" and the "fake" beginnings is shown in parentheses, and the values of SvCUR and SvLEN reflect the fake beginning, not the real one. (The first character of the string buffer happens to have changed to "\1" here, not "1", because the current implementation stores the offset count in the string buffer. This is subject to change.)

ここで切り落とされたバイト数 (1) は OFFSET として次に表示されています。 「実際」と「偽物」の開始の間の文字列の部分はかっこで示され、 SvCURSvLEN の値は実際のものではなく偽物の先頭を反映します。 (文字列バッファの最初の文字はここで偶然 "1" ではなく "\1" に変更されました; 現在の実装は文字列バッファのオフセットカウントを保管しているからです。 これは変更される予定です。)

Something similar to the offset hack is performed on AVs to enable efficient shifting and splicing off the beginning of the array; while AvARRAY points to the first element in the array that is visible from Perl, AvALLOC points to the real start of the C array. These are usually the same, but a shift operation can be carried out by increasing AvARRAY by one and decreasing AvFILL and AvMAX. Again, the location of the real start of the C array only comes into play when freeing the array. See av_shift in av.c.

オフセットハックと似たようなものは、配列の先頭の効率的なシフトと切り落としを 有効にするために AV に対しても行われます; AvARRAY は Perl から見える配列の最初の要素を指していますが、AvALLOC は C の配列の実際の先頭を指しています。 これらは普通は同じですが、shift 演算子は AvARRAY を一つ増やして、 AvFILLAvMAX を一つ減らします。 再び、C の配列の実際の先頭の一は、配列を解放するときにだけ使われます。 av.cav_shift を参照してください。

SV に実際に格納されているものは何?

Recall that the usual method of determining the type of scalar you have is to use Sv*OK macros. Because a scalar can be both a number and a string, usually these macros will always return TRUE and calling the Sv*V macros will do the appropriate conversion of string to integer/double or integer/double to string.

自分で保持しているスカラの型を決定する通常の方法は、マクロ Sv*OK を 使うものでした。 スカラは数値にも文字列にもなり得ますから、普通、これらのマクロはいつも真を 返します; そして Sv*V マクロを呼ぶことで、文字列から整数/倍精度、 整数/倍精度から文字列への変換を行ないます。

If you really need to know if you have an integer, double, or string pointer in an SV, you can use the following three macros instead:

もし、本当に SV にあるのが整数か、倍精度か、文字列ポインタかを 知りたいのであれば、以下のようなマクロを代わりに使えます:

    SvIOKp(SV*)
    SvNOKp(SV*)
    SvPOKp(SV*)

These will tell you if you truly have an integer, double, or string pointer stored in your SV. The "p" stands for private.

これらのマクロは、実際に SV に入っているものが整数か、倍精度か、 文字列ポインタかを教えてくれます。 "p" はプライベートの意味です。

There are various ways in which the private and public flags may differ. For example, in perl 5.16 and earlier a tied SV may have a valid underlying value in the IV slot (so SvIOKp is true), but the data should be accessed via the FETCH routine rather than directly, so SvIOK is false. (In perl 5.18 onwards, tied scalars use the flags the same way as untied scalars.) Another is when numeric conversion has occurred and precision has been lost: only the private flag is set on 'lossy' values. So when an NV is converted to an IV with loss, SvIOKp, SvNOKp and SvNOK will be set, while SvIOK wont be.

プライベートと公的なフラグが異なるのは様々な方法があります。 例えば、perl 5.16 以前では、tie された SV は IV スロットに妥当な値を 保持している(従って SvIOKp は真) かもしれませんが、データは直接ではなく FETCH ルーチンを通してアクセスされるべきなため、SvIOK は偽です。 (perl 5.18 以降では、tie されたスカラは tie されていないスカラと同じように フラグを使います。) 他の例としては数値変換が起こり、精度が落ちた場合です:プライベートな フラグのみが「精度が落ちた」値に設定されます。 それで、NV が精度が落ちる形で IV に変換されると、SvIOKp, SvNOKp, SvNOK は 設定されますが、SvIOK は設定されません。

In general, though, it's best to use the Sv*V macros.

しかし一般的には、Sv*V マクロを使うだけにした方が良いでしょう。

AV に対する作業

There are two ways to create and load an AV. The first method creates an empty AV:

AV を生成して値を設定するのには、二つの方法があります。 最初の方法は、単に空の AV を作るものです:

    AV*  newAV();

The second method both creates the AV and initially populates it with SVs:

ふたつめの方法は、AV を生成した上で、初期値として SV の値を入れます:

    AV*  av_make(SSize_t num, SV **ptr);

The second argument points to an array containing num SV*'s. Once the AV has been created, the SVs can be destroyed, if so desired.

二番目の引数は num 個の SV* の配列を指しています。 AV が生成されてしまえば、SV は(それを望むのなら)破棄することができます。

Once the AV has been created, the following operations are possible on it:

いったん AV が生成されると、以下のような操作が行えます:

    void  av_push(AV*, SV*);
    SV*   av_pop(AV*);
    SV*   av_shift(AV*);
    void  av_unshift(AV*, SSize_t num);

These should be familiar operations, with the exception of av_unshift. This routine adds num elements at the front of the array with the undef value. You must then use av_store (described below) to assign values to these new elements.

これらは、av_unshift を除いては、お馴染みの演算でしょう。 av_unshift は、配列の先頭に num 個の undef 値の要素を付け加えます。 その後で、(後述する) av_store を使って新しい要素に値を 代入しなければなりません。

Here are some other functions:

他にもいくつか関数があります:

    SSize_t av_top_index(AV*);
    SV**    av_fetch(AV*, SSize_t key, I32 lval);
    SV**    av_store(AV*, SSize_t key, SV* val);

The av_top_index function returns the highest index value in an array (just like $#array in Perl). If the array is empty, -1 is returned. The av_fetch function returns the value at index key, but if lval is non-zero, then av_fetch will store an undef value at that index. The av_store function stores the value val at index key, and does not increment the reference count of val. Thus the caller is responsible for taking care of that, and if av_store returns NULL, the caller will have to decrement the reference count to avoid a memory leak. Note that av_fetch and av_store both return SV**'s, not SV*'s as their return value.

関数 av_top_index は配列における最高位の添え字を(ちょうど Perl の $#array と 同じように)返します。 もし配列が空であれば、-1 を返します。 関数 av_fetch は添え字 key の位置にある値を返しますが、lval が 非ゼロであれば、av_fetch はその位置に undef を格納しようとします。 関数 av_store は添え字 key の位置に値 val を格納し、val の 参照カウントをインクリメントしません。 従って、呼び出し側はこの振る舞いに注意して対処し、av_store が NULL を返した場合には、メモリリークを防ぐために参照カウントの デクリメントを行う必要があるでしょう。 av_fetchav_store の両方ともがその戻り値として SV* ではなく、SV** を返すということに注意してください。

A few more:

もう少しあります:

    void  av_clear(AV*);
    void  av_undef(AV*);
    void  av_extend(AV*, SSize_t key);

The av_clear function deletes all the elements in the AV* array, but does not actually delete the array itself. The av_undef function will delete all the elements in the array plus the array itself. The av_extend function extends the array so that it contains at least key+1 elements. If key+1 is less than the currently allocated length of the array, then nothing is done.

関数 av_clear は、配列 AV* にあるすべての要素を削除しますが、 配列自身の削除は行いません。 関数 av_undef は配列にあるすべての要素に加え、配列自身の削除も行います。 関数 av_extend は配列を key+1 要素だけ拡張します。 key+1 が配列のその時点での長さより短ければ、何も行なわれません。

If you know the name of an array variable, you can get a pointer to its AV by using the following:

配列変数の名前がわかっているのであれば、次のようにしてその配列に 対応する AV へのポインタが得られます:

    AV*  get_av("package::varname", 0);

This returns NULL if the variable does not exist.

これは変数が存在していない場合には NULL を返します。

See "Understanding the Magic of Tied Hashes and Arrays" for more information on how to use the array access functions on tied arrays.

tie された配列における配列アクセス関数の使い方についての詳細は "Understanding the Magic of Tied Hashes and Arrays" を参照してください。

HV に対する作業

To create an HV, you use the following routine:

HV を生成するには、以下のようなルーチンを使います:

    HV*  newHV();

Once the HV has been created, the following operations are possible on it:

いったん HV が生成されると、以下のような操作が行えます:

    SV**  hv_store(HV*, const char* key, U32 klen, SV* val, U32 hash);
    SV**  hv_fetch(HV*, const char* key, U32 klen, I32 lval);

The klen parameter is the length of the key being passed in (Note that you cannot pass 0 in as a value of klen to tell Perl to measure the length of the key). The val argument contains the SV pointer to the scalar being stored, and hash is the precomputed hash value (zero if you want hv_store to calculate it for you). The lval parameter indicates whether this fetch is actually a part of a store operation, in which case a new undefined value will be added to the HV with the supplied key and hv_fetch will return as if the value had already existed.

引数 klen は、渡される key の長さです (Perl にキーの長さを計算させるために、klen の値として 0 を渡すことは できないということに注意してください)。 引数 val は、設定されるスカラへの SV ポインタを入れ、hash は、 あらかじめ計算したハッシュ値 (hv_store に計算させる場合にはゼロ) です。 引数 lval で、このフェッチ操作が実はストア操作の一部であるかどうかを 示します; ストア操作であれば、新たな未定義値が与えられたキーを伴って HV に追加され、hv_fetch はその値が既に存在していたかのように リターンします。

Remember that hv_store and hv_fetch return SV**'s and not just SV*. To access the scalar value, you must first dereference the return value. However, you should check to make sure that the return value is not NULL before dereferencing it.

hv_storehv_fetch は、SV** を返すもので、SV* ではないことに 注意してください。 スカラ値をアクセスするには、まず戻り値の参照外し(dereference)をする 必要があります。 しかし、その前に返却値が NULL でないことを確認すべきです。

The first of these two functions checks if a hash table entry exists, and the second deletes it.

これら二つの関数の一つ目はハッシュテーブルのエントリが存在するかをチェックし、 二つ目は削除を行います。

    bool  hv_exists(HV*, const char* key, U32 klen);
    SV*   hv_delete(HV*, const char* key, U32 klen, I32 flags);

If flags does not include the G_DISCARD flag then hv_delete will create and return a mortal copy of the deleted value.

flagG_DISCARD フラグが含まれていなければ、hv_delete は 削除された値の揮発性のコピー(mortal copy)を生成し、それを返します。

And more miscellaneous functions:

さらに様々な関数があります:

    void   hv_clear(HV*);
    void   hv_undef(HV*);

Like their AV counterparts, hv_clear deletes all the entries in the hash table but does not actually delete the hash table. The hv_undef deletes both the entries and the hash table itself.

引数に AV を取る似たような関数と同様、hv_clear はハッシュテーブルにある すべてのエントリーを削除しますがハッシュテーブル自身は削除しません。 hv_undef はエントリーとハッシュテーブル自身の両方を削除します。

Perl keeps the actual data in a linked list of structures with a typedef of HE. These contain the actual key and value pointers (plus extra administrative overhead). The key is a string pointer; the value is an SV*. However, once you have an HE*, to get the actual key and value, use the routines specified below.

Perl は実際のデータを HE と typedef された構造体のリンクリストを使って 保持しています。 これらは実際のキーと値のポインタ(それに加えて管理のための ちょっとしたもの)を保持しています。 キーは文字列へのポインタであり、値は SV* です。 しかしながら、一度 HE* を持てば、実際のキーと値とを取得するためには 以下に挙げるようなルーチンを使います。

    I32    hv_iterinit(HV*);
            /* Prepares starting point to traverse hash table */
    HE*    hv_iternext(HV*);
            /* Get the next entry, and return a pointer to a
               structure that has both the key and value */
    char*  hv_iterkey(HE* entry, I32* retlen);
            /* Get the key from an HE structure and also return
               the length of the key string */
    SV*    hv_iterval(HV*, HE* entry);
            /* Return an SV pointer to the value of the HE
               structure */
    SV*    hv_iternextsv(HV*, char** key, I32* retlen);
            /* This convenience routine combines hv_iternext,
               hv_iterkey, and hv_iterval.  The key and retlen
               arguments are return values for the key and its
               length.  The value is returned in the SV* argument */
    I32    hv_iterinit(HV*);
            /* ハッシュテーブルをたどるための開始点を準備 */
    HE*    hv_iternext(HV*);
            /* 次のエントリーを取得して、キーと値両方を持つ構造
               体へのポインタを返す */
    char*  hv_iterkey(HE* entry, I32* retlen);
            /* HE 構造体からキーを取得し、そのキー文字列の長さを
               返す */
    SV*    hv_iterval(HV*, HE* entry);
            /* HE 構造体の値に対する SV ポインタを返す */
    SV*    hv_iternextsv(HV*, char** key, I32* retlen);
            /* この便利なルーチンは、hv_iternext、hv_iterkey、
                hv_itervalを組み合わせたものです。
                引数keyとretlenは、キーとその長さを表わす戻り値です。
                関数の戻り値はSV* で返されます */

If you know the name of a hash variable, you can get a pointer to its HV by using the following:

配列変数の名前がわかるのであれば、以下のようにしてその変数の HV への ポインタが得られます:

    HV*  get_hv("package::varname", 0);

This returns NULL if the variable does not exist.

これは変数が存在していない場合には NULL を返します。

The hash algorithm is defined in the PERL_HASH macro:

ハッシュアルゴリズムは PERL_HASH というマクロで定義されています。

    PERL_HASH(hash, key, klen)

The exact implementation of this macro varies by architecture and version of perl, and the return value may change per invocation, so the value is only valid for the duration of a single perl process.

このマクロの正確な実装はアーキテクチャと perl のバージョンによって異なり、 返り値は起動毎に変わる可能性があります; 従って値は単一の perl プロセスの 間でのみ有効です。

See "Understanding the Magic of Tied Hashes and Arrays" for more information on how to use the hash access functions on tied hashes.

tie されたハッシュに対するハッシュアクセス関数の使い方に関する詳細は、 "Understanding the Magic of Tied Hashes and Arrays" を参照してください。

ハッシュ API 拡張

Beginning with version 5.004, the following functions are also supported:

バージョン 5.004 から、以下の関数がサポートされました。

    HE*     hv_fetch_ent  (HV* tb, SV* key, I32 lval, U32 hash);
    HE*     hv_store_ent  (HV* tb, SV* key, SV* val, U32 hash);

    bool    hv_exists_ent (HV* tb, SV* key, U32 hash);
    SV*     hv_delete_ent (HV* tb, SV* key, I32 flags, U32 hash);

    SV*     hv_iterkeysv  (HE* entry);

Note that these functions take SV* keys, which simplifies writing of extension code that deals with hash structures. These functions also allow passing of SV* keys to tie functions without forcing you to stringify the keys (unlike the previous set of functions).

これらの関数が、ハッシュ構造を扱うエクステンションの記述を単純にする SV* キーを引数にとることに注意してください。 これらの関数はまた、SV* キーを(先に挙げた関数群とは異なり) 文字列化することなしに tie 関数に渡すことを許しています。

They also return and accept whole hash entries (HE*), making their use more efficient (since the hash number for a particular string doesn't have to be recomputed every time). See perlapi for detailed descriptions.

これらの関数はまた、ハッシュエントリー全体 (HE*) を返したり受け付けて、 より効率良く使用します(特定の文字列に対するハッシュ番号は 毎回計算しなおす必要はないからです)。 詳しくは perlapi を参照してください。

The following macros must always be used to access the contents of hash entries. Note that the arguments to these macros must be simple variables, since they may get evaluated more than once. See perlapi for detailed descriptions of these macros.

以下に挙げるマクロは、ハッシュエントリーの内容にアクセスするのに 常に使わなければならないものです。 これらのマクロはその引数を二度以上評価する可能性があるので、マクロに 対する引数は単純な変数でなければならないということに注意してください。 これらのマクロに関する詳細は perlapi を参照してください。

    HePV(HE* he, STRLEN len)
    HeVAL(HE* he)
    HeHASH(HE* he)
    HeSVKEY(HE* he)
    HeSVKEY_force(HE* he)
    HeSVKEY_set(HE* he, SV* sv)

These two lower level macros are defined, but must only be used when dealing with keys that are not SV*s:

低レベルマクロが二つ定義されていますが、これらは SV* ではないキーを 扱うときにのみ使わなければならないものです。

    HeKEY(HE* he)
    HeKLEN(HE* he)

Note that both hv_store and hv_store_ent do not increment the reference count of the stored val, which is the caller's responsibility. If these functions return a NULL value, the caller will usually have to decrement the reference count of val to avoid a memory leak.

hv_storehv_store_ent の両方ともが、val に格納されている 参照カウントのインクリメントをしないということに注意してください; それは呼び出し側の責任です。 これらの関数が NULL を返した場合、呼び出し側はメモリリークを防ぐために、 val の参照カウントのデクリメントを行う必要が一般にはあるでしょう。

AV, HV と未定義値

Sometimes you have to store undefined values in AVs or HVs. Although this may be a rare case, it can be tricky. That's because you're used to using &PL_sv_undef if you need an undefined SV.

AV や HV に未定義値を保管しなければならないこともあります。 これは珍しい場合ですが、手の込んだものになります。 なぜなら、未定義の SV が必要なら、&PL_sv_undef を使うことになるからです。

For example, intuition tells you that this XS code:

例えば、直感ではこの XS コードは:

    AV *av = newAV();
    av_store( av, 0, &PL_sv_undef );

is equivalent to this Perl code:

以下の Perl コードと等価です:

    my @av;
    $av[0] = undef;

Unfortunately, this isn't true. In perl 5.18 and earlier, AVs use &PL_sv_undef as a marker for indicating that an array element has not yet been initialized. Thus, exists $av[0] would be true for the above Perl code, but false for the array generated by the XS code. In perl 5.20, storing &PL_sv_undef will create a read-only element, because the scalar &PL_sv_undef itself is stored, not a copy.

残念ながら、これは正しくありません。 perl 5.18 以前では、AV は、配列要素がまだ初期化されていないことを示すための 印として &PL_sv_undef を使います。 従って、上述の Perl コードは exists $av[0] は真ですが、 XS コードによって生成された配列では偽です。 perl 5.20 では、&PL_sv_undef を保管すると読み込み専用要素が作られます; コピーではなく &PL_sv_undef 自体が保管されるからです。

Similar problems can occur when storing &PL_sv_undef in HVs:

HV に &PL_sv_undef を保管する時にも同様な問題が起こりえます:

    hv_store( hv, "key", 3, &PL_sv_undef, 0 );

This will indeed make the value undef, but if you try to modify the value of key, you'll get the following error:

実際これは undef 値を作りますが、key の値を変更しようとすると、 以下のようなエラーが出ます:

    Modification of non-creatable hash value attempted

In perl 5.8.0, &PL_sv_undef was also used to mark placeholders in restricted hashes. This caused such hash entries not to appear when iterating over the hash or when checking for the keys with the hv_exists function.

perl 5.8.0 では、&PL_sv_undef は制限ハッシュのプレースホルダを マークするためにも使われていました。 これは、ハッシュを反復するときや hv_exists 関数でキーを チェックするときには、そのようなハッシュエントリは現れないということです。

You can run into similar problems when you store &PL_sv_yes or &PL_sv_no into AVs or HVs. Trying to modify such elements will give you the following error:

&PL_sv_yes&PL_sv_no を AV や HV に保管するときにも同じような 問題が起こります。 このような要素を修正しようとすると、以下のようなエラーが出ます:

    Modification of a read-only value attempted

To make a long story short, you can use the special variables &PL_sv_undef, &PL_sv_yes and &PL_sv_no with AVs and HVs, but you have to make sure you know what you're doing.

長い物語を短くすると、特殊変数 &PL_sv_undef, &PL_sv_yes, &PL_sv_no を AV や HV に使えますが、何をしているかを知っている必要が あります。

Generally, if you want to store an undefined value in an AV or HV, you should not use &PL_sv_undef, but rather create a new undefined value using the newSV function, for example:

一般的に、AV や HV に未定義値を保管したいなら、&PL_sv_undef を使わず、 newSV 関数を使って新しい未定義値を使ってください; 例えば:

    av_store( av, 42, newSV(0) );
    hv_store( hv, "foo", 3, newSV(0), 0 );

リファレンス

References are a special type of scalar that point to other data types (including other references).

リファレンスは、(その他リファレンスを含む) 他のスカラ型を指す特別な スカラ型です。

To create a reference, use either of the following functions:

リファレンスを生成するには、

    SV* newRV_inc((SV*) thing);
    SV* newRV_noinc((SV*) thing);

The thing argument can be any of an SV*, AV*, or HV*. The functions are identical except that newRV_inc increments the reference count of the thing, while newRV_noinc does not. For historical reasons, newRV is a synonym for newRV_inc.

thing には、SV*, AV*, HV* のいずれかを置くことができます。 これら二つの関数は、newRV_incthing の参照カウントを インクリメントするけれども newRV_noinc はインクリメントしないという点を 除き、同一です。 歴史的な理由により、newRVnewRV_inc の同義語となっています。

Once you have a reference, you can use the following macro to dereference the reference:

リファレンスができれば、以下のマクロを使ってリファレンスの参照外し (dereference)ができます。

    SvRV(SV*)

then call the appropriate routines, casting the returned SV* to either an AV* or HV*, if required.

というマクロが使うことができ、返された SV*AV*HV* に キャストして、適切なルーチンを呼ぶことになります。

To determine if an SV is a reference, you can use the following macro:

SV がリファレンスであるかどうかを確認するために、以下のマクロを 使うことができます。

    SvROK(SV*)

To discover what type of value the reference refers to, use the following macro and then check the return value.

リファレンスが参照している型を見つけるために、以下のマクロを使いその戻り値を チェックします。

    SvTYPE(SvRV(SV*))

The most useful types that will be returned are:

戻り値として返される型で有益なものは以下の通りです。

    < SVt_PVAV  Scalar
    SVt_PVAV    Array
    SVt_PVHV    Hash
    SVt_PVCV    Code
    SVt_PVGV    Glob (possibly a file handle)
    < SVt_PVAV  スカラ
    SVt_PVAV    配列
    SVt_PVHV    ハッシュ
    SVt_PVCV    コード
    SVt_PVGV    グロブ (ファイルハンドルかも)

See "svtype" in perlapi for more details.

詳しくは "svtype" in perlapi を参照してください。

bless されたリファレンスとクラスオブジェクト

References are also used to support object-oriented programming. In perl's OO lexicon, an object is simply a reference that has been blessed into a package (or class). Once blessed, the programmer may now use the reference to access the various methods in the class.

リファレンスはオブジェクト指向プログラミングをサポートするためにも使われます。 perl のオブジェクト指向用語では、オブジェクトとはパッケージ (もしくはクラス)に bless された単純なリファレンスです。 一度 bless されれば、プログラマーはそのリファレンスをクラスにおける様々な メソッドにアクセスするために使うことができます。

A reference can be blessed into a package with the following function:

以下の関数を使って、リファレンスをパッケージに bless することができます。

    SV* sv_bless(SV* sv, HV* stash);

The sv argument must be a reference value. The stash argument specifies which class the reference will belong to. See "Stashes and Globs" for information on converting class names into stashes.

引数 sv はリファレンス値でなければなりません。 引数 stash はリファレンスが属するクラスを指定します。 クラス名のstashへの変換についての詳細は "Stashes and Globs" を 参照してください。

/* Still under construction */

/* Still under construction */

The following function upgrades rv to reference if not already one. Creates a new SV for rv to point to. If classname is non-null, the SV is blessed into the specified class. SV is returned.

以下の関数は、まだ存在していなければ、rv をリファレンスにアップグレードします。 rv が指し示すための新たな SV を生成します。 classname がヌルでなければ、SV は指定されたクラスに bless されます。 SV が返されます。

        SV* newSVrv(SV* rv, const char* classname);

The following three functions copy integer, unsigned integer or double into an SV whose reference is rv. SV is blessed if classname is non-null.

以下の三つの関数は、整数、符号なし整数、倍精度実数を rv が参照している SV へ コピーします。 SV は classname がヌルでなければ bless されます。

        SV* sv_setref_iv(SV* rv, const char* classname, IV iv);
        SV* sv_setref_uv(SV* rv, const char* classname, UV uv);
        SV* sv_setref_nv(SV* rv, const char* classname, NV iv);

The following function copies the pointer value (the address, not the string!) into an SV whose reference is rv. SV is blessed if classname is non-null.

以下の関数は、ポインタ値(アドレスであって、文字列ではありません!)を rv が 参照している SV へコピーします。 SV は classname がヌルでなければ bless されます。

        SV* sv_setref_pv(SV* rv, const char* classname, void* pv);

The following function copies a string into an SV whose reference is rv. Set length to 0 to let Perl calculate the string length. SV is blessed if classname is non-null.

以下の関数は、文字列を rv が参照している SV へコピーします。 length に 0 を設定すると、Perl が文字列の長さを計算します。 SV は classname がヌルでなければ bless されます。

    SV* sv_setref_pvn(SV* rv, const char* classname, char* pv,
                                                         STRLEN length);

The following function tests whether the SV is blessed into the specified class. It does not check inheritance relationships.

以下の関数は、SV が特定のクラスに bless されているかどうかを検査します。 これは継承の関係のチェックはしません。

        int  sv_isa(SV* sv, const char* name);

The following function tests whether the SV is a reference to a blessed object.

以下の関数は、SV が bless されたオブジェクトのリファレンスであるかどうかを 検査します。

        int  sv_isobject(SV* sv);

The following function tests whether the SV is derived from the specified class. SV can be either a reference to a blessed object or a string containing a class name. This is the function implementing the UNIVERSAL::isa functionality.

以下の関数は、SV が特定のクラスから派生したものがどうかを検査します。 SV は bless されたオブジェクトのリファレンスでも、 クラス名を保持している文字列であってもかまいません。 これは UNIVERSAL::isa の機能を実装している関数です。

        bool sv_derived_from(SV* sv, const char* name);

To check if you've got an object derived from a specific class you have to write:

ある特定のクラスの派生オブジェクトを受け取ったかどうか検査するには、 以下のように書く必要があります。

        if (sv_isobject(sv) && sv_derived_from(sv, class)) { ... }

新しい変数の作成

To create a new Perl variable with an undef value which can be accessed from your Perl script, use the following routines, depending on the variable type.

Perl スクリプトからアクセスできる未定義値を持つ新たな Perl の変数を 生成するには、以下に示すルーチンを変数の型に応じて使います。

    SV*  get_sv("package::varname", GV_ADD);
    AV*  get_av("package::varname", GV_ADD);
    HV*  get_hv("package::varname", GV_ADD);

Notice the use of GV_ADD as the second parameter. The new variable can now be set, using the routines appropriate to the data type.

二番目のパラメータとして GV_ADD を使っているということに注意してください。 新しい変数はここでデータ型に対する適切なルーチンを使うことで設定できます。

There are additional macros whose values may be bitwise OR'ed with the GV_ADD argument to enable certain extra features. Those bits are:

GV_ADD 引数とビット和を取って、幾つかの追加機能を有効とするような 二つのマクロがあります。 ビットは以下の通りです:

GV_ADDMULTI

Marks the variable as multiply defined, thus preventing the:

変数に多重定義 (multiply defined) であると印を付け:

  Name <varname> used only once: possible typo

warning.

警告を防ぎます。

GV_ADDWARN

Issues the warning:

以下の警告を:

  Had to create <varname> unexpectedly

if the variable did not exist before the function was called.

変数が、その関数の呼び出し以前に存在してなかった場合に発生させます。

If you do not specify a package name, the variable is created in the current package.

パッケージ名を指定しなかった場合、変数はカレントパッケージで生成されます。

参照カウントと揮発性

Perl uses a reference count-driven garbage collection mechanism. SVs, AVs, or HVs (xV for short in the following) start their life with a reference count of 1. If the reference count of an xV ever drops to 0, then it will be destroyed and its memory made available for reuse.

Perl は参照カウント駆動(reference count-driven)のガベージコレクション 機構を使用しています。 SV、AV、そしてHV(以下 xV と省略します) はその一生を参照カウント 1 から始めます。 xV の参照カウントが 0 まで落ちた場合、そのリファレンスは破棄されて、 それが使っていたメモリは再利用できるようにされます。

This normally doesn't happen at the Perl level unless a variable is undef'ed or the last variable holding a reference to it is changed or overwritten. At the internal level, however, reference counts can be manipulated with the following macros:

これは、Perl レベルにおいては、変数が undef されるとかリファレンスを 保持している最後の変数が変更されたとか上書きされるということがない限りは 起こりません。 しかし内部的には、参照カウントは以下に挙げるマクロを使って操作できます。

    int SvREFCNT(SV* sv);
    SV* SvREFCNT_inc(SV* sv);
    void SvREFCNT_dec(SV* sv);

However, there is one other function which manipulates the reference count of its argument. The newRV_inc function, you will recall, creates a reference to the specified argument. As a side effect, it increments the argument's reference count. If this is not what you want, use newRV_noinc instead.

その引数の参照カウントを操作する別の関数が一つあります。 newRV_inc という関数がそれです。 これは指定された引数の参照を生成して、その副作用として引数の 参照カウントをインクリメントします。 もしこの副作用が邪魔であれば、newRV_noinc を代わりに使ってください。

For example, imagine you want to return a reference from an XSUB function. Inside the XSUB routine, you create an SV which initially has a reference count of one. Then you call newRV_inc, passing it the just-created SV. This returns the reference as a new SV, but the reference count of the SV you passed to newRV_inc has been incremented to two. Now you return the reference from the XSUB routine and forget about the SV. But Perl hasn't! Whenever the returned reference is destroyed, the reference count of the original SV is decreased to one and nothing happens. The SV will hang around without any way to access it until Perl itself terminates. This is a memory leak.

たとえば、XSUB 関数からリファレンスを返したいと思ったとしましょう。 XSUB ルーチンの中で、初期値として参照カウント 1 を持つ SV を生成します。 それから今作成した SV を引数にして newRV_inc を呼びます。 これは新たな SV としての参照を返しますが、newRV_inc に引数として渡した SV の参照カウントは 2 にインクリメントされます。 ここで XSUB ルーチンからそのリファレンスを戻り値として返し、SV のことは 忘れましょう。 けれども Perl は忘れてません! 戻り値で返されたリファレンスが破棄されたときにはいつも、元々の SV の 参照カウントが 1 へと減じられ、そして何事もおこりません。 その SV は、Perl 自身が終了するまではそれにアクセスするなんの手段も 持たずに中ぶらりんになります。 これはメモリリークです。

The correct procedure, then, is to use newRV_noinc instead of newRV_inc. Then, if and when the last reference is destroyed, the reference count of the SV will go to zero and it will be destroyed, stopping any memory leak.

ここでの正しい手順は、newRV_inc ではなく newRV_noinc を 使うということです。 これによって、最後のリファレンスが破棄されたときに SV の参照カウントは 0 となってその SV が破棄されて、メモリリークを食い止めます。

There are some convenience functions available that can help with the destruction of xVs. These functions introduce the concept of "mortality". An xV that is mortal has had its reference count marked to be decremented, but not actually decremented, until "a short time later". Generally the term "short time later" means a single Perl statement, such as a call to an XSUB function. The actual determinant for when mortal xVs have their reference count decremented depends on two macros, SAVETMPS and FREETMPS. See perlcall and perlxs for more details on these macros.

xV を破棄するのを助けるような便利な関数が幾つかあります。 これらの関数は「揮発性」(mortality) のコンセプトを導入します。 ある揮発性の xV はその参照カウントをデクリメントするようにマークしますが、 実際には「ちょっと後」(a short time later)までデクリメントが行なわれません。 一般的には、「ちょっと後」とは、XSUB 関数の呼び出しのような Perl の一つの文です。 揮発性の xV が持っている参照カウントのデクリメントを行うタイミングの決定は 二つのマクロ、SAVETMPS と FREETMPS に依存しています。 これら二つのマクロについての説明は perlcallperlxs を参照してください。

"Mortalization" then is at its simplest a deferred SvREFCNT_dec. However, if you mortalize a variable twice, the reference count will later be decremented twice.

「揮発化」("Mortalization") はそれから、SvREFCNT_dec に決定権を委ねます。 しかし、ある変数を二度揮発的にした場合、その参照カウントは後で 二度デクリメントされます。

"Mortal" SVs are mainly used for SVs that are placed on perl's stack. For example an SV which is created just to pass a number to a called sub is made mortal to have it cleaned up automatically when it's popped off the stack. Similarly, results returned by XSUBs (which are pushed on the stack) are often made mortal.

「揮発性」SV は主に、perl のスタックに置かれる SV に対して使われます。 例えば、単に数値を呼び出したサブルーチンに渡すために作られた SV は スタックからポップされたときに自動的に片付けられるように揮発性になります。 同様に、(スタックにプッシュされた) XSUB から返された結果はしばしば 揮発性となります。

To create a mortal variable, use the functions:

揮発性の変数を生成するには、以下の関数を使います:

    SV*  sv_newmortal()
    SV*  sv_2mortal(SV*)
    SV*  sv_mortalcopy(SV*)

The first call creates a mortal SV (with no value), the second converts an existing SV to a mortal SV (and thus defers a call to SvREFCNT_dec), and the third creates a mortal copy of an existing SV. Because sv_newmortal gives the new SV no value, it must normally be given one via sv_setpv, sv_setiv, etc. :

最初のものは(値のない)揮発性の SV を生成し、ふたつめは既にある SV を 揮発性の SV に変換します(そして、このために SvREFCNT_dec を呼び出しを 遅らせます); 三つめは、既に存在する SV の揮発性のコピーを生成します。 sv_newmortal は値のない新しい SV を作るので、普通は sv_setpv, sv_setiv などを使って作らなければなりません:

    SV *tmp = sv_newmortal();
    sv_setiv(tmp, an_integer);

As that is multiple C statements it is quite common so see this idiom instead:

これは C の複数文なので、代わりにこの慣用法がとても一般的です:

    SV *tmp = sv_2mortal(newSViv(an_integer));

You should be careful about creating mortal variables. Strange things can happen if you make the same value mortal within multiple contexts, or if you make a variable mortal multiple times. Thinking of "Mortalization" as deferred SvREFCNT_dec should help to minimize such problems. For example if you are passing an SV which you know has a high enough REFCNT to survive its use on the stack you need not do any mortalization. If you are not sure then doing an SvREFCNT_inc and sv_2mortal, or making a sv_mortalcopy is safer.

揮発性の変数を生成するに当たっては十分注意すべきです。 もし、同じ変数を複合コンテキストの中で揮発性にしたり、ある変数を複数回 揮発性にしてしまったりすればおかしな自体が起こるかもしれません。 保留した SvREFCNT_dec として「揮発化」を考えるとこのような問題を 最小化する助けになるでしょう。 例えば、スタック上で使っても生き残るのに十分に大きな REFCNT を持つと 知っている SV を渡す場合、揮発化は不要です。 SvREFCNT_incsv_2mortal をするかどうかはっきりしないときは、 sv_mortalcopy を作るのがより安全です。

The mortal routines are not just for SVs; AVs and HVs can be made mortal by passing their address (type-casted to SV*) to the sv_2mortal or sv_mortalcopy routines.

揮発性のルーチンは、単に SV のためだけではありません; AV や HV も、sv_2mortalsv_mortalcopy ルーチンに、アドレスを (SV* にキャストして) 渡すことで、揮発性にすることができます。

スタッシュとグロブ

A stash is a hash that contains all variables that are defined within a package. Each key of the stash is a symbol name (shared by all the different types of objects that have the same name), and each value in the hash table is a GV (Glob Value). This GV in turn contains references to the various objects of that name, including (but not limited to) the following:

スタッシュ ("stash")とは、パッケージ内で定義された全ての変数が 入っているハッシュのことです。 ハッシュテーブルにあるそれぞれの key は、(同じ名前のすべての異なる型の オブジェクトで共有される) シンボル名で、ハッシュテーブルの個々の 値は、(グローバル値のための) GV と呼ばれます。 GV には、以下のものを含む (これらに限りませんが)、その名前の様々な オブジェクトへのリファレンスが次々に入ることになります。

    Scalar Value
    Array Value
    Hash Value
    I/O Handle
    Format
    Subroutine

There is a single stash called PL_defstash that holds the items that exist in the main package. To get at the items in other packages, append the string "::" to the package name. The items in the Foo package are in the stash Foo:: in PL_defstash. The items in the Bar::Baz package are in the stash Baz:: in Bar::'s stash.

main パッケージにあるアイテムを保持する PL_defstash と呼ばれる スタッシュがあります。 他のパッケージにあるアイテムを取得するには、パッケージ名に「::」を付加します。 Foo というパッケージにあるアイテムは PL_defstash の Foo:: という スタッシュの中にあります。 パッケージ Bar::Baz にあるアイテムは Bar:: のスタッシュの中の Baz:: のスタッシュの中にあります。

To get the stash pointer for a particular package, use the function:

特定のパッケージの HV ポインタの入手には、以下の関数が使えます:

    HV*  gv_stashpv(const char* name, I32 flags)
    HV*  gv_stashsv(SV*, I32 flags)

The first function takes a literal string, the second uses the string stored in the SV. Remember that a stash is just a hash table, so you get back an HV*. The flags flag will create a new package if it is set to GV_ADD.

最初の関数が、リテラル文字列をとり、二番目が SV に入れた文字列を使います。 stash は単なるハッシュなので、HV* を受け取るということを 忘れないでください。 flags フラグが GV_ADD にセットされている場合には新たなパッケージを 生成します。

The name that gv_stash*v wants is the name of the package whose symbol table you want. The default package is called main. If you have multiply nested packages, pass their names to gv_stash*v, separated by :: as in the Perl language itself.

gv_stash*v が要求する name はシンボルテーブルを手に入れようとする パッケージの名前です。 デフォルトのパッケージは、main というものです。 多重にネストしたパッケージであれば、Perl での場合と同様に、 :: で区切って gv_stash*v に名前を渡すのが正しい方法です。

Alternately, if you have an SV that is a blessed reference, you can find out the stash pointer by using:

あるいは、もし bless されたリファレンスである SV があれば、 以下のようにしてを使ってもスタッシュポインタを探すことができ:

    HV*  SvSTASH(SvRV(SV*));

then use the following to get the package name itself:

パッケージ名自身は、以下のようにして得られます:

    char*  HvNAME(HV* stash);

If you need to bless or re-bless an object you can use the following function:

Perl スクリプトへ bless された値を返す必要があれば、以下の関数が使えます:

    SV*  sv_bless(SV*, HV* stash)

where the first argument, an SV*, must be a reference, and the second argument is a stash. The returned SV* can now be used in the same way as any other SV.

最初の引数 SV* はリファレンスで、二番目の引数がスタッシュです。 返された SV* は、他の SV と同様に使うことができます。

For more information on references and blessings, consult perlref.

リファレンスと bless についてのより詳しい情報は perlref を 参照してください。

二重型 SV

Scalar variables normally contain only one type of value, an integer, double, pointer, or reference. Perl will automatically convert the actual scalar data from the stored type into the requested type.

スカラ変数は通常、整数、倍精度、ポインタ、リファレンスのうちの いずれか一つの型をとります。 Perl は実際のデータに対して、蓄積されている型から要求されている型へ、 自動的に変換を行ないます。

Some scalar variables contain more than one type of scalar data. For example, the variable $! contains either the numeric value of errno or its string equivalent from either strerror or sys_errlist[].

ある種のスカラ変数は、複数の型のスカラデータを持つようになっています。 たとえば変数 $! は、errno の数値としての値と、 strerrorsys_errlist[] から得たのと同値な文字列を持っています。

To force multiple data values into an SV, you must do two things: use the sv_set*v routines to add the additional scalar type, then set a flag so that Perl will believe it contains more than one type of data. The four macros to set the flags are:

SV に複数のデータ値を入れるようにするには、二つのことをしなくてはなりません: スカラ型を別に追加するために sv_set*v ルーチンを使用すること; それから、 フラグを設定して Perl に複数のデータを持っていることを知らせることです。 フラグを設定するための四つのマクロは以下のものです:

        SvIOK_on
        SvNOK_on
        SvPOK_on
        SvROK_on

The particular macro you must use depends on which sv_set*v routine you called first. This is because every sv_set*v routine turns on only the bit for the particular type of data being set, and turns off all the rest.

使用するマクロは、最初にどの sv_set*v ルーチンを呼ぶのかに 関わってきます。 これは、sv_set*v ルーチンはすべて特定のデータ型のビットだけを 設定して、他をクリアしてしまうからです。

For example, to create a new Perl variable called "dberror" that contains both the numeric and descriptive string error values, you could use the following code:

たとえば、"dberror" という新しい Perl 変数を作って、エラー値を数値と メッセージ文字列で持つようにするには、以下のように書きます:

    extern int  dberror;
    extern char *dberror_list;

    SV* sv = get_sv("dberror", GV_ADD);
    sv_setiv(sv, (IV) dberror);
    sv_setpv(sv, dberror_list[dberror]);
    SvIOK_on(sv);

If the order of sv_setiv and sv_setpv had been reversed, then the macro SvPOK_on would need to be called instead of SvIOK_on.

sv_setivsv_setpv の順序が逆であった場合、SvIOK_on マクロの 代わりに SvPOK_on マクロを呼ばなければなりません。

読み込み専用値

In Perl 5.16 and earlier, copy-on-write (see the next section) shared a flag bit with read-only scalars. So the only way to test whether sv_setsv, etc., will raise a "Modification of a read-only value" error in those versions is:

Perl 5.16 以前では、コピーオンライト (次章参照) は読み込み専用スカラと フラグビットを共有していました。 従って、これらのバージョンで sv_setsv などが "Modification of a read-only value" エラーを発生させるかどうかを テストする唯一の方法は次のようなものです:

    SvREADONLY(sv) && !SvIsCOW(sv)

Under Perl 5.18 and later, SvREADONLY only applies to read-only variables, and, under 5.20, copy-on-write scalars can also be read-only, so the above check is incorrect. You just want:

Perl 5.18 以降では、SvREADONLY は読み込み専用変数にのみ適用され、 5.20 では、コピーオンライトスカラもまた読み込み専用なので、 前述のチェックは正しくありません。 単に次のようにしてください:

    SvREADONLY(sv)

If you need to do this check often, define your own macro like this:

これをチェックをしょっちゅう行う必要がある場合、次のようにして 独自のマクロをチェックしてください:

    #if PERL_VERSION >= 18
    # define SvTRULYREADONLY(sv) SvREADONLY(sv)
    #else
    # define SvTRULYREADONLY(sv) (SvREADONLY(sv) && !SvIsCOW(sv))
    #endif

コピーオンライト

Perl implements a copy-on-write (COW) mechanism for scalars, in which string copies are not immediately made when requested, but are deferred until made necessary by one or the other scalar changing. This is mostly transparent, but one must take care not to modify string buffers that are shared by multiple SVs.

Perl は、スカラに関してコピーオンライト (COW) 機構を実装しています; これは、文字列のコピーは要求されたときにすぐに行うのではなく、 どちらかのスカラが変更されることによって必要になるまで遅延させます。 これはほとんど透過ですが、複数の SV で共有されている文字列バッファを 変更しないように注意しなければなりません。

You can test whether an SV is using copy-on-write with SvIsCOW(sv).

ある SV がコピーオンライトを使っているかどうかは SvIsCOW(sv) で テストできます。

You can force an SV to make its own copy of its string buffer by calling sv_force_normal(sv) or SvPV_force_nolen(sv).

sv_force_normal(sv) か SvPV_force_nolen(sv) を呼び出すことで、 SV が文字列に関して自分自身のコピーを持つように強制できます。

If you want to make the SV drop its string buffer, use sv_force_normal_flags(sv, SV_COW_DROP_PV) or simply sv_setsv(sv, NULL).

SV に自分自身の文字列バッファを捨てさせたい場合は、 sv_force_normal_flags(sv, SV_COW_DROP_PV) か、単に sv_setsv(sv, NULL) を使います。

All of these functions will croak on read-only scalars (see the previous section for more on those).

これら全ての関数は、読み込み専用スカラに対しては croak します (これに関する詳細は前の節を参照してください)。

To test that your code is behaving correctly and not modifying COW buffers, on systems that support mmap(2) (i.e., Unix) you can configure perl with -Accflags=-DPERL_DEBUG_READONLY_COW and it will turn buffer violations into crashes. You will find it to be marvellously slow, so you may want to skip perl's own tests.

あなたのコードが正しく振る舞って、COW バッファを変更していないことを テストするには、 mmap(2) に対応しているシステム (例えば Unix) では、 -Accflags=-DPERL_DEBUG_READONLY_COW を有効にした perl を設定すると、 バッファ違反でクラッシュするようになります。 これは驚くほど遅いので、perl 自身のテストは飛ばした方が良いでしょう。

マジック変数

[This section still under construction. Ignore everything here. Post no bills. Everything not permitted is forbidden.]

[この節はまだ作成中です。 ここにある全ては無視してください。 張り紙禁止。 許可されていないこと全ては禁止。]

Any SV may be magical, that is, it has special features that a normal SV does not have. These features are stored in the SV structure in a linked list of struct magic's, typedef'ed to MAGIC.

すべての SV は magical、つまり、通常の SV が持っていないような特殊な 属性を持つようにすることができます。 これらの属性は MAGIC として typedef されている struct magic の リンクリストにある SV 構造体に格納されます。

    struct magic {
        MAGIC*      mg_moremagic;
        MGVTBL*     mg_virtual;
        U16         mg_private;
        char        mg_type;
        U8          mg_flags;
        I32         mg_len;
        SV*         mg_obj;
        char*       mg_ptr;
    };

Note this is current as of patchlevel 0, and could change at any time.

これは、パッチレベル 0 の時点でのものです; 変更される可能性があります。

マジックの代入

Perl adds magic to an SV using the sv_magic function:

Perl は sv_magic 関数を使った SV にマジックを追加します。

  void sv_magic(SV* sv, SV* obj, int how, const char* name, I32 namlen);

The sv argument is a pointer to the SV that is to acquire a new magical feature.

引数 sv は、新たにマジック機能を獲得する SV へのポインタです。

If sv is not already magical, Perl uses the SvUPGRADE macro to convert sv to type SVt_PVMG. Perl then continues by adding new magic to the beginning of the linked list of magical features. Any prior entry of the same type of magic is deleted. Note that this can be overridden, and multiple instances of the same type of magic can be associated with an SV.

sv がまだマジカルでなければ、Perl は svSVt_PVMG に 変換するために SvUPGRADE を使います。 Perl はそれから、マジック機能のリンクリストの先頭にそれを追加します。 以前に存在していた同じタイプのマジックは削除されます。 これはオーバーライドすることができ、複数の同じ型のマジックのインスタンスを 一つの SV に結び付けることができるということに注意してください。

The name and namlen arguments are used to associate a string with the magic, typically the name of a variable. namlen is stored in the mg_len field and if name is non-null then either a savepvn copy of name or name itself is stored in the mg_ptr field, depending on whether namlen is greater than zero or equal to zero respectively. As a special case, if (name && namlen == HEf_SVKEY) then name is assumed to contain an SV* and is stored as-is with its REFCNT incremented.

引数 namenamlen はある文字列と magic とを結び付けるために 使われます; 典型的には変数の名前です。 namlenmg_len フィールドに格納され、name がヌルなら、 namlen が 0 より大きいか、0 かに依存して、それぞれ namesavepvn コピーか、name 自身に保管されます。 特殊な場合として、(name && namlen == HEf_SVKEY) なら nameSV* を含んでいるものと仮定して REFCNT をインクリメントして そのままの形で保管されます。

The sv_magic function uses how to determine which, if any, predefined "Magic Virtual Table" should be assigned to the mg_virtual field. See the "Magic Virtual Tables" section below. The how argument is also stored in the mg_type field. The value of how should be chosen from the set of macros PERL_MAGIC_foo found in perl.h. Note that before these macros were added, Perl internals used to directly use character literals, so you may occasionally come across old code or documentation referring to 'U' magic rather than PERL_MAGIC_uvar for example.

関数 sv_magic は how を、あらかじめ定義されている マジック仮想テーブル("Magic Virtual Table") のどれを mg_virtual フィールドに設定するかを決定するのに使います。 後述する "Magic Virtual Tables" の節を参照してください。 how 引数もまた mg_type フィールドに保管されます。 how の値は perl.h にある PERL_MAGIC_foo マクロの集合から 選ばれるべきです。 これらのマクロが追加される前は、Perl の内部では文字リテラルを直接 使っていたので、古いコードや文書では例えば PERL_MAGIC_uvar の 代わりに 'U' マジックを使っているものに出会うことがあるかもしれません。

The obj argument is stored in the mg_obj field of the MAGIC structure. If it is not the same as the sv argument, the reference count of the obj object is incremented. If it is the same, or if the how argument is PERL_MAGIC_arylen, or if it is a NULL pointer, then obj is merely stored, without the reference count being incremented.

引数 objMAGIC 構造体の mg_obj フィールドに格納されます。 これが sv 引数と同じでなかった場合、obj の参照カウントは インクリメントされます。 同じであった場合、もしくは引数 howPERL_MAGIC_arylen かヌルポインタであった場合には、obj は 参照カウントのインクリメントをさせることなく格納されます。

See also sv_magicext in perlapi for a more flexible way to add magic to an SV.

SV にマジックを追加する、より柔軟な方法については perlapisv_magicext も参照してください。

There is also a function to add magic to an HV:

同様に HV にマジックを付加する関数があります。

    void hv_magic(HV *hv, GV *gv, int how);

This simply calls sv_magic and coerces the gv argument into an SV.

これは単純に sv_magic を呼び出し、引数 gv を強制的に SV にします。

To remove the magic from an SV, call the function sv_unmagic:

SV からマジックを取り除くには、sv_unmagic という関数を呼び出します。

    int sv_unmagic(SV *sv, int type);

The type argument should be equal to the how value when the SV was initially made magical.

引数 type は、SV が magical にされたときの how の値と同じに なるようにすべきです。

However, note that sv_unmagic removes all magic of a certain type from the SV. If you want to remove only certain magic of a type based on the magic virtual table, use sv_unmagicext instead:

しかし、sv_unmagicSV から、ある type の全てのマジックを 削除することに注意してください。 マジック下層テーブルを基に type の特定のマジックのみを削除したい場合は、 代わりに sv_unmagicext を使ってください:

    int sv_unmagicext(SV *sv, int type, MGVTBL *vtbl);

マジック仮想テーブル

The mg_virtual field in the MAGIC structure is a pointer to an MGVTBL, which is a structure of function pointers and stands for "Magic Virtual Table" to handle the various operations that might be applied to that variable.

MAGIC 構造体の mg_virtual フィールドは MGVTBL へのポインタで、 これは関数ポインタの構造体であり、また対応する変数に対して 適用される可能性のあるさまざまな操作を扱うための 「マジック仮想テーブル」("Magic Virtual Table") を意味しています。

The MGVTBL has five (or sometimes eight) pointers to the following routine types:

MGVTBL は、以下に挙げる 5 種類(あるいは時々 8 種類)の ポインタを持っています。

    int  (*svt_get)(SV* sv, MAGIC* mg);
    int  (*svt_set)(SV* sv, MAGIC* mg);
    U32  (*svt_len)(SV* sv, MAGIC* mg);
    int  (*svt_clear)(SV* sv, MAGIC* mg);
    int  (*svt_free)(SV* sv, MAGIC* mg);

    int  (*svt_copy)(SV *sv, MAGIC* mg, SV *nsv,
                                          const char *name, I32 namlen);
    int  (*svt_dup)(MAGIC *mg, CLONE_PARAMS *param);
    int  (*svt_local)(SV *nsv, MAGIC *mg);

This MGVTBL structure is set at compile-time in perl.h and there are currently 32 types. These different structures contain pointers to various routines that perform additional actions depending on which function is being called.

この MGVTBL は perl.h の中でコンパイル時に設定され、現在 32 の型が あります。 これらの異なった構造体は、関数が呼び出されたときに依存して追加動作を 行うような様々なルーチンへのポインタを保持しています。

   Function pointer    Action taken
   ----------------    ------------
   svt_get             Do something before the value of the SV is
                       retrieved.
   svt_set             Do something after the SV is assigned a value.
   svt_len             Report on the SV's length.
   svt_clear           Clear something the SV represents.
   svt_free            Free any extra storage associated with the SV.
   関数ポインタ        その振る舞い
   ----------------    ------------
   svt_get             SV の値が取得された前に何かを行う。
   svt_set             SV に値を代入した後で何かを行う。
   svt_len             SV の長さを報告する。
   svt_clear           SV が表わしているものををクリアする。
   svt_free            SV に結び付けられてい領域を解放する。
   svt_copy            copy tied variable magic to a tied element
   svt_dup             duplicate a magic structure during thread cloning
   svt_local           copy magic to local value during 'local'
   svt_copy            tie された変数のマジックを tie された要素にコピーする
   svt_dup             スレッドのクローン化中にマジック構造体を複製する
   svt_local           'local' 中にマジックをローカル変数にコピーする

For instance, the MGVTBL structure called vtbl_sv (which corresponds to an mg_type of PERL_MAGIC_sv) contains:

たとえば、vtbl_sv (PERL_MAGIC_svmg_type に対応します)と 呼ばれる MGVTBL 構造体の内容は以下の様になっています。

    { magic_get, magic_set, magic_len, 0, 0 }

Thus, when an SV is determined to be magical and of type PERL_MAGIC_sv, if a get operation is being performed, the routine magic_get is called. All the various routines for the various magical types begin with magic_. NOTE: the magic routines are not considered part of the Perl API, and may not be exported by the Perl library.

したがって、ある SV がマジカルであると決定されてその型が PERL_MAGIC_sv であったとき、操作が実行されたならば、magic_get が 呼び出されます。 マジカル型に対するルーチンはすべて、magic_ で始まります。 NOTE: マジックルーチンは Perl API の一部として扱われず、 Perl ライブラリによってエクスポートされません。

The last three slots are a recent addition, and for source code compatibility they are only checked for if one of the three flags MGf_COPY, MGf_DUP or MGf_LOCAL is set in mg_flags. This means that most code can continue declaring a vtable as a 5-element value. These three are currently used exclusively by the threading code, and are highly subject to change.

末尾の三つのスロットは最近追加されたもので、ソースコードの互換性のために、 mg_flags に MGf_COPY, MGf_DUP, MGf_LOCAL のいずれか一つが設定されている 場合にのみチェックされます。 これは、ほとんどのコードは vtable を 5 要素の値として定義したままで よいということです。 これらの三つは現在のところスレッドのコードのみで使われていて、 変更される可能性が高いです。

The current kinds of Magic Virtual Tables are:

現時点でのMagic Virtual Tables の種類は以下の通りです。

 mg_type
 (old-style char and macro)   MGVTBL         Type of magic
 --------------------------   ------         -------------
 \0 PERL_MAGIC_sv             vtbl_sv        Special scalar variable
 #  PERL_MAGIC_arylen         vtbl_arylen    Array length ($#ary)
 %  PERL_MAGIC_rhash          (none)         Extra data for restricted
                                             hashes
 *  PERL_MAGIC_debugvar       vtbl_debugvar  $DB::single, signal, trace
                                             vars
 .  PERL_MAGIC_pos            vtbl_pos       pos() lvalue
 :  PERL_MAGIC_symtab         (none)         Extra data for symbol
                                             tables
 <  PERL_MAGIC_backref        vtbl_backref   For weak ref data
 @  PERL_MAGIC_arylen_p       (none)         To move arylen out of XPVAV
 B  PERL_MAGIC_bm             vtbl_regexp    Boyer-Moore 
                                             (fast string search)
 c  PERL_MAGIC_overload_table vtbl_ovrld     Holds overload table 
                                             (AMT) on stash
 D  PERL_MAGIC_regdata        vtbl_regdata   Regex match position data 
                                             (@+ and @- vars)
 d  PERL_MAGIC_regdatum       vtbl_regdatum  Regex match position data
                                             element
 E  PERL_MAGIC_env            vtbl_env       %ENV hash
 e  PERL_MAGIC_envelem        vtbl_envelem   %ENV hash element
 f  PERL_MAGIC_fm             vtbl_regexp    Formline 
                                             ('compiled' format)
 g  PERL_MAGIC_regex_global   vtbl_mglob     m//g target
 H  PERL_MAGIC_hints          vtbl_hints     %^H hash
 h  PERL_MAGIC_hintselem      vtbl_hintselem %^H hash element
 I  PERL_MAGIC_isa            vtbl_isa       @ISA array
 i  PERL_MAGIC_isaelem        vtbl_isaelem   @ISA array element
 k  PERL_MAGIC_nkeys          vtbl_nkeys     scalar(keys()) lvalue
 L  PERL_MAGIC_dbfile         (none)         Debugger %_<filename
 l  PERL_MAGIC_dbline         vtbl_dbline    Debugger %_<filename
                                             element
 N  PERL_MAGIC_shared         (none)         Shared between threads
 n  PERL_MAGIC_shared_scalar  (none)         Shared between threads
 o  PERL_MAGIC_collxfrm       vtbl_collxfrm  Locale transformation
 P  PERL_MAGIC_tied           vtbl_pack      Tied array or hash
 p  PERL_MAGIC_tiedelem       vtbl_packelem  Tied array or hash element
 q  PERL_MAGIC_tiedscalar     vtbl_packelem  Tied scalar or handle
 r  PERL_MAGIC_qr             vtbl_regexp    Precompiled qr// regex
 S  PERL_MAGIC_sig            (none)         %SIG hash
 s  PERL_MAGIC_sigelem        vtbl_sigelem   %SIG hash element
 t  PERL_MAGIC_taint          vtbl_taint     Taintedness
 U  PERL_MAGIC_uvar           vtbl_uvar      Available for use by
                                             extensions
 u  PERL_MAGIC_uvar_elem      (none)         Reserved for use by
                                             extensions
 V  PERL_MAGIC_vstring        (none)         SV was vstring literal
 v  PERL_MAGIC_vec            vtbl_vec       vec() lvalue
 w  PERL_MAGIC_utf8           vtbl_utf8      Cached UTF-8 information
 x  PERL_MAGIC_substr         vtbl_substr    substr() lvalue
 y  PERL_MAGIC_defelem        vtbl_defelem   Shadow "foreach" iterator
                                             variable / smart parameter
                                             vivification
 \  PERL_MAGIC_lvref          vtbl_lvref     Lvalue reference
                                             constructor
 ]  PERL_MAGIC_checkcall      vtbl_checkcall Inlining/mutation of call
                                             to this CV
 ~  PERL_MAGIC_ext            (none)         Available for use by
                                             extensions
 mg_type
 (old-style char and macro)   MGVTBL         Type of magic
 --------------------------   ------         -------------
 \0 PERL_MAGIC_sv             vtbl_sv        特殊スカラ変数
 #  PERL_MAGIC_arylen         vtbl_arylen    配列の長さ ($#ary)
 %  PERL_MAGIC_rhash          (none)         制限ハッシュの追加データ
 *  PERL_MAGIC_debugvar       vtbl_debugvar  $DB::single, シグナル、
                                             変数トレース
 .  PERL_MAGIC_pos            vtbl_pos       pos() 左辺値
 :  PERL_MAGIC_symtab         (none)         シンボルテーブルの追加データ
 <  PERL_MAGIC_backref        vtbl_backref   弱いリファレンス用
 @  PERL_MAGIC_arylen_p       (none)         arylen を XPVAV の外に動かす用
 B  PERL_MAGIC_bm             vtbl_regexp    Boyer-Moore (高速文字列検索)
 c  PERL_MAGIC_overload_table vtbl_ovrld     スタッシュのオーバーロード
                                             テーブル(AMT) を保持
 D  PERL_MAGIC_regdata        vtbl_regdata   正規表現マッチング位置データ
                                             (@+ と @- の変数)
 d  PERL_MAGIC_regdatum       vtbl_regdatum  正規表現マッチング位置データ
                                             要素
 E  PERL_MAGIC_env            vtbl_env       %ENV ハッシュ
 e  PERL_MAGIC_envelem        vtbl_envelem   %ENV ハッシュ要素
 f  PERL_MAGIC_fm             vtbl_regexp    フォーム行(「コンパイル済み」
                                             フォーマット)
 g  PERL_MAGIC_regex_global   vtbl_mglob     m//g のターゲット
 H  PERL_MAGIC_hints          vtbl_hints     %^H ハッシュ
 h  PERL_MAGIC_hintselem      vtbl_hintselem %^H ハッシュ要素
 I  PERL_MAGIC_isa            vtbl_isa       @ISA 配列
 i  PERL_MAGIC_isaelem        vtbl_isaelem   @ISA 配列要素
 k  PERL_MAGIC_nkeys          vtbl_nkeys     scalar(keys()) 左辺値
 L  PERL_MAGIC_dbfile         (none)         デバッガの %_<filename
 l  PERL_MAGIC_dbline         vtbl_dbline    デバッガの %_<filename 要素
 N  PERL_MAGIC_shared         (none)         スレッド間で共有される
 n  PERL_MAGIC_shared_scalar  (none)         スレッド間で共有される
 o  PERL_MAGIC_collxfrm       vtbl_collxfrm  ロケール変換
 P  PERL_MAGIC_tied           vtbl_pack      tie された配列やハッシュ
 p  PERL_MAGIC_tiedelem       vtbl_packelem  tie された配列やハッシュの要素
 q  PERL_MAGIC_tiedscalar     vtbl_packelem  tie されたスカラやハンドル
 r  PERL_MAGIC_qr             vtbl_regexp    事前コンパイルされた qr// 正規表現
 S  PERL_MAGIC_sig            (none)         %SIG ハッシュ
 s  PERL_MAGIC_sigelem        vtbl_sigelem   %SIG ハッシュ要素
 t  PERL_MAGIC_taint          vtbl_taint     汚染性
 U  PERL_MAGIC_uvar           vtbl_uvar      エクステンションで使用可能
 u  PERL_MAGIC_uvar_elem      (none)         エクステンションが使うために
                                             予約
 V  PERL_MAGIC_vstring        (none)         SV はv-文字列リテラル
 v  PERL_MAGIC_vec            vtbl_vec       vec() 左辺値
 w  PERL_MAGIC_utf8           vtbl_utf8      キャッシュされた UTF-8 情報
 x  PERL_MAGIC_substr         vtbl_substr    substr() 左辺値
 y  PERL_MAGIC_defelem        vtbl_defelem   影の "foreach" 反復子
                                             変数 / スマート引数
                                             自動有効化
 \  PERL_MAGIC_lvref          vtbl_lvref     左辺値リファレンス
                                             コンストラクタ
 ]  PERL_MAGIC_checkcall      vtbl_checkcall この CV の呼び出しのインライン化/
                                             ミューテーション
 ~  PERL_MAGIC_ext            (none)         エクステンションで使用可能

When an uppercase and lowercase letter both exist in the table, then the uppercase letter is typically used to represent some kind of composite type (a list or a hash), and the lowercase letter is used to represent an element of that composite type. Some internals code makes use of this case relationship. However, 'v' and 'V' (vec and v-string) are in no way related.

テーブル中で大文字小文字の両方が存在していた場合、大文字は典型的には複合型 (リストもしくはハッシュ)の種類を表わすのに使われ、小文字はその複合型の 要素を表わすのに使われます。 内部コードにはこの大文字小文字の関係を使っているものもあります。 しかし、'v' と 'V' (ベクタと v-文字列) は全く関係がありません。

The PERL_MAGIC_ext and PERL_MAGIC_uvar magic types are defined specifically for use by extensions and will not be used by perl itself. Extensions can use PERL_MAGIC_ext magic to 'attach' private information to variables (typically objects). This is especially useful because there is no way for normal perl code to corrupt this private information (unlike using extra elements of a hash object).

マジック型 PERL_MAGIC_extPERL_MAGIC_uvar はエクステンションから 使われ、Perl 自身からは使われないように特別に定義されています。 エクステンションは PERL_MAGIC_ext マジックを、 プライベート情報を変数(典型的なオブジェクト)に「アタッチ」(attach) するために使うことができます。 これは、通常の perl コードが(ハッシュオブジェクトの要素を使うのとは違って) そのプライベート情報を壊す恐れがないのでとても便利です。

Similarly, PERL_MAGIC_uvar magic can be used much like tie() to call a C function any time a scalar's value is used or changed. The MAGIC's mg_ptr field points to a ufuncs structure:

同様に、PERL_MAGIC_uvar マジックは、スカラの値が使われたり 変更されたりしたときに C 関数を呼び出すという、tie() とよく似た形で使えます。 MAGICmg_ptr フィールドは ufuncs 構造体へのポインタです:

    struct ufuncs {
        I32 (*uf_val)(pTHX_ IV, SV*);
        I32 (*uf_set)(pTHX_ IV, SV*);
        IV uf_index;
    };

When the SV is read from or written to, the uf_val or uf_set function will be called with uf_index as the first arg and a pointer to the SV as the second. A simple example of how to add PERL_MAGIC_uvar magic is shown below. Note that the ufuncs structure is copied by sv_magic, so you can safely allocate it on the stack.

SV が読み書きされたとき、uf_index を最初の引数、SV へのポインタを 2 番目の引数として uf_val または uf_set 関数が呼び出されます。 どのように PERL_MAGIC_uvar マジックを追加するかの簡単な例を以下に示します。 ufuncs 構造体は sv_magic によってコピーされるので、スタック上に安全に 割り当てられることに注意してください。

    void
    Umagic(sv)
        SV *sv;
    PREINIT:
        struct ufuncs uf;
    CODE:
        uf.uf_val   = &my_get_fn;
        uf.uf_set   = &my_set_fn;
        uf.uf_index = 0;
        sv_magic(sv, 0, PERL_MAGIC_uvar, (char*)&uf, sizeof(uf));

Attaching PERL_MAGIC_uvar to arrays is permissible but has no effect.

PERL_MAGIC_uvar を配列にアタッチすることは可能ですが、何の意味も ありません。

For hashes there is a specialized hook that gives control over hash keys (but not values). This hook calls PERL_MAGIC_uvar 'get' magic if the "set" function in the ufuncs structure is NULL. The hook is activated whenever the hash is accessed with a key specified as an SV through the functions hv_store_ent, hv_fetch_ent, hv_delete_ent, and hv_exists_ent. Accessing the key as a string through the functions without the ..._ent suffix circumvents the hook. See "GUTS" in Hash::Util::FieldHash for a detailed description.

ハッシュについては、ハッシュのキー(値ではありません)の制御をするための 専門化されたフックがあります。 このフックは、ufuncs 構造体の "set" 関数が NULL のとき、 PERL_MAGIC_uvar 'get' マジックを呼び出します。 このフックは、hv_store_ent, hv_fetch_ent, hv_delete_ent, hv_exists_ent 関数を通して SV で指定されたキーでハッシュに アクセスされたときに有効になります。 ..._ent 接尾辞を持たない関数を等して文字列としてキーにアクセスすると、 フックを通りません。 詳細な説明については "GUTS" in Hash::Util::FieldHash を参照してください。

Note that because multiple extensions may be using PERL_MAGIC_ext or PERL_MAGIC_uvar magic, it is important for extensions to take extra care to avoid conflict. Typically only using the magic on objects blessed into the same class as the extension is sufficient. For PERL_MAGIC_ext magic, it is usually a good idea to define an MGVTBL, even if all its fields will be 0, so that individual MAGIC pointers can be identified as a particular kind of magic using their magic virtual table. mg_findext provides an easy way to do that:

複数のエクステンションが PERL_MAGIC_extPERL_MAGIC_uvar マジックを 使う可能性があるので、エクステンションがそれを扱うには気をつけることが 重要であることに注意してください。 典型的には、これはオブジェクトをエクステンションが扱えるように同じクラスに bless するときにのみ使います。 PERL_MAGIC_ext マジックでは、たとえ全てのフィールドが 0 でも、 MGVTBL を定義するのが普通はよい考えです; 個々の MAGIC ポインタは それぞれのマジック仮想テーブルを使ったある種のマジックとして 識別されるからです。 mg_findext はそうするための簡単な方法を提供します:

    STATIC MGVTBL my_vtbl = { 0, 0, 0, 0, 0, 0, 0, 0 };

    MAGIC *mg;
    if ((mg = mg_findext(sv, PERL_MAGIC_ext, &my_vtbl))) {
        /* this is really ours, not another module's PERL_MAGIC_ext */
        my_priv_data_t *priv = (my_priv_data_t *)mg->mg_ptr;
        ...
    }

Also note that the sv_set*() and sv_cat*() functions described earlier do not invoke 'set' magic on their targets. This must be done by the user either by calling the SvSETMAGIC() macro after calling these functions, or by using one of the sv_set*_mg() or sv_cat*_mg() functions. Similarly, generic C code must call the SvGETMAGIC() macro to invoke any 'get' magic if they use an SV obtained from external sources in functions that don't handle magic. See perlapi for a description of these functions. For example, calls to the sv_cat*() functions typically need to be followed by SvSETMAGIC(), but they don't need a prior SvGETMAGIC() since their implementation handles 'get' magic.

sv_set*()sv_cat*() といった関数群はそのターゲットに対して 'set' マジックを 起動しない ということにも注意してください。 これには、ユーザーが svSETMAGIC マクロを呼び出した後でこれらの関数を 呼び出すか、あるいは sv_set*_mg()sv_cat*_mg() の何れかの関数を使わなければなりません。 同様に、一般的な C コードは、それがマジックを扱っていないような関数から 得られたSV を使っているのであれば、'get' マジックを起動するために SvGETMAGIC を呼び出さなければなりません。 これらの関数については perlapi を参照してください。 例えば、sv_cat*() 関数群の呼び出しは通常引き続いて SvSETMAGIC() を 呼び出す必要がありますが、 SvGETMAGIC が先行している必要はありません; なぜなら、その実装は 'get' マジックを扱うからです。

マジックを見つけだす

    MAGIC *mg_find(SV *sv, int type); /* Finds the magic pointer of that
                                       * type */

This routine returns a pointer to a MAGIC structure stored in the SV. If the SV does not have that magical feature, NULL is returned. If the SV has multiple instances of that magical feature, the first one will be returned. mg_findext can be used to find a MAGIC structure of an SV based on both its magic type and its magic virtual table:

このルーチンは SV に格納されている MAGIC 構造体へのポインタを返します。 SV がマジカル機能を持っていなければ、NULL が返されます。 SV にマジカル機能を複数持っている場合、最初の物が返されます。 mg_findext は、マジック型とマジック仮想表の両方を元とする SV の MAGIC 構造体を探すのに使えます:

    MAGIC *mg_findext(SV *sv, int type, MGVTBL *vtbl);

Also, if the SV passed to mg_find or mg_findext is not of type SVt_PVMG, Perl may core dump.

また、mg_findmg_findext に渡された SV が Svt_PVMG の型でなければ Perl はコアダンプするかもしれません。

    int mg_copy(SV* sv, SV* nsv, const char* key, STRLEN klen);

This routine checks to see what types of magic sv has. If the mg_type field is an uppercase letter, then the mg_obj is copied to nsv, but the mg_type field is changed to be the lowercase letter.

このルーチンは sv が持っているマジックの型を検査します。 mg_type フィールドが大文字であれば、mg_obj が nsv にコピーされますが、 mg_type フィールドは小文字に変更されます。

tie されたハッシュと配列のマジックを理解する

Tied hashes and arrays are magical beasts of the PERL_MAGIC_tied magic type.

tie されたハッシュと配列は PERL_MAGIC_tied マジック型の magical beast です。

WARNING: As of the 5.004 release, proper usage of the array and hash access functions requires understanding a few caveats. Some of these caveats are actually considered bugs in the API, to be fixed in later releases, and are bracketed with [MAYCHANGE] below. If you find yourself actually applying such information in this section, be aware that the behavior may change in the future, umm, without warning.

警告: リリース 5.004 以降、配列やハッシュに対するアクセス関数の正しい使い方は、 幾つかの注意点を理解していることを要求しています。 これら幾つかの注意点は実際には API におけるバグとして みなされるものであって、将来のリリースにおいては修正されます; また、注意点は [MAYCHANGE] というブラケットで囲まれています。 このセクションにある情報をあなたが実際に使おうというのであれば、 将来それらは警告なしに変わる可能性があることに注意してください。

The perl tie function associates a variable with an object that implements the various GET, SET, etc methods. To perform the equivalent of the perl tie function from an XSUB, you must mimic this behaviour. The code below carries out the necessary steps -- firstly it creates a new hash, and then creates a second hash which it blesses into the class which will implement the tie methods. Lastly it ties the two hashes together, and returns a reference to the new tied hash. Note that the code below does NOT call the TIEHASH method in the MyTie class - see "Calling Perl Routines from within C Programs" for details on how to do this.

perl の tie 関数は、ある変数と GET、SET 等といった様々なメソッドを 実装しているオブジェクトとを結び付けるものです。 XSUB から perl の tie 関数と等価な働きをさせるには、ちょっとした オマジナイをしなければなりません。 以下の例が必要なステップです -- まず最初にハッシュを作り、それから tie メソッドを実装するクラスに bless した二番目のハッシュを作ります。 最後に二つのハッシュを tie し、新たに生成した tie されたハッシュに対する リファレンスを返します。 以下の例では MyTie クラスの中で TIEHASH を呼び出していないということに 注意してください - この件に関する詳細は "Calling Perl Routines from within C Programs" を参照してください。

    SV*
    mytie()
    PREINIT:
        HV *hash;
        HV *stash;
        SV *tie;
    CODE:
        hash = newHV();
        tie = newRV_noinc((SV*)newHV());
        stash = gv_stashpv("MyTie", GV_ADD);
        sv_bless(tie, stash);
        hv_magic(hash, (GV*)tie, PERL_MAGIC_tied);
        RETVAL = newRV_noinc(hash);
    OUTPUT:
        RETVAL

The av_store function, when given a tied array argument, merely copies the magic of the array onto the value to be "stored", using mg_copy. It may also return NULL, indicating that the value did not actually need to be stored in the array. [MAYCHANGE] After a call to av_store on a tied array, the caller will usually need to call mg_set(val) to actually invoke the perl level "STORE" method on the TIEARRAY object. If av_store did return NULL, a call to SvREFCNT_dec(val) will also be usually necessary to avoid a memory leak. [/MAYCHANGE]

tie された配列を引数に与えられたときの av_store 関数は、単に配列の magic を mg_copy を使って「保管」されるように値をコピーするだけです。 この関数は、その値が実際には配列に格納する必要のないものであることを 示す NULL を返す可能性があります。 [MAYCHANGE] tie された配列に対して av_store を呼び出した後、呼び出し側は TIEARRAY オブジェクトに対して Perl レベルの "STORE" メソッドを起動するために av_store を呼び出すことが通常は必要となります。 av_store が NULL を返したならば、メモリリークを防ぐために SvREFCNT_dec(val) を呼び出すことが必要となります。 [/MAYCHANGE]

The previous paragraph is applicable verbatim to tied hash access using the hv_store and hv_store_ent functions as well.

先の段落の説明は、tie されたハッシュにアクセスするのに使用する hv_storehv_store_ent についても同様です。

av_fetch and the corresponding hash functions hv_fetch and hv_fetch_ent actually return an undefined mortal value whose magic has been initialized using mg_copy. Note the value so returned does not need to be deallocated, as it is already mortal. [MAYCHANGE] But you will need to call mg_get() on the returned value in order to actually invoke the perl level "FETCH" method on the underlying TIE object. Similarly, you may also call mg_set() on the return value after possibly assigning a suitable value to it using sv_setsv, which will invoke the "STORE" method on the TIE object. [/MAYCHANGE]

av_fetch と、対応するハッシュ関数 hv_fetch および hv_fetch_ent は 実際には mg_copy を使って初期化が行なわれている未定義の揮発値を返します。 返された値はすでに揮発性なので、解放する必要がないことに注意してください。 [MAYCHANGE] しかし、TIE オブジェクトに対応した perl レベルの "FETCH" メソッドを 実行するには、返されたその値に対してmg_get() を呼び出す必要があるでしょう。 同様に、TIE オブジェクトに対する "STORE" メソッドの起動である sv_setsv を使って適切な値を代入した後で、返された値に対して mg_set() を呼び出すことができます。 [/MAYCHANGE]

[MAYCHANGE] In other words, the array or hash fetch/store functions don't really fetch and store actual values in the case of tied arrays and hashes. They merely call mg_copy to attach magic to the values that were meant to be "stored" or "fetched". Later calls to mg_get and mg_set actually do the job of invoking the TIE methods on the underlying objects. Thus the magic mechanism currently implements a kind of lazy access to arrays and hashes.

[MAYCHANGE] 言い換えれば、配列やハッシュをフェッチしたりストアする関数は、 tie されている配列やハッシュに対する場合には実際に値をフェッチしたり 保管したりするわけではないということです。 それらの関数は「保管」されたり「フェッチ」された値に対してマジックを 付加するために、単に mg_copy を呼び出すだけです。 その後の mg_getmg_set の呼び出しは実際には元となっている オブジェクトへの TIE メソッドの起動を行います。 従って現在の所マジック機構は配列とハッシュへの一種の遅延アクセスを 実装しています。

Currently (as of perl version 5.004), use of the hash and array access functions requires the user to be aware of whether they are operating on "normal" hashes and arrays, or on their tied variants. The API may be changed to provide more transparent access to both tied and normal data types in future versions. [/MAYCHANGE]

現在(バージョン 5.004)、ハッシュや配列に対するアクセス関数を使用する 際には、ユーザーが「通常の」ハッシュや配列なのか、あるいはそれが tie されたものであるのかを気をつけることが要求されています。 将来のバージョンでは、この API は tie されたデータに対するアクセスと 通常のデータに対するアクセスをより透過的にするために変更されるかも しれません。 [/MAYCHANGE]

You would do well to understand that the TIEARRAY and TIEHASH interfaces are mere sugar to invoke some perl method calls while using the uniform hash and array syntax. The use of this sugar imposes some overhead (typically about two to four extra opcodes per FETCH/STORE operation, in addition to the creation of all the mortal variables required to invoke the methods). This overhead will be comparatively small if the TIE methods are themselves substantial, but if they are only a few statements long, the overhead will not be insignificant.

TIEARRAY や TIEHASH といったインターフェースが、統一的な ハッシュ/配列構文を使うための perl メソッドを起動をするための単なる 砂糖であることを良く理解したことでしょう。 これらの砂糖の使用はいくらかのオーバーヘッド(通常、FETCH/STORE 操作 当たり二つから四つの余分なオペコード、それに加えてメソッドを 起動するために必要なすべての揮発性変数の生成)を招きます。 このオーバーヘッドは TIE メソッド自身がしっかりしたものであれば、ほぼ 同等なくらい小さなものでしかありませんが、ほんの少し文が長いだけでも オーバーヘッドは無視できないものになります。

変更をローカル化する

Perl has a very handy construction

Perl には非常に便利な構造があります。

  {
    local $var = 2;
    ...
  }

This construction is approximately equivalent to

この構造は以下のものと ほぼ 同じです

  {
    my $oldvar = $var;
    $var = 2;
    ...
    $var = $oldvar;
  }

The biggest difference is that the first construction would reinstate the initial value of $var, irrespective of how control exits the block: goto, return, die/eval, etc. It is a little bit more efficient as well.

両者の最も大きな違いは、最初のものが gotoreturndie/eval など どのようにブロックから脱出しようとも、$var の元々の値を 復帰するということです。 効率といった面では大きな違いはありません。

There is a way to achieve a similar task from C via Perl API: create a pseudo-block, and arrange for some changes to be automatically undone at the end of it, either explicit, or via a non-local exit (via die()). A block-like construct is created by a pair of ENTER/LEAVE macros (see "Returning a Scalar" in perlcall). Such a construct may be created specially for some important localized task, or an existing one (like boundaries of enclosing Perl subroutine/block, or an existing pair for freeing TMPs) may be used. (In the second case the overhead of additional localization must be almost negligible.) Note that any XSUB is automatically enclosed in an ENTER/LEAVE pair.

Perl API を通して C から同様の処理を行う方法もあります: 擬似ブロック(pseudo-block)を生成し、そのブロックの最後で自動的に 復帰するような幾つかの変更を行います。 ブロックから抜けるのは、明示的に抜けるための指示があっても良いし、 非局所的な脱出(die() を使ったもの)でもかまいません。 ブロックに似たこの構造は ENTER/LEAVE マクロのペアによって 生成されます("Returning a Scalar" in perlcall を参照してください)。 このような構造ではなにか重要なローカル化されたタスクのための特別なものを 作成したり、あるいは既に存在しているもの(Perl のサブルーチン/ブロックに 束縛されたものとか、あるいは解放する一時変数のペア)を使うことも可能です (二番目のケースでは、ローカル化するためのオーバーヘッドはほとんど 無視できるものです)。 すべての XSUB は自動的に ENTER/LEAVE の ペアによって囲まれているということに注意してください。

Inside such a pseudo-block the following service is available:

このような 擬似ブロック の中では以下のサービスが利用可能です:

SAVEINT(int i)
SAVEIV(IV i)
SAVEI32(I32 i)
SAVELONG(long i)

These macros arrange things to restore the value of integer variable i at the end of enclosing pseudo-block.

これらのマクロはそれを囲む 擬似ブロック において 整数変数 i の値をリストアするようにします。

SAVESPTR(s)
SAVEPPTR(p)

These macros arrange things to restore the value of pointers s and p. s must be a pointer of a type which survives conversion to SV* and back, p should be able to survive conversion to char* and back.

これらのマクロは、ポインタsもしくは p の値をリストアします。 sSV* に対する型変換をできるポインタでなければなりません; pchar* への型変換が可能であるべきものです。

SAVEFREESV(SV *sv)

The refcount of sv would be decremented at the end of pseudo-block. This is similar to sv_2mortal in that it is also a mechanism for doing a delayed SvREFCNT_dec. However, while sv_2mortal extends the lifetime of sv until the beginning of the next statement, SAVEFREESV extends it until the end of the enclosing scope. These lifetimes can be wildly different.

擬似ブロック の終端において sv の参照カウントはデクリメントされます。 これは、遅延した SvREFCNT_dec を行うための機構という意味で sv_2motral に似たものです。 しかし、sv_2mortalsv の生存時間を次の文の始めまで延ばす一方、 SAVEFREESV は囲まれているスコープの終わりまで延ばします。 これらの生存時間は大きく異なるかもしれません。

Also compare SAVEMORTALIZESV.

また、SAVEMORTALIZESV を比較します。

SAVEMORTALIZESV(SV *sv)

Just like SAVEFREESV, but mortalizes sv at the end of the current scope instead of decrementing its reference count. This usually has the effect of keeping sv alive until the statement that called the currently live scope has finished executing.

SAVEFREESV と同様ですが、参照カウントを減らすのではなく、現在のスコープの 終わりで sv を揮発化します。 これは普通、現在有効なスコープが実行を終了する文まで sv を 生存させ続けます。

SAVEFREEOP(OP *op)

The OP * is op_free()ed at the end of pseudo-block.

OP *擬似ブロック の終端において op_free() されます。

SAVEFREEPV(p)

The chunk of memory which is pointed to by p is Safefree()ed at the end of pseudo-block.

p によって指し示されているメモリの塊は 擬似ブロック の終端で Safefree() されます。

SAVECLEARSV(SV *sv)

Clears a slot in the current scratchpad which corresponds to sv at the end of pseudo-block.

擬似ブロック の終端において、sv に対応している カレントのスクラッチパッドにおけるスロットをクリアします。

SAVEDELETE(HV *hv, char *key, I32 length)

The key key of hv is deleted at the end of pseudo-block. The string pointed to by key is Safefree()ed. If one has a key in short-lived storage, the corresponding string may be reallocated like this:

擬似ブロック の終端で hv にあるキー key は削除されます。 key によって指し示されている文字列は Safefree() されます。 short-lived storageにある key を持っているものがあった場合には 以下のようにして対応する文字列が再割り当てされます。

  SAVEDELETE(PL_defstash, savepv(tmpbuf), strlen(tmpbuf));
SAVEDESTRUCTOR(DESTRUCTORFUNC_NOCONTEXT_t f, void *p)

At the end of pseudo-block the function f is called with the only argument p.

擬似ブロック の終端において関数 f が呼び出されます; この関数 fp のみを引数に取ります。

SAVEDESTRUCTOR_X(DESTRUCTORFUNC_t f, void *p)

At the end of pseudo-block the function f is called with the implicit context argument (if any), and p.

疑似ブロック の最後に、関数 f が(もしあれば)暗黙のコンテキスト 引数と p で呼び出されます。

SAVESTACK_POS()

The current offset on the Perl internal stack (cf. SP) is restored at the end of pseudo-block.

擬似ブロック の終端において Perl の内部スタック(SP)のカレント オフセットがリストアされます。

The following API list contains functions, thus one needs to provide pointers to the modifiable data explicitly (either C pointers, or Perlish GV *s). Where the above macros take int, a similar function takes int *.

以下の API リストは、変更可能なデータを指し示すポインタ (C のポインタか、Perl 的な GV * のいずれか)を必要とする関数群です。 前述の int を引数に取るマクロに似て、 int * を引数に取る関数があります。

SV* save_scalar(GV *gv)

Equivalent to Perl code local $gv.

Perl コード local $gv と等価です。

AV* save_ary(GV *gv)
HV* save_hash(GV *gv)

Similar to save_scalar, but localize @gv and %gv.

save_scalar に似ていますが、@gv%gv の局所化を行います。

void save_item(SV *item)

Duplicates the current value of SV, on the exit from the current ENTER/LEAVE pseudo-block will restore the value of SV using the stored value. It doesn't handle magic. Use save_scalar if magic is affected.

SV のカレントの値を複製し、カレントの ENTER/LEAVE 擬似ブロック を抜けるときに SV の保存した値を復帰します。 マジックを扱いません。 マジックを有効にしたい場合は save_scalar を使ってください。

void save_list(SV **sarg, I32 maxsarg)

A variant of save_item which takes multiple arguments via an array sarg of SV* of length maxsarg.

複数の引数を長さ maxargSV* の配列 sarg として取る save_item の複数の値を取るバリエーションです。

SV* save_svref(SV **sptr)

Similar to save_scalar, but will reinstate an SV *.

save_scalar に似ていますが、SV * の復帰を行います。

void save_aptr(AV **aptr)
void save_hptr(HV **hptr)

Similar to save_svref, but localize AV * and HV *.

save_svref に似ていますが、AV *HV * のローカル化を行います。

The Alias module implements localization of the basic types within the caller's scope. People who are interested in how to localize things in the containing scope should take a look there too.

Alias モジュールは 呼び出し側のスコープ 中での基本型のローカル化を 実装します。 スコープを持った何かのローカル化に興味のある人は そこに何があるかも見ておいた方が良いでしょう。

サブルーチン

XSUB と引数スタック

The XSUB mechanism is a simple way for Perl programs to access C subroutines. An XSUB routine will have a stack that contains the arguments from the Perl program, and a way to map from the Perl data structures to a C equivalent.

XSUB の仕組みは、Perl プログラムが C のサブルーチンを アクセスするための単純な方法です。 XSUB には、Perl プログラムからの引数を入れるスタックと、Perl のデータ 構造を C の等価なものにマッピングする方法を用意しています。

The stack arguments are accessible through the ST(n) macro, which returns the n'th stack argument. Argument 0 is the first argument passed in the Perl subroutine call. These arguments are SV*, and can be used anywhere an SV* is used.

スタック引数は ST(n) というマクロを使ってアクセスできます; これは、n 番目のスタック引数を返すものです。 引数 0 は、Perl のサブルーチン呼び出しで渡された最初の引数です。 これらの引数は SV* で、SV* が使われるところであればどこでも 使うことができます。

Most of the time, output from the C routine can be handled through use of the RETVAL and OUTPUT directives. However, there are some cases where the argument stack is not already long enough to handle all the return values. An example is the POSIX tzname() call, which takes no arguments, but returns two, the local time zone's standard and summer time abbreviations.

ほとんどの場合には、C ルーチンからの出力は RETVAL 指示子と OUTPUT 指示子を使って扱うことができます。 しかし、引数スタックのスペースがすべての返却値を扱うのに十分で なくなる場合があります。 例としては、引数をとらないでローカルなタイムゾーンと夏時間の省略形の 二つの返却値を返す、POSIX の tzname() の呼び出しがあります。

To handle this situation, the PPCODE directive is used and the stack is extended using the macro:

このような状況を扱うためには、PPCODE ディレクティブを使い、さらに スタックを以下のマクロを使って拡張します:

    EXTEND(SP, num);

where SP is the macro that represents the local copy of the stack pointer, and num is the number of elements the stack should be extended by.

ここで SP はスタックポインタで、num はスタックを拡張すべき 要素の数です。

Now that there is room on the stack, values can be pushed on it using PUSHs macro. The pushed values will often need to be "mortal" (See "Reference Counts and Mortality"):

スタック上に場所を確保したら、PUSHs マクロを使って値をスタックへ プッシュします。 プッシュされた値はしばしば「揮発性」である必要があります( "Reference Counts and Mortality" を参照してください):

    PUSHs(sv_2mortal(newSViv(an_integer)))
    PUSHs(sv_2mortal(newSVuv(an_unsigned_integer)))
    PUSHs(sv_2mortal(newSVnv(a_double)))
    PUSHs(sv_2mortal(newSVpv("Some String",0)))
    /* Although the last example is better written as the more
     * efficient: */
    PUSHs(newSVpvs_flags("Some String", SVs_TEMP))

And now the Perl program calling tzname, the two values will be assigned as in:

これで、tzname を呼ぶ Perl プログラムでは、二つの値は 以下のように代入できます。

    ($standard_abbrev, $summer_abbrev) = POSIX::tzname;

An alternate (and possibly simpler) method to pushing values on the stack is to use the macro:

スタックに値を積む、別の (おそらくはより簡単な) 方法は、 以下のマクロを使うことです。

    XPUSHs(SV*)

This macro automatically adjusts the stack for you, if needed. Thus, you do not need to call EXTEND to extend the stack.

こちらのマクロは、必要ならば自動的にスタックを調整してくれます。 このため、EXTEND をスタックを拡張するために呼ぶ必要はありません。

Despite their suggestions in earlier versions of this document the macros (X)PUSH[iunp] are not suited to XSUBs which return multiple results. For that, either stick to the (X)PUSHs macros shown above, or use the new m(X)PUSH[iunp] macros instead; see "Putting a C value on Perl stack".

この文書の以前のバージョンでの推奨にも関わらず、マクロ (X)PUSH[iunp] は 複数の結果を返す XSUB には向いて いません。 このためには、上述の (X)PUSHs マクロにこだわるか、代わりに新しい m(X)PUSH[iunp] マクロを使ってください; "Putting a C value on Perl stack" を参照してください。

For more information, consult perlxs and perlxstut.

より詳しい情報は、perlxsperlxstut を参照してください。

XSUB でのオートロード

If an AUTOLOAD routine is an XSUB, as with Perl subroutines, Perl puts the fully-qualified name of the autoloaded subroutine in the $AUTOLOAD variable of the XSUB's package.

AUTOLOAD ルーチンが XSUB の場合、Perl サブルーチンと同様に、Perl は XSUB の パッケージの $AUTOLOAD 変数にオートロードされたサブルーチンの完全修飾名を 設定します。

But it also puts the same information in certain fields of the XSUB itself:

しかし、XSUB 自身の特定のフィールドにも同じ情報が設定されます:

    HV *stash           = CvSTASH(cv);
    const char *subname = SvPVX(cv);
    STRLEN name_length  = SvCUR(cv); /* in bytes */
    U32 is_utf8         = SvUTF8(cv);

SvPVX(cv) contains just the sub name itself, not including the package. For an AUTOLOAD routine in UNIVERSAL or one of its superclasses, CvSTASH(cv) returns NULL during a method call on a nonexistent package.

SvPVX(cv) には、パッケージを含まないサブルーチン名自身が入ります。 UNIVERSAL やそのスーパークラスの AUTOLOAD ルーチンでは、CvSTASH(cv) は 存在しないパッケージのメソッド呼び出しの間は NULL を返します。

Note: Setting $AUTOLOAD stopped working in 5.6.1, which did not support XS AUTOLOAD subs at all. Perl 5.8.0 introduced the use of fields in the XSUB itself. Perl 5.16.0 restored the setting of $AUTOLOAD. If you need to support 5.8-5.14, use the XSUB's fields.

注意: $AUTOLOAD への設定は、XS AUTOLOAD サブルーチンに全く 対応していなかった 5.6.1 で動作しなくなりました。 Perl 5.8.0 で XSUB 自身のフィールドの使用を導入しました。 Perl 5.16.0 で $AUTOLOAD への設定が復旧されました。 5.8-5.14 に対応する必要がある場合、XSUB のフィールドを使用してください。

C プログラムからの Perl ルーチンの呼び出し

There are four routines that can be used to call a Perl subroutine from within a C program. These four are:

C プログラムから Perl サブルーチンを呼び出すために使用することのできる ルーチンが 四つあります。 その四つは:

    I32  call_sv(SV*, I32);
    I32  call_pv(const char*, I32);
    I32  call_method(const char*, I32);
    I32  call_argv(const char*, I32, char**);

The routine most often used is call_sv. The SV* argument contains either the name of the Perl subroutine to be called, or a reference to the subroutine. The second argument consists of flags that control the context in which the subroutine is called, whether or not the subroutine is being passed arguments, how errors should be trapped, and how to treat return values.

最もよく使われるはずのものは、call_sv です。 引数 SV* には呼び出される Perl サブルーチンの名前か、その サブルーチンへのリファレンスが含まれます。 二番目の引数には、そのサブルーチンが呼び出されたコンテキストを制御する フラグが置かれます; これはサブルーチンに引数が渡されたか渡されていないか、 エラーをどのようにトラップすべきなのか、どのように戻り値を返すのかを 制御するものです。

All four routines return the number of arguments that the subroutine returned on the Perl stack.

四つのルーチンはいずれも、サブルーチンが Perl スタック上に返した 引数の数を返します。

These routines used to be called perl_call_sv, etc., before Perl v5.6.0, but those names are now deprecated; macros of the same name are provided for compatibility.

これらのルーチンは Perl v5.6.0 以前では perl_call_sv などと 呼ばれていましたが、しかしこれらの名前は現在では非推奨です; 同じ名前の マクロが互換性のために提供されています。

When using any of these routines (except call_argv), the programmer must manipulate the Perl stack. These include the following macros and functions:

これらのルーチンを使うときには(call_argv を除いて)、プログラマが Perl スタックを操作しなくてはなりません。 以下のマクロと関数が用意されています:

    dSP
    SP
    PUSHMARK()
    PUTBACK
    SPAGAIN
    ENTER
    SAVETMPS
    FREETMPS
    LEAVE
    XPUSH*()
    POP*()

For a detailed description of calling conventions from C to Perl, consult perlcall.

C から Perl を呼び出す約束ごとについての詳しい記述は perlcall を参照してください。

C での値を Perl スタックに入れる

A lot of opcodes (this is an elementary operation in the internal perl stack machine) put an SV* on the stack. However, as an optimization the corresponding SV is (usually) not recreated each time. The opcodes reuse specially assigned SVs (targets) which are (as a corollary) not constantly freed/created.

たくさんのオペコード(これは内部的な perl スタックマシンでの基本的な 操作です)が SV をスタックに置きます。 しかしながら、SV に対する最適化のようなものは(通常は)毎回 行なわれるわけではありません。 オペコードは解放されたり、生成されることのない特別に割り当てられた SV (target) を再利用します。

Each of the targets is created only once (but see "Scratchpads and recursion" below), and when an opcode needs to put an integer, a double, or a string on stack, it just sets the corresponding parts of its target and puts the target on stack.

それぞれの targets は、一度だけ生成して(ただし、後述する "Scratchpads and recursion" を参照のこと)、オペコードがスタックに 整数値、倍精度実数値、文字列といったものを置くことを必要とするときに、 スタックに target を置きます。

The macro to put this target on stack is PUSHTARG, and it is directly used in some opcodes, as well as indirectly in zillions of others, which use it via (X)PUSH[iunp].

この target をスタックに置くためのマクロが PUSHTARG です; このマクロは、 他の多くのマクロが (X)PUSH[iunp] を通じて間接的に使っているのと同様に、 幾つかのオペコードで直接使われています。

Because the target is reused, you must be careful when pushing multiple values on the stack. The following code will not do what you think:

ターゲットは再利用されるので、スタックに複数の値をプッシュするときには 注意しなければなりません。 以下のコードはあなたが考えているようには動作しません:

    XPUSHi(10);
    XPUSHi(20);

This translates as "set TARG to 10, push a pointer to TARG onto the stack; set TARG to 20, push a pointer to TARG onto the stack". At the end of the operation, the stack does not contain the values 10 and 20, but actually contains two pointers to TARG, which we have set to 20.

これは、「TARG に 10 を設定して、TARG へのポインタをスタックに プッシュする; TARG に 20 を設定して、TARG へのポインタをスタックに プッシュする」と解釈されます。 操作の終了時、スタックには値 10 と 20 はなく、値 を 20 に設定された TARG へのポインタが二つあります。

If you need to push multiple different values then you should either use the (X)PUSHs macros, or else use the new m(X)PUSH[iunp] macros, none of which make use of TARG. The (X)PUSHs macros simply push an SV* on the stack, which, as noted under "XSUBs and the Argument Stack", will often need to be "mortal". The new m(X)PUSH[iunp] macros make this a little easier to achieve by creating a new mortal for you (via (X)PUSHmortal), pushing that onto the stack (extending it if necessary in the case of the mXPUSH[iunp] macros), and then setting its value. Thus, instead of writing this to "fix" the example above:

複数の異なった値をプッシュしたい場合、(X)PUSHs マクロを使うか、新しい m(X)PUSH[iunp] マクロを使う必要があります; どちらもTARG は使いません。 (X)PUSHs マクロは単に SV* をスタックにプッシュし、この値は、 "XSUBs and the Argument Stack" で注意されているように、 しばしば「揮発性」である必要があります。 新しい m(X)PUSH[iunp] マクロは、新しい揮発性値を ((X)PUSHmortal を使って)作成し、それをスタックにプッシュし (mXPUSH[iunp] マクロの場合もし必要なら拡張して)、それから値を設定します。 従って、前述の例を「修正」するのに以下のように書く代わりに:

    XPUSHs(sv_2mortal(newSViv(10)))
    XPUSHs(sv_2mortal(newSViv(20)))

you can simply write:

単純にこう書けます:

    mXPUSHi(10)
    mXPUSHi(20)

On a related note, if you do use (X)PUSH[iunp], then you're going to need a dTARG in your variable declarations so that the *PUSH* macros can make use of the local variable TARG. See also dTARGET and dXSTARG.

関連する注意として、(X)PUSH[iunp] を使うなら、*PUSH* マクロが ローカル変数 TARG を使うように、変数宣言に dTARG が必要でしょう。 dTARGETdXSTARG も参照してください。

スクラッチパッド

The question remains on when the SVs which are targets for opcodes are created. The answer is that they are created when the current unit--a subroutine or a file (for opcodes for statements outside of subroutines)--is compiled. During this time a special anonymous Perl array is created, which is called a scratchpad for the current unit.

残っている疑問は、オペコードに対する targets である SV をいつ 生成するのかということでしょう。 その答えは、カレントユニット -- サブルーチンもしくは(サブルーチンの 外側にある文のためのオペコードのための)ファイル -- が コンパイルされたときです。 この間、特別な無名配列が生成されます; これはカレントユニットのための スクラッチパッド (scrachpad) と呼ばれるものです。

A scratchpad keeps SVs which are lexicals for the current unit and are targets for opcodes. A previous version of this document stated that one can deduce that an SV lives on a scratchpad by looking on its flags: lexicals have SVs_PADMY set, and targets have SVs_PADTMP set. But this has never been fully true. SVs_PADMY could be set on a variable that no longer resides in any pad. While targets do have SVs_PADTMP set, it can also be set on variables that have never resided in a pad, but nonetheless act like targets. As of perl 5.21.5, the SVs_PADMY flag is no longer used and is defined as 0. SvPADMY() now returns true for anything without SVs_PADTMP.

スクラッチパッドはカレントユニットのためのレキシカルやオペコードのための target である SV を保持します。 この文書の以前の版では、SV があるスクラッチパッドを、SV のフラグを 見ることによって推測することができると書いていました: レキシカルでは SVs_PADMY が設定されていて、target では SVs_PADTMP が 設定されています。 しかしこれは決して完全に真ではありません。 SVs_PADMY はもはやどのパッドにも存在しない変数に セットされることがあります。 targetSVs_PADTMP が設定されている一方、 どのパッドにも存在しない変数に設定されることもありますが、 それでも target のように振る舞います。 perl 5.21.5 以降、SVs_PADMY フラグはもはや使われず、0 として 定義されています。 SvPADMY() は、SVs_PADTMP がなければ全て真を返すようになりました。

The correspondence between OPs and targets is not 1-to-1. Different OPs in the compile tree of the unit can use the same target, if this would not conflict with the expected life of the temporary.

オペコードと targets の間の対応は一対一ではありません。 あるユニットの翻訳木 (compile tree)にある異なるオペコードは、これが一時変数の expected life と衝突していなければ同じ target を使うことができます。

スクラッチパッドと再帰

In fact it is not 100% true that a compiled unit contains a pointer to the scratchpad AV. In fact it contains a pointer to an AV of (initially) one element, and this element is the scratchpad AV. Why do we need an extra level of indirection?

コンパイルされたユニットがスクラッチパッド AV へのポインタを 保持しているということは、100% 本当のことではありません。 実際は、(初期値では)一要素の AV へのポインタを保持していて、この要素が スクラッチパッド AV なのです。 なぜ、こういう余計な間接レベルを必要としているのでしょう?

The answer is recursion, and maybe threads. Both these can create several execution pointers going into the same subroutine. For the subroutine-child not write over the temporaries for the subroutine-parent (lifespan of which covers the call to the child), the parent and the child should have different scratchpads. (And the lexicals should be separate anyway!)

その答えは 再帰 と、おそらく スレッド です。 これら二つは同じサブルーチンに対する別々の実行ポインタを 生成しようとするかもしれません。 子サブルーチンが(呼び出す子サブルーチンを覆っている寿命を持つ) 親サブルーチンの一時変数を上書きしてしまわないように、 親と子では、異なるスクラッチパッドを持つようにすべきです。 (かつ、レキシカルは分けておくべきなのです!)

So each subroutine is born with an array of scratchpads (of length 1). On each entry to the subroutine it is checked that the current depth of the recursion is not more than the length of this array, and if it is, new scratchpad is created and pushed into the array.

各サブルーチンは、スクラッチパッドの(長さが 1 の)配列を伴って生成されます。 サブルーチンに対する各エントリーはその時点での再帰の深さが この配列の長さよりも大きくないことをチェックします; そして、もし そうであれば、新たなスクラッチパッドが生成されて配列へとプッシュされます。

The targets on this scratchpad are undefs, but they are already marked with correct flags.

このスクラッチパッドにある targets は undef ですが、これらはすでに 正しいフラグによってマークされています。

メモリ割り当て

割り当て

All memory meant to be used with the Perl API functions should be manipulated using the macros described in this section. The macros provide the necessary transparency between differences in the actual malloc implementation that is used within perl.

Perl API 関数と共に使うような全てのメモリはこのセクションで 説明されているマクロを使って扱うべきです。 マクロは実際の malloc の 実装と、perl で使われているものとの差を透過的にします。

It is suggested that you enable the version of malloc that is distributed with Perl. It keeps pools of various sizes of unallocated memory in order to satisfy allocation requests more quickly. However, on some platforms, it may cause spurious malloc or free errors.

Perl と一緒に配布されていて、あなたがこれを使うことを推奨されている malloc の変種です。 これは様々な大きさの未割り付けのメモリをプールしておき、 より早く割り付け要求に応えようとするものです。 しかしながら一部のプラットフォームでは、これは不法な malloc エラーや free エラーを引き起こす可能性があります。

The following three macros are used to initially allocate memory :

これら三つのマクロはメモリの割り付けのために使われます:

    Newx(pointer, number, type);
    Newxc(pointer, number, type, cast);
    Newxz(pointer, number, type);

The first argument pointer should be the name of a variable that will point to the newly allocated memory.

1 番目の引数 pointer は、新たにメモリを割り付けられる変数の名前にします。

The second and third arguments number and type specify how many of the specified type of data structure should be allocated. The argument type is passed to sizeof. The final argument to Newxc, cast, should be used if the pointer argument is different from the type argument.

3 番目と 4 番目の引数 numbertype は、指定された構造体を どれだけ割り付けるのかを指定します。 引数 typesizeof に渡されます。 Newxcに対する最後の引数 castは、引数 pointer が 引数 type と異なるときに使うべきものです。

Unlike the Newx and Newxc macros, the Newxz macro calls memzero to zero out all the newly allocated memory.

NewxNewxc とは異なり、Newxz は割り付けたメモリのすべてを ゼロで埋めるために memzero を呼び出します。

再割り当て

    Renew(pointer, number, type);
    Renewc(pointer, number, type, cast);
    Safefree(pointer)

These three macros are used to change a memory buffer size or to free a piece of memory no longer needed. The arguments to Renew and Renewc match those of New and Newc with the exception of not needing the "magic cookie" argument.

上記の三つのマクロは、メモリのバッファーサイズを変更したりもう 使わなくなったメモリ領域を解放するために使われます。 RenewRenewc の引数は、"魔法のクッキー" 引数が必要ないと いうことを除きそれぞれ NewNewc に一致します。

移動

    Move(source, dest, number, type);
    Copy(source, dest, number, type);
    Zero(dest, number, type);

These three macros are used to move, copy, or zero out previously allocated memory. The source and dest arguments point to the source and destination starting points. Perl will move, copy, or zero out number instances of the size of the type data structure (using the sizeof function).

この三つのマクロは、それぞれ割り付けたメモリ領域に対する移動、 複写、ゼロで埋めるといったことに使われます。 sourcedest という引数は、転送元と転送先の開始番地へのポインタです。 Perl は、構造体 type の大きさ (sizeof 関数を使います)のインスタンスの number 個分だけ、移動、複写、ゼロ埋めを行います。

PerlIO

The most recent development releases of Perl have been experimenting with removing Perl's dependency on the "normal" standard I/O suite and allowing other stdio implementations to be used. This involves creating a new abstraction layer that then calls whichever implementation of stdio Perl was compiled with. All XSUBs should now use the functions in the PerlIO abstraction layer and not make any assumptions about what kind of stdio is being used.

最新リリースの Perl の開発では、Perl の「通常の」標準入出力ライブラリに 依存している部分を取り除くことと、Perl で別の標準入出力の実装が 使えるようにすることが試みられました。 これにより必然的に、Perl と共にコンパイルされた標準入出力の実装を 呼び出すような新しい抽象層が作られました。 すべての XSUB は、今では PerlIO 抽象層の関数を使うべきで、 これまで使っていた標準入出力に関してのすべての仮定はすべきではありません。

For a complete description of the PerlIO abstraction, consult perlapio.

PerlIO 抽象化に関する詳しい記述は perlapio を参照してください。

コンパイルされたコード

コード木

Here we describe the internal form your code is converted to by Perl. Start with a simple example:

ここで、Perl によって変換されたプログラムの内部形式を説明しましょう。 簡単な例から始めます。

  $a = $b + $c;

This is converted to a tree similar to this one:

これは次のような木構造へ変換されます:

             assign-to
           /           \
          +             $a
        /   \
      $b     $c

(but slightly more complicated). This tree reflects the way Perl parsed your code, but has nothing to do with the execution order. There is an additional "thread" going through the nodes of the tree which shows the order of execution of the nodes. In our simplified example above it looks like:

(実際にはもっと複雑です)。 この木構造は、Perl があなたのプログラムを解析したやり方を反映していますが、 実行の順序については反映していません。 ノードの実行順序を表わす木構造のノードを辿ろうとする別の 「スレッド」(thread) があります。 先の簡単な例では、次のようになります。

     $b ---> $c ---> + ---> $a ---> assign-to

But with the actual compile tree for $a = $b + $c it is different: some nodes optimized away. As a corollary, though the actual tree contains more nodes than our simplified example, the execution order is the same as in our example.

しかし、$a = $b + $c に対する実際の解析木はこれと異なります: 一部の ノードが最適化されています。 その結果として、実際の木構造が私たちの単純な例よりも多くのノードを 持っていたとしても、その実行順序は同じになります。

木を検査する

If you have your perl compiled for debugging (usually done with -DDEBUGGING on the Configure command line), you may examine the compiled tree by specifying -Dx on the Perl command line. The output takes several lines per node, and for $b+$c it looks like this:

perl をデバッグ用にコンパイルした(通常は Configure のコマンドラインで -DDEBUGGING を使って行います)場合、Perl のコマンドラインで -Dx を指定することによって解析木を検査することができます。 その出力はノード毎に数行を取り、$b+$c は以下のようになります。

    5           TYPE = add  ===> 6
                TARG = 1
                FLAGS = (SCALAR,KIDS)
                {
                    TYPE = null  ===> (4)
                      (was rv2sv)
                    FLAGS = (SCALAR,KIDS)
                    {
    3                   TYPE = gvsv  ===> 4
                        FLAGS = (SCALAR)
                        GV = main::b
                    }
                }
                {
                    TYPE = null  ===> (5)
                      (was rv2sv)
                    FLAGS = (SCALAR,KIDS)
                    {
    4                   TYPE = gvsv  ===> 5
                        FLAGS = (SCALAR)
                        GV = main::c
                    }
                }

This tree has 5 nodes (one per TYPE specifier), only 3 of them are not optimized away (one per number in the left column). The immediate children of the given node correspond to {} pairs on the same level of indentation, thus this listing corresponds to the tree:

この木には五つのノード(TYPE 毎にひとつ)があって、そのうちの 三つだけが最適化されないものです(左側に数字のあるもの)。 与えられたノードのすぐ下にある子供は同じレベルのインデントにある {} の ペアに対応します; したがって、このリストは以下の木に対応します。

                   add
                 /     \
               null    null
                |       |
               gvsv    gvsv

The execution order is indicated by ===> marks, thus it is 3 4 5 6 (node 6 is not included into above listing), i.e., gvsv gvsv add whatever.

実行順序は ===> マークによって表わされますから、3 4 5 6 (ノード 6は、上にあるリストには含まれません)となります; つまり、gvsv gvsv add whatever ということになります。

Each of these nodes represents an op, a fundamental operation inside the Perl core. The code which implements each operation can be found in the pp*.c files; the function which implements the op with type gvsv is pp_gvsv, and so on. As the tree above shows, different ops have different numbers of children: add is a binary operator, as one would expect, and so has two children. To accommodate the various different numbers of children, there are various types of op data structure, and they link together in different ways.

ノードのそれぞれは op を示し、これは Perl コア内部の基本的な操作です。 それぞれの操作を実装しているコードは pp*.c ファイルにあります; gvsv 型の op を実装している関数は pp_gvsv、といった形です。 上述の木において、異なった op は異なった数の子を持ちます: add は 二項演算子で、推測される通り、二つの子を持ちます。 様々に異なる数の子に対応するために、op データ構造には様々な種類があり、 異なった方法で互いにリンクしています。

The simplest type of op structure is OP: this has no children. Unary operators, UNOPs, have one child, and this is pointed to by the op_first field. Binary operators (BINOPs) have not only an op_first field but also an op_last field. The most complex type of op is a LISTOP, which has any number of children. In this case, the first child is pointed to by op_first and the last child by op_last. The children in between can be found by iteratively following the OpSIBLING pointer from the first child to the last (but see below).

op 構造体の最も単純な型は OP です: これは子はありません。 単項演算子である UNOP は一つの子を持ち、これは op_first フィールドによって示されています。 二項演算子 (BINOP) は op_first フィールドだけでなく op_last フィールドも持ちます。 最も複雑な op の型は LISTOP で、任意の数の子を持ちます。 この場合、最初の子は op_first で示され、最後の子は op_last で示されます。 その間の子は、最初の子から最後の子まで OpSIBLING ポインタを反復的に 辿ることで見つけられます(しかし以降を参照してください)。

There are also some other op types: a PMOP holds a regular expression, and has no children, and a LOOP may or may not have children. If the op_children field is non-zero, it behaves like a LISTOP. To complicate matters, if a UNOP is actually a null op after optimization (see "Compile pass 2: context propagation") it will still have children in accordance with its former type.

あといくつかの op 型があります: PMOP は正規表現を保持し、子はありません; また LOOP は子があるかもしれませんしないかもしれません。 op_children フィールドが非ゼロなら、LISTOP のように振る舞います。 問題を複雑にするために、もし UNOP が最適化の後実際には null op になった場合 ("Compile pass 2: context propagation" を 参照してください)、これは以前の形に一致する形で子を持ちます。

Finally, there is a LOGOP, or logic op. Like a LISTOP, this has one or more children, but it doesn't have an op_last field: so you have to follow op_first and then the OpSIBLING chain itself to find the last child. Instead it has an op_other field, which is comparable to the op_next field described below, and represents an alternate execution path. Operators like and, or and ? are LOGOPs. Note that in general, op_other may not point to any of the direct children of the LOGOP.

Finally, there is a LOGOP, or logic op. Like a LISTOP, this has one or more children, but it doesn't have an op_last field: so you have to follow op_first and then the OpSIBLING chain itself to find the last child. Instead it has an op_other field, which is comparable to the op_next field described below, and represents an alternate execution path. Operators like and, or and ? are LOGOPs. Note that in general, op_other may not point to any of the direct children of the LOGOP. (TBT)

Starting in version 5.21.2, perls built with the experimental define -DPERL_OP_PARENT add an extra boolean flag for each op, op_moresib. When not set, this indicates that this is the last op in an OpSIBLING chain. This frees up the op_sibling field on the last sibling to point back to the parent op. Under this build, that field is also renamed op_sibparent to reflect its joint role. The macro OpSIBLING(o) wraps this special behaviour, and always returns NULL on the last sibling. With this build the op_parent(o) function can be used to find the parent of any op. Thus for forward compatibility, you should always use the OpSIBLING(o) macro rather than accessing op_sibling directly.

Starting in version 5.21.2, perls built with the experimental define -DPERL_OP_PARENT add an extra boolean flag for each op, op_moresib. When not set, this indicates that this is the last op in an OpSIBLING chain. This frees up the op_sibling field on the last sibling to point back to the parent op. Under this build, that field is also renamed op_sibparent to reflect its joint role. The macro OpSIBLING(o) wraps this special behaviour, and always returns NULL on the last sibling. With this build the op_parent(o) function can be used to find the parent of any op. Thus for forward compatibility, you should always use the OpSIBLING(o) macro rather than accessing op_sibling directly. (TBT)

Another way to examine the tree is to use a compiler back-end module, such as B::Concise.

木を調べるその他の方法は、B::Concise のようなコンパイラバックエンド モジュールを使うことです。

コンパイルパス1: チェックルーチン

The tree is created by the compiler while yacc code feeds it the constructions it recognizes. Since yacc works bottom-up, so does the first pass of perl compilation.

この木構造は、yacc が perl プログラムを読み込んでその構造を解析している 間にコンパイラによって生成されます。 yacc はボトムアップで動作するので、perl によるコンパイルの最初のパスで 行なわれます。

What makes this pass interesting for perl developers is that some optimization may be performed on this pass. This is optimization by so-called "check routines". The correspondence between node names and corresponding check routines is described in opcode.pl (do not forget to run make regen_headers if you modify this file).

perl 開発者にとって興味深いのは、このパスで行なわれるいくつかの 最適化でしょう。 これは、"check routines" とも呼ばれる最適化です。 ノード名と対応するチェックルーチンとの間の対応は opcode.pl に 記述されています(このファイルを修正した場合には、make regen_headers を 実行することを忘れないでください)。

A check routine is called when the node is fully constructed except for the execution-order thread. Since at this time there are no back-links to the currently constructed node, one can do most any operation to the top-level node, including freeing it and/or creating new nodes above/below it.

チェックルーチンは、ノードが実行順序スレッドを除いて完全に 構築されたときに呼び出されます。 この時点では、構築されたノードに対する back-line が存在しないので、 トップレベルノードに対して、新たなノードを生成したりノードを 解放したりすることを含めて、ほとんどの操作を行うことができます。

The check routine returns the node which should be inserted into the tree (if the top-level node was not modified, check routine returns its argument).

このチェックルーチンは木に挿入すべきノードを返します(トップレベルの ノードが変更されていなければ、チェックルーチンはその引数を返します)。

By convention, check routines have names ck_*. They are usually called from new*OP subroutines (or convert) (which in turn are called from perly.y).

規約により、チェックルーチンは ck_* のような名前を持ちます。 これらは通常サブルーチン new*OP (もしくは convert) から 呼び出されます(これらのサブルーチンは perly.y から呼び出されます)。

コンパイルパス1a: 定数の畳み込み

Immediately after the check routine is called the returned node is checked for being compile-time executable. If it is (the value is judged to be constant) it is immediately executed, and a constant node with the "return value" of the corresponding subtree is substituted instead. The subtree is deleted.

チェックルーチンが呼び出された直後に、返されたノードはコンパイル時実行の ためのチェックが行なわれます。 もしそうであれば(値が定数であると判定された)、そのノードは即座に実行されて、 「戻り値」に対応する部分木は 定数 ノードで置換され、部分木が削除されます。

If constant folding was not performed, the execution-order thread is created.

定数の畳み込み(constant folding)が働かなければ、実行順序スレッドが 生成されます。

コンパイルパス2: コンテキスト伝播

When a context for a part of compile tree is known, it is propagated down through the tree. At this time the context can have 5 values (instead of 2 for runtime context): void, boolean, scalar, list, and lvalue. In contrast with the pass 1 this pass is processed from top to bottom: a node's context determines the context for its children.

解析木の一部分のコンテキストがわかっているとき、それは木の末端へ伝播します。 このとき、コンテキストは(実行時コンテキストの二種類ではなく) 無効、真偽値、スカラ、リスト、左辺値の五種類の値を持つことができます。 パス 1 とは対照的に、このパスではトップから末端へと処理が進みます: あるノードのコンテキストは、その下にある部分のコンテキストを決定します。

Additional context-dependent optimizations are performed at this time. Since at this moment the compile tree contains back-references (via "thread" pointers), nodes cannot be free()d now. To allow optimized-away nodes at this stage, such nodes are null()ified instead of free()ing (i.e. their type is changed to OP_NULL).

コンテキストに依存した最適化はこのときに行なわれます。 この動作では解析木が("スレッド" ポインタを通じて)後方参照を含んでいるので、 ノードをこの時に free() することはできません。 このステージでノードを最適化するのを許すために、対象となるノードは free() されるかわりに null() されます(つまり、そのノードの型が OP_NULL に 変えられるということ)。

コンパイルパス 3: 覗き穴最適化

After the compile tree for a subroutine (or for an eval or a file) is created, an additional pass over the code is performed. This pass is neither top-down or bottom-up, but in the execution order (with additional complications for conditionals). Optimizations performed at this stage are subject to the same restrictions as in the pass 2.

サブルーチン(もしくは eval かファイル)に対する解析木が生成された後で、 そのコードに対する追加パスが実行されます。 このパスはトップダウンでもボトムアップでもなく、(条件に対する複雑さを伴った) 実行順序です。 このステージで行なわれる最適化はパス 2 でのものと同じ制限に従います。

Peephole optimizations are done by calling the function pointed to by the global variable PL_peepp. By default, PL_peepp just calls the function pointed to by the global variable PL_rpeepp. By default, that performs some basic op fixups and optimisations along the execution-order op chain, and recursively calls PL_rpeepp for each side chain of ops (resulting from conditionals). Extensions may provide additional optimisations or fixups, hooking into either the per-subroutine or recursive stage, like this:

大域変数 PL_peepp で示されている関数を呼び出すことによって、覗き穴最適化が 行われます。 デフォルトでは、PL_peepp は単に大域変数 PL_rpeepp で示されている 関数を呼び出します。 デフォルトでは、これは実行順 op チェーンに対する基本的な op の修正と最適化を 行い、また(条件文の結果の) op のチェーンの両側に対して再帰的に PL_rpeepp を 呼び出します。 エクステンションは、以下のように、サブルーチン毎か再帰ステージのどちらかに フックすることでさらなる最適化や修正を提供できます:

    static peep_t prev_peepp;
    static void my_peep(pTHX_ OP *o)
    {
        /* custom per-subroutine optimisation goes here */
        prev_peepp(aTHX_ o);
        /* custom per-subroutine optimisation may also go here */
    }
    BOOT:
        prev_peepp = PL_peepp;
        PL_peepp = my_peep;

    static peep_t prev_rpeepp;
    static void my_rpeep(pTHX_ OP *o)
    {
        OP *orig_o = o;
        for(; o; o = o->op_next) {
            /* custom per-op optimisation goes here */
        }
        prev_rpeepp(aTHX_ orig_o);
    }
    BOOT:
        prev_rpeepp = PL_rpeepp;
        PL_rpeepp = my_rpeep;

プラガブルな runops

The compile tree is executed in a runops function. There are two runops functions, in run.c and in dump.c. Perl_runops_debug is used with DEBUGGING and Perl_runops_standard is used otherwise. For fine control over the execution of the compile tree it is possible to provide your own runops function.

コンパイル木は runops 関数で実行されます。 run.cdump.c に二つの関数があります。 Perl_runops_debug は DEBUGGING で使われ、Perl_runops_standard は その他で使われます。 コンパイル木の実行を細かく制御するために、独自の runops 関数を 設定できます。

It's probably best to copy one of the existing runops functions and change it to suit your needs. Then, in the BOOT section of your XS file, add the line:

既にある runops 関数の一つをコピーして、必要性に合わせて変更するのが おそらく最良です。 それから、XS ファイルの BOOT セクションに、以下の行を追加します:

  PL_runops = my_runops;

This function should be as efficient as possible to keep your programs running as fast as possible.

この関数はプログラムを出来るだけ早く実行し続けられるように、出来るだけ 効率的にするべきです。

コンパイル時スコープフック

As of perl 5.14 it is possible to hook into the compile-time lexical scope mechanism using Perl_blockhook_register. This is used like this:

perl 5.14 から、Perl_blockhook_register を使って、コンパイル時 レキシカルスコープ機構にフックすることができるようになりました。 これは次のようにして使います:

    STATIC void my_start_hook(pTHX_ int full);
    STATIC BHK my_hooks;

    BOOT:
        BhkENTRY_set(&my_hooks, bhk_start, my_start_hook);
        Perl_blockhook_register(aTHX_ &my_hooks);

This will arrange to have my_start_hook called at the start of compiling every lexical scope. The available hooks are:

これは、レキシカルスコープのコンパイルを開始する毎に my_start_hook が 呼び出されるように設定します。 利用可能なフックは:

void bhk_start(pTHX_ int full)

This is called just after starting a new lexical scope. Note that Perl code like

これは新しいレキシカルスコープの開始の直後に呼び出されます。 次のような Perl コードは

    if ($x) { ... }

creates two scopes: the first starts at the ( and has full == 1, the second starts at the { and has full == 0. Both end at the }, so calls to start and pre/post_end will match. Anything pushed onto the save stack by this hook will be popped just before the scope ends (between the pre_ and post_end hooks, in fact).

二つのスコープを作ることに注意してください: 一つ目は ( の場所で full == 1 を持って始まり、二つ目は { の場所で full == 0 を持って 始まります。 両方の末尾は } なので、startpre/post_end の呼び出しは 一致します。 このフックで保存スタックにプッシュされたあらゆるものはスコープが終わる直前 (実際には pre_post_end のフックの間) にポップされます。

void bhk_pre_end(pTHX_ OP **o)

This is called at the end of a lexical scope, just before unwinding the stack. o is the root of the optree representing the scope; it is a double pointer so you can replace the OP if you need to.

これはレキシカルスコープの終わり、スタックを巻き戻す直前に呼び出されます。 o はスコープを表現する op 木のルートです; これはダブルポインタなので 必要なら OP を入れ替えることができます。

void bhk_post_end(pTHX_ OP **o)

This is called at the end of a lexical scope, just after unwinding the stack. o is as above. Note that it is possible for calls to pre_ and post_end to nest, if there is something on the save stack that calls string eval.

これはレキシカルスコープの終わり、スタックを巻き戻した直後に呼び出されます。 o は上述の通りです。 保存スタック上に文字列 eval を呼び出すものがあった場合、pre_post_end がネストして呼び出される可能性があることに注意してください。

void bhk_eval(pTHX_ OP *const o)

This is called just before starting to compile an eval STRING, do FILE, require or use, after the eval has been set up. o is the OP that requested the eval, and will normally be an OP_ENTEREVAL, OP_DOFILE or OP_REQUIRE.

これは eval STRING, do FILE, require, use のコンパイルを始める 直前、eval が設定された後に呼び出されます。 o は eval を要求した OP で、通常は OP_ENTEREVAL, OP_DOFILE, OP_REQUIRE のいずれかです。

Once you have your hook functions, you need a BHK structure to put them in. It's best to allocate it statically, since there is no way to free it once it's registered. The function pointers should be inserted into this structure using the BhkENTRY_set macro, which will also set flags indicating which entries are valid. If you do need to allocate your BHK dynamically for some reason, be sure to zero it before you start.

フック関数を持つと、それを入れる BHK 構造体が必要です。 これは静的に割り当てるのが最良です; 一度登録すると解放する方法はないからです。 関数ポインタは BhkENTRY_set マクロを使ってこの構造体に挿入されます; これはまたどのエントリが有効化を示すフラグを設定します。 何らかの理由で BHK を動的に割り当てる必要がある場合、開始前にゼロで 埋めておく必要があります。

Once registered, there is no mechanism to switch these hooks off, so if that is necessary you will need to do this yourself. An entry in %^H is probably the best way, so the effect is lexically scoped; however it is also possible to use the BhkDISABLE and BhkENABLE macros to temporarily switch entries on and off. You should also be aware that generally speaking at least one scope will have opened before your extension is loaded, so you will see some pre/post_end pairs that didn't have a matching start.

フックが一旦登録されると、無効にするための機構はないので、それが必要な 場合は自分自身でそうする必要があります。 %^H のエントリはおそらく最良の方法です; 効果はレキシカルスコープを 持つからです; しかし一時的にエントリを有効または無効にするために BhkDISABLEBhkENABLE マクロを使うことも可能です。 また、一般的に言ってエクステンションが読み込まれる前に最低一つのスコープが 開いているので、対になる start のない pre/post_end の組を見ることにも 注意するべきです。

Examining internal data structures with the dump functions

(内部データ構造を dump 関数で調べる)

To aid debugging, the source file dump.c contains a number of functions which produce formatted output of internal data structures.

デバッグを助けるために、ソースファイル dump.c に内部データ構造の フォーマットした出力を生成する多くの関数があります。

The most commonly used of these functions is Perl_sv_dump; it's used for dumping SVs, AVs, HVs, and CVs. The Devel::Peek module calls sv_dump to produce debugging output from Perl-space, so users of that module should already be familiar with its format.

これらの関数で最もよく使われるものは Perl_sv_dump です; これは SV, AV, HV, CV をダンプするために使います。 Devel::Peek モジュールは、Perl 空間からのデバッグ出力を作成するために sv_dump を呼び出すので、このモジュールのユーザーは既にこのフォーマットに 親しみがあるはずです。

Perl_op_dump can be used to dump an OP structure or any of its derivatives, and produces output similar to perl -Dx; in fact, Perl_dump_eval will dump the main root of the code being evaluated, exactly like -Dx.

Perl_op_dump は、OP 構造体やその派生をダンプするために使い、 perl -Dx と同様の出力を作成します; 実際のところ、Perl_dump_eval-Dx と正確に同じように、評価されたコードの main ルートをダンプします。

Other useful functions are Perl_dump_sub, which turns a GV into an op tree, Perl_dump_packsubs which calls Perl_dump_sub on all the subroutines in a package like so: (Thankfully, these are all xsubs, so there is no op tree)

その他の有用な関数は、GV を op 木に変換する Perl_dump_sub と、 パッケージの全てのサブルーチンで Perl_dump_sub を呼び出す Perl_dump_packsubs: (ありがたいことに、これらは全て xsub なので、 op 木はありません)

    (gdb) print Perl_dump_packsubs(PL_defstash)

    SUB attributes::bootstrap = (xsub 0x811fedc 0)

    SUB UNIVERSAL::can = (xsub 0x811f50c 0)

    SUB UNIVERSAL::isa = (xsub 0x811f304 0)

    SUB UNIVERSAL::VERSION = (xsub 0x811f7ac 0)

    SUB DynaLoader::boot_DynaLoader = (xsub 0x805b188 0)

and Perl_dump_all, which dumps all the subroutines in the stash and the op tree of the main root.

および、stash の全てのサブルーチンと main ルートの op 木をダンプする Perl_dump_all です。

複数インタプリタと並列性にどのように対応しているか

背景と PERL_IMPLICIT_CONTEXT

The Perl interpreter can be regarded as a closed box: it has an API for feeding it code or otherwise making it do things, but it also has functions for its own use. This smells a lot like an object, and there are ways for you to build Perl so that you can have multiple interpreters, with one interpreter represented either as a C structure, or inside a thread-specific structure. These structures contain all the context, the state of that interpreter.

Perl インタプリタはブラックボックスとして扱われます: コードに与えたり、 何かをするための API がありますが、自分自身で使うための関数もあります。 これはオブジェクトのような匂いがして、それぞれを C の構造体や スレッド固有の構造体の内部として表現する、複数のインタプリタを使えるように Perl をビルドするための方法があります。 これらの構造体はそのインタプリタの全てのコンテキストと状態を含みます。

One macro controls the major Perl build flavor: MULTIPLICITY. The MULTIPLICITY build has a C structure that packages all the interpreter state. With multiplicity-enabled perls, PERL_IMPLICIT_CONTEXT is also normally defined, and enables the support for passing in a "hidden" first argument that represents all three data structures. MULTIPLICITY makes multi-threaded perls possible (with the ithreads threading model, related to the macro USE_ITHREADS.)

一つのマクロは主な Perl ビルド設定: MULTIPLICITY です。 MULTIPLICITY ビルドは全てのインタプリタ状態をパッケージした C の構造体を 持ちます。 MULTIPLICITY を遊行した perl では、PERL_IMPLICIT_CONTEXT も普通設定され、 三つのデータ構造体全てを表現する「隠された」最初の引数を渡すことへの 対応が有効になります。 MULTIPLICITY は(マクロ USE_ITHREADS に関連する ithread スレッドモデルで) マルチスレッド perl を可能にします。

Two other "encapsulation" macros are the PERL_GLOBAL_STRUCT and PERL_GLOBAL_STRUCT_PRIVATE (the latter turns on the former, and the former turns on MULTIPLICITY.) The PERL_GLOBAL_STRUCT causes all the internal variables of Perl to be wrapped inside a single global struct, struct perl_vars, accessible as (globals) &PL_Vars or PL_VarsPtr or the function Perl_GetVars(). The PERL_GLOBAL_STRUCT_PRIVATE goes one step further, there is still a single struct (allocated in main() either from heap or from stack) but there are no global data symbols pointing to it. In either case the global struct should be initialized as the very first thing in main() using Perl_init_global_struct() and correspondingly tear it down after perl_free() using Perl_free_global_struct(), please see miniperlmain.c for usage details. You may also need to use dVAR in your coding to "declare the global variables" when you are using them. dTHX does this for you automatically.

あと二つの「カプセル化」マクロは PERL_GLOBAL_STRUCT と PERL_GLOBAL_STRUCT_PRIVATE です(後者は前者を有効にして、前者は MULTIPLICITY を有効にします。) PERL_GLOBAL_STRUCT は Perl の全ての内部変数を一つグローバル構造体である struct perl_vars にラップして、(グローバルに) &PL_Vars, PL_VarsPtr, Perl_GetVars() 関数でアクセスできます。 PERL_GLOBAL_STRUCT_PRIVATE はもう一歩進めて、やはり(main() でヒープか スタックに割り当てられた)一つの構造体ですが、これを示すグローバルな データシンボルはありません。 どちらの場合でもグローバルな構造体は Perl_init_global_struct() を使って main() の最初で初期化され、Perl_free_global_struct() を使って perl_free() の 後で解放されます; 詳細な使用法については miniperlmain.c を 参照してください。 これらを使う時、「グローバル変数を宣言する」ためにコード中で dVAR を 使う必要があるかもしれません。 dTHX はこれを自動的に行います。

To see whether you have non-const data you can use a BSD (or GNU) compatible nm:

非固定データがあるかどうかを見るには、BSD (または GNU) 互換の nm を使えます:

  nm libperl.a | grep -v ' [TURtr] '

If this displays any D or d symbols (or possibly C or c), you have non-const data. The symbols the grep removed are as follows: Tt are text, or code, the Rr are read-only (const) data, and the U is <undefined>, external symbols referred to.

D または d シンボル (またはもしかすると Cc) が表示されたら、非 const データがあります。 grep が削除したシンボルは次の通りです: Tttext またはコード、Rr読み込み専用の (固定) データ、 U が未定義値、参照される外部シンボルです。

The test t/porting/libperl.t does this kind of symbol sanity checking on libperl.a.

t/porting/libperl.t テストは、libperl.a でこの種の シンボルの正気チェックを行います。

For backward compatibility reasons defining just PERL_GLOBAL_STRUCT doesn't actually hide all symbols inside a big global struct: some PerlIO_xxx vtables are left visible. The PERL_GLOBAL_STRUCT_PRIVATE then hides everything (see how the PERLIO_FUNCS_DECL is used).

後方互換性のために、単に PERL_GLOBAL_STRUCT を定義しただけでは 大きなグローバル構造体の全てのシンボルは隠れません: いくつかの PerlIO_xxx vtables は見えるままです。 PERL_GLOBAL_STRUCT_PRIVATE は全てを隠します ( PERLIO_FUNCS_DECL の 使い方を参照してください)。

All this obviously requires a way for the Perl internal functions to be either subroutines taking some kind of structure as the first argument, or subroutines taking nothing as the first argument. To enable these two very different ways of building the interpreter, the Perl source (as it does in so many other situations) makes heavy use of macros and subroutine naming conventions.

これら全ては明らかに、Perl 内部関数を、ある種の構造体を最初の引数として取る サブルーチンか、最初の引数に何も取らないサブルーチンにする方法が必要です。 インタプリタのビルドをかなり異なった方法でこれら二つを有効にするために、 Perl ソースは(その他の多くの状況で行うのと同様) マクロとサブルーチンの 命名規則を激しく使っています。

First problem: deciding which functions will be public API functions and which will be private. All functions whose names begin S_ are private (think "S" for "secret" or "static"). All other functions begin with "Perl_", but just because a function begins with "Perl_" does not mean it is part of the API. (See "Internal Functions".) The easiest way to be sure a function is part of the API is to find its entry in perlapi. If it exists in perlapi, it's part of the API. If it doesn't, and you think it should be (i.e., you need it for your extension), send mail via perlbug explaining why you think it should be.

最初の問題: どの関数が公的な API 関数になる関数で、どの関数が プライベートかを決定する。 名前が S_ で始まる全ての関数はプライベートです ("S" は "secret" または "static" と考えてください)。 その他の全ての関数は "Perl_" で始まりますが、"Perl_" で始まっているからと いって API の一部とは限りません。 ("Internal Functions" を参照してください。) 関数が API の一部であることを 確認する 最も簡単な方法は、 perlapi からエントリを探すことです。 もし perlapi にあれば、API の一部です。 もしなくて、あなたが これは API であるべきと考える(つまり、あなたの エクステンションに必要)なら、どうしてそう考えるかを説明したメールを perlbug で送ってください。

Second problem: there must be a syntax so that the same subroutine declarations and calls can pass a structure as their first argument, or pass nothing. To solve this, the subroutines are named and declared in a particular way. Here's a typical start of a static function used within the Perl guts:

二番目の問題: 同じサブルーチン定義と呼び出しが最初の引数として構造体を 渡せるようにするか、何も渡さないようにする文法でなければなりません。 問題を解決するために、サブルーチンは決められた方法で命名して宣言されます。 以下は、Perl の内部で使われている静的関数の典型的な開始部分です:

  STATIC void
  S_incline(pTHX_ char *s)

STATIC becomes "static" in C, and may be #define'd to nothing in some configurations in the future.

STATIC は C では "static" になり、将来一部の設定では何もしないように #define されます。

A public function (i.e. part of the internal API, but not necessarily sanctioned for use in extensions) begins like this:

公的な関数(つまり内部 API の一部ですが、エクステンションで使うのに許可は 不要なもの)は以下のように始まります:

  void
  Perl_sv_setiv(pTHX_ SV* dsv, IV num)

pTHX_ is one of a number of macros (in perl.h) that hide the details of the interpreter's context. THX stands for "thread", "this", or "thingy", as the case may be. (And no, George Lucas is not involved. :-) The first character could be 'p' for a prototype, 'a' for argument, or 'd' for declaration, so we have pTHX, aTHX and dTHX, and their variants.

pTHX_ は、インタプリタのコンテキストの詳細を隠すための(perl.h にある) 多くのマクロの一つです。 THX は "thread", "this", "thingy" などから来ています。 (そしてジョージルーカスは関係ありません。:-) 最初の文字は 'p' がプロトタイプ(prototype)、'a' が引数(argument)、 'd' が宣言(declaration) を意味するので、pTHX, aTHX, dTHX および その変形があります。

When Perl is built without options that set PERL_IMPLICIT_CONTEXT, there is no first argument containing the interpreter's context. The trailing underscore in the pTHX_ macro indicates that the macro expansion needs a comma after the context argument because other arguments follow it. If PERL_IMPLICIT_CONTEXT is not defined, pTHX_ will be ignored, and the subroutine is not prototyped to take the extra argument. The form of the macro without the trailing underscore is used when there are no additional explicit arguments.

PERL_IMPLICIT_CONTEXT が設定されたオプションなしで Perl がビルドされると、 インタプリタのコンテキストに最初の引数は含まれません。 pTHX_ マクロの末尾の下線は、他の引数が引き続くのでマクロ拡張はコンテキスト 引数の後にカンマが必要であることを示しています。 PERL_IMPLICIT_CONTEXT が定義されていない場合、pTHX_ は無視され、 サブルーチンは追加の引数を取るようなプロトタイプを持ちません。 引き続く下線なしのマクロの形式は、追加の明示的な引数がない場合に使われます。

When a core function calls another, it must pass the context. This is normally hidden via macros. Consider sv_setiv. It expands into something like this:

コア関数が他の関数を呼び出すとき、コンテキストを渡さなければなりません。 これは普通マクロ経由で隠されます。 sv_setiv を考えてみます。 これは以下のような感じに展開されます:

    #ifdef PERL_IMPLICIT_CONTEXT
      #define sv_setiv(a,b)      Perl_sv_setiv(aTHX_ a, b)
      /* can't do this for vararg functions, see below */
    #else
      #define sv_setiv           Perl_sv_setiv
    #endif

This works well, and means that XS authors can gleefully write:

これはうまく動きますし、XS 作者は喜んで以下のように書けます:

    sv_setiv(foo, bar);

and still have it work under all the modes Perl could have been compiled with.

そしてやはり Perl がコンパイルされる全てのモードで動作します。

This doesn't work so cleanly for varargs functions, though, as macros imply that the number of arguments is known in advance. Instead we either need to spell them out fully, passing aTHX_ as the first argument (the Perl core tends to do this with functions like Perl_warner), or use a context-free version.

しかし、可変長引数関数ではそれほどきれいには動作しません; マクロは事前に 引数の数が分かっていることを仮定しているからです。 どちらかを完全に綴る必要があるようにする代わりに、最初の引数として aTHX_ を渡す(Perl コアは Perl_warner のような関数でこれをする 傾向があります)か、コンテキストの影響を受けないバージョンを使います。

The context-free version of Perl_warner is called Perl_warner_nocontext, and does not take the extra argument. Instead it does dTHX; to get the context from thread-local storage. We #define warner Perl_warner_nocontext so that extensions get source compatibility at the expense of performance. (Passing an arg is cheaper than grabbing it from thread-local storage.)

Perl_warner のコンテキストの影響を受けないバージョンは Perl_warner_nocontext と呼ばれ、追加の引数を取りません。 代わりに、スレッドローカルなストレージからコンテキストを得るために dTHX; します。 エクステンションが性能のコストでソース互換性を得るために #define warner Perl_warner_nocontext とします。 (一つの引数を渡すのはスレッドローカルなストレージから値を取り出すよりも 安価です。)

You can ignore [pad]THXx when browsing the Perl headers/sources. Those are strictly for use within the core. Extensions and embedders need only be aware of [pad]THX.

Perl ヘッダ/ソースを見るときには [pad]THXx を無視できます。 これらは純粋にコア内部での使用のためのものです。 エクステンションと組み込みだけが [pad]THX の存在を知る必要があります。

それで dTHR に何が起こるの?

dTHR was introduced in perl 5.005 to support the older thread model. The older thread model now uses the THX mechanism to pass context pointers around, so dTHR is not useful any more. Perl 5.6.0 and later still have it for backward source compatibility, but it is defined to be a no-op.

dTHR は、古いスレッドモデルに対応するために perl 5.005 で導入されました。 古いスレッドモデルは今ではコンテキストのポインタを渡すのに THX 機構を 使うので、dTHR はもはや有用ではありません。 Perl 5.6.0 以降では、ソースの後方互換性のためにまだ存在していますが、 何もしないように定義されています。

これら全てをエクステンションで使うには?

When Perl is built with PERL_IMPLICIT_CONTEXT, extensions that call any functions in the Perl API will need to pass the initial context argument somehow. The kicker is that you will need to write it in such a way that the extension still compiles when Perl hasn't been built with PERL_IMPLICIT_CONTEXT enabled.

Perl が PERL_IMPLICIT_CONTEXT 付きでビルドされると、Perl API の関数を 呼び出すエクステンションは何か初期コンテキスト引数を渡す必要があります。 キッカーは、Perl が PERL_IMPLICIT_CONTEXT を有効にせずにビルドされたときにも エクステンションがコンパイルできるようにそれを書く方法が必要ということです。

There are three ways to do this. First, the easy but inefficient way, which is also the default, in order to maintain source compatibility with extensions: whenever XSUB.h is #included, it redefines the aTHX and aTHX_ macros to call a function that will return the context. Thus, something like:

これをするには三つの方法があります。 最初に、簡単だけれども効率的ではない方法ですが、エクステンションのソース 互換性を維持するために、これがデフォルトです: XSUB.h が #include されると、 コンテキストを返す関数を呼び出すように aTHX と aTHX_ のマクロを再定義します。 従って、以下のようなものが:

        sv_setiv(sv, num);

in your extension will translate to this when PERL_IMPLICIT_CONTEXT is in effect:

エクステンションにあると、PERL_IMPLICIT_CONTEXT が有効なら、以下のように 翻訳します:

        Perl_sv_setiv(Perl_get_context(), sv, num);

or to this otherwise:

さもなければ、こうなります:

        Perl_sv_setiv(sv, num);

You don't have to do anything new in your extension to get this; since the Perl library provides Perl_get_context(), it will all just work.

これをするためにエクステンション何の新しいこともする必要はありません; Perl ライブラリは Perl_get_context() を提供するので、全てうまく動作します。

The second, more efficient way is to use the following template for your Foo.xs:

次に、より効率的な方法は、Foo.xs に以下のテンプレートを使うことです:

        #define PERL_NO_GET_CONTEXT     /* we want efficiency */
        #include "EXTERN.h"
        #include "perl.h"
        #include "XSUB.h"

        STATIC void my_private_function(int arg1, int arg2);

        STATIC void
        my_private_function(int arg1, int arg2)
        {
            dTHX;       /* fetch context */
            ... call many Perl API functions ...
        }

        [... etc ...]

        MODULE = Foo            PACKAGE = Foo

        /* typical XSUB */

        void
        my_xsub(arg)
                int arg
            CODE:
                my_private_function(arg, 10);

Note that the only two changes from the normal way of writing an extension is the addition of a #define PERL_NO_GET_CONTEXT before including the Perl headers, followed by a dTHX; declaration at the start of every function that will call the Perl API. (You'll know which functions need this, because the C compiler will complain that there's an undeclared identifier in those functions.) No changes are needed for the XSUBs themselves, because the XS() macro is correctly defined to pass in the implicit context if needed.

エクステンションを書く通常の方法とただ二つの違いは、Perl ヘッダを インクルードする前に #define PERL_NO_GET_CONTEXT を追加して、 Perl API を呼び出す全ての関数の先頭に dTHX; 宣言を書くということに 注意してください。 (どの関数にこれが必要なのかは分かります; これらの関数に未宣言の識別子があると C コンパイラがエラーを出すからです。) XSUB 自身には変更は必要ありません; なぜなら XS() マクロは、もし必要なら 暗黙のコンテキストを渡すように正しく定義されるからです。

The third, even more efficient way is to ape how it is done within the Perl guts:

3 番目に、さらに効率的な方法は、Perl の内部で行われている方法を 真似ることです:

        #define PERL_NO_GET_CONTEXT     /* we want efficiency */
        #include "EXTERN.h"
        #include "perl.h"
        #include "XSUB.h"

        /* pTHX_ only needed for functions that call Perl API */
        STATIC void my_private_function(pTHX_ int arg1, int arg2);

        STATIC void
        my_private_function(pTHX_ int arg1, int arg2)
        {
            /* dTHX; not needed here, because THX is an argument */
            ... call Perl API functions ...
        }

        [... etc ...]

        MODULE = Foo            PACKAGE = Foo

        /* typical XSUB */

        void
        my_xsub(arg)
                int arg
            CODE:
                my_private_function(aTHX_ arg, 10);

This implementation never has to fetch the context using a function call, since it is always passed as an extra argument. Depending on your needs for simplicity or efficiency, you may mix the previous two approaches freely.

この実装は、関数呼び出しを使ってコンテキストを取得する必要はありません; なぜなら常に追加の引数として渡されるからです。 単純さと効率性のどちらが必要かに応じて、前述の二つの手法と自由に 混ぜてもかまいません。

Never add a comma after pTHX yourself--always use the form of the macro with the underscore for functions that take explicit arguments, or the form without the argument for functions with no explicit arguments.

pTHX の後ろに自分でカンマを追加しないでください -- 明示的な引数を 取る関数の場合は下線のあるマクロの形式を、明示的な引数のない関数では 引数なしの形式を、常に使ってください。

If one is compiling Perl with the -DPERL_GLOBAL_STRUCT the dVAR definition is needed if the Perl global variables (see perlvars.h or globvar.sym) are accessed in the function and dTHX is not used (the dTHX includes the dVAR if necessary). One notices the need for dVAR only with the said compile-time define, because otherwise the Perl global variables are visible as-is.

-DPERL_GLOBAL_STRUCT 付きで Perl をコンパイルすると、Perl グローバル変数 (perlvars.hglobvar.sym を参照)が関数内でアクセスされて、 dVAR が使われない(dTHX は、必要なら dVAR をインクルードします)場合、 dVAR 定義が必要です。 dVAR の必要性はコンパイル時の定義でのみ気付きます; なぜならさもなければ Perl グローバル変数はそのまま見えるからです。

複数のスレッドから perl を呼び出すのに何か特別なことをするべき?

If you create interpreters in one thread and then proceed to call them in another, you need to make sure perl's own Thread Local Storage (TLS) slot is initialized correctly in each of those threads.

あるスレッドでインタプリタを作成して、それから他のスレッドでそれを 呼び出そうとするなら、perl の独自のスレッドローカルストレージ (Thread Local Storage (TLS)) スロットがそれぞれのスレッドで正しく 初期化されるようにする必要があります。

The perl_alloc and perl_clone API functions will automatically set the TLS slot to the interpreter they created, so that there is no need to do anything special if the interpreter is always accessed in the same thread that created it, and that thread did not create or call any other interpreters afterwards. If that is not the case, you have to set the TLS slot of the thread before calling any functions in the Perl API on that particular interpreter. This is done by calling the PERL_SET_CONTEXT macro in that thread as the first thing you do:

perl_allocperl_clone の API 関数は、作成されたインタプリタへの TLS スロットを自動的に設定するので、インタプリタを作成したスレッドと 同じスレッドでだけ使って、そのスレッドがその後他のインタプリタを作成したり 呼び出したりしないのなら、何も特別なことをする必要はありません。 そうでない場合、特定のインタプリタの Perl API の関数を呼び出す前に、 そのスレッドの TLS スロットを設定する必要があります。 これは、そのスレッドで最初にすることとして PERL_SET_CONTEXT マクロを 呼び出すことで行われます:

        /* do this before doing anything else with some_perl */
        PERL_SET_CONTEXT(some_perl);

        ... other Perl API calls on some_perl go here ...

将来の計画と PERL_IMPLICIT_SYS

Just as PERL_IMPLICIT_CONTEXT provides a way to bundle up everything that the interpreter knows about itself and pass it around, so too are there plans to allow the interpreter to bundle up everything it knows about the environment it's running on. This is enabled with the PERL_IMPLICIT_SYS macro. Currently it only works with USE_ITHREADS on Windows.

PERL_IMPLICIT_CONTEXT が、インタプリタが自分自身および渡されたものに関して 知っていること全てをまとめる方法を提供しているのとちょうど同じように、 インタプリタが自分が実行している環境について知っている全てを まとられるようにする計画があります。 これは PERL_IMPLICIT_SYS マクロで有効にされます。 現在のところ、これは Windows で USE_ITHREADS 付きの場合にのみ動作します。

This allows the ability to provide an extra pointer (called the "host" environment) for all the system calls. This makes it possible for all the system stuff to maintain their own state, broken down into seven C structures. These are thin wrappers around the usual system calls (see win32/perllib.c) for the default perl executable, but for a more ambitious host (like the one that would do fork() emulation) all the extra work needed to pretend that different interpreters are actually different "processes", would be done here.

これにより、全てのシステムコールのための(「ホスト」環境と呼ばれる) 追加のポインタを提供する能力を持つようになります。 これにより、独自の状態を保守する全てのシステムの機能について、七つの C 構造体に分解することが可能になります。 デフォルトの perl 実行ファイルのために、通常のシステムコールへの 薄いラッパです (win32/perllib.c を参照してください) が、 (fork() エミュレーションを行うような)より意欲的なホストのために、 異なるインタプリタが実際には異なる「プロセス」であることを装うために 必要になる全ての作業は、ここで行われます。

The Perl engine/interpreter and the host are orthogonal entities. There could be one or more interpreters in a process, and one or more "hosts", with free association between them.

Perl エンジン/インタプリタとホストは直交する概念です。 一つのプロセスに複数のインタプリタがあることもありますし、複数の「ホスト」が 互いに自由に関連しながらあることもあります。

内部関数

All of Perl's internal functions which will be exposed to the outside world are prefixed by Perl_ so that they will not conflict with XS functions or functions used in a program in which Perl is embedded. Similarly, all global variables begin with PL_. (By convention, static functions start with S_.)

外部の世界に曝されている Perl の内部関数の全ては Perl_ の接頭辞が ついているので、XS 関数や Perl が組み込まれている関数で使われている関数と 衝突しません。 同様に、全てのグローバル変数は PL_ で始まります。 (慣例的に、静的関数は S_ で始まります。)

Inside the Perl core (PERL_CORE defined), you can get at the functions either with or without the Perl_ prefix, thanks to a bunch of defines that live in embed.h. Note that extension code should not set PERL_CORE; this exposes the full perl internals, and is likely to cause breakage of the XS in each new perl release.

(PERL_CORE が定義されている) Perl コアの内側では、embed.h にある たくさんの define のおかげで、Perl_ 接頭辞ありとなしのどちらかの関数を 使えます。 エクステンションコードは PERL_CORE を設定するべきでは ありません; これは完全な perl 内部を暴露して、新しい perl のリリース毎に XS を 壊す原因となります。

The file embed.h is generated automatically from embed.pl and embed.fnc. embed.pl also creates the prototyping header files for the internal functions, generates the documentation and a lot of other bits and pieces. It's important that when you add a new function to the core or change an existing one, you change the data in the table in embed.fnc as well. Here's a sample entry from that table:

ファイル embed.h embed.plembed.fnc から自動的に生成されます。 embed.pl は内部関数のためのヘッダファイルのプロトタイプも作成し、 その他の多くの欠片の文書も生成します。 新しい関数をコアに追加したり既にあるものを変更したりした場合、 embed.fnc にある表のデータも変更することが重要です。 以下はその表のエントリの例です:

    Apd |SV**   |av_fetch   |AV* ar|I32 key|I32 lval

The second column is the return type, the third column the name. Columns after that are the arguments. The first column is a set of flags:

2 番目の列は返り値型で、3 番目の列は名前です。 それ以降の列は引数です。 最初の列はフラグの集合です:

A

This function is a part of the public API. All such functions should also have 'd', very few do not.

この関数は公式 API の一部です。 このような関数全ては 'd' も持っているべきですが、ごく一部は違います。

p

This function has a Perl_ prefix; i.e. it is defined as Perl_av_fetch.

この関数は Perl_ 接頭辞を持っています; つまり、Perl_av_fetch として 定義されています。

d

This function has documentation using the apidoc feature which we'll look at in a second. Some functions have 'd' but not 'A'; docs are good.

この関数は、すぐに見られる apidoc 機能を使った文書があります。 一部の関数は 'd' ですが 'A' ではありません; 文書はよいものです。

Other available flags are:

その他の利用可能なフラグは:

s

This is a static function and is defined as STATIC S_whatever, and usually called within the sources as whatever(...).

これは静的関数で、STATIC S_whatever として定義されており、普通は ソース中で whatever(...) として呼び出されます。

n

This does not need an interpreter context, so the definition has no pTHX, and it follows that callers don't use aTHX. (See "Background and PERL_IMPLICIT_CONTEXT".)

これはインタプリタのコンテキストを必要としないので、定義には pTHX はなく、 呼び出し元は aTHX を使いません。 ("Background and PERL_IMPLICIT_CONTEXT" を参照してください。)

r

This function never returns; croak, exit and friends.

この関数は返りません; croak, exit のようなものです。

f

This function takes a variable number of arguments, printf style. The argument list should end with ..., like this:

この関数は printf 形式の可変長の引数を取ります。 引数のリストは以下のように ... で終わります:

    Afprd   |void   |croak          |const char* pat|...
M

This function is part of the experimental development API, and may change or disappear without notice.

この関数は実験的開発 API の一部で、注意なしに変更されたり消滅したり するかもしれません。

o

This function should not have a compatibility macro to define, say, Perl_parse to parse. It must be called as Perl_parse.

この関数は、Perl_parse から parse のような定義されている互換性マクロを 持っていません。 これは Perl_parse として呼び出されなければなりません。

x

This function isn't exported out of the Perl core.

この関数は Perl コアの外側へエクスポートされません。

m

This is implemented as a macro.

これはマクロとして実装されています。

X

This function is explicitly exported.

この関数は明示的にエクスポートされます。

E

This function is visible to extensions included in the Perl core.

この関数は Perl コアに含まれるエクステンションから見えます。

b

Binary backward compatibility; this function is a macro but also has a Perl_ implementation (which is exported).

バイナリ後方互換性; この関数はマクロですが、(エクスポートされている) Perl_ 実装もあります。

others

See the comments at the top of embed.fnc for others.

その他については embed.fnc の先頭のコメントを参照してください。

If you edit embed.pl or embed.fnc, you will need to run make regen_headers to force a rebuild of embed.h and other auto-generated files.

embed.pl または embed.fnc を編集した場合、embed.h およびその他の 自動生成ファイルを強制的にリビルドするために make regen_headers を 実行する必要があります。

IV, UV, NV のフォーマットされた表示

If you are printing IVs, UVs, or NVS instead of the stdio(3) style formatting codes like %d, %ld, %f, you should use the following macros for portability

IV, UV, NVS を、stdio(3) 形式の %d, %ld, %f のような フォーマッティングコードではなく表示したいなら、互換性のために以下の マクロを使うべきです

        IVdf            IV in decimal
        UVuf            UV in decimal
        UVof            UV in octal
        UVxf            UV in hexadecimal
        NVef            NV %e-like
        NVff            NV %f-like
        NVgf            NV %g-like
        IVdf            IV を 10 進で
        UVuf            UV を 10 進で
        UVof            UV を 8 進で
        UVxf            UV を 16 進で
        NVef            NV を %e 風に
        NVff            NV を %f 風に
        NVgf            NV を %g 風に

These will take care of 64-bit integers and long doubles. For example:

これらは 64 ビット整数や long double も考慮します。 例えば:

        printf("IV is %"IVdf"\n", iv);

The IVdf will expand to whatever is the correct format for the IVs.

IVdf は、なんであれ IV のための正しいフォーマットに拡張されます。

Note that there are different "long doubles": Perl will use whatever the compiler has.

異なった種類の "long double" が存在することに注意してください: Perl はともかくコンパイラが持っているものを使います。

If you are printing addresses of pointers, use UVxf combined with PTR2UV(), do not use %lx or %p.

ポインタのアドレスを表示したいなら、PTR2UV() で UVxf を使ってください; %lx や %p は使わないでください。

ポインタから整数と整数からポインタ

Because pointer size does not necessarily equal integer size, use the follow macros to do it right.

ポインタサイズは整数のサイズと同じである必要はないので、正しく行うために 以下のマクロを使ってください。

        PTR2UV(pointer)
        PTR2IV(pointer)
        PTR2NV(pointer)
        INT2PTR(pointertotype, integer)

For example:

例えば:

        IV  iv = ...;
        SV *sv = INT2PTR(SV*, iv);

and

および

        AV *av = ...;
        UV  uv = PTR2UV(av);

例外処理

There are a couple of macros to do very basic exception handling in XS modules. You have to define NO_XSLOCKS before including XSUB.h to be able to use these macros:

XS モジュールでのとても基本的な例外処理を行うためのいくつかのマクロがあります。 これらのマクロを使えるようにするために XSUB.h をインクルードする前に NO_XSLOCKS を定義する必要があります:

        #define NO_XSLOCKS
        #include "XSUB.h"

You can use these macros if you call code that may croak, but you need to do some cleanup before giving control back to Perl. For example:

croak するかもしれないコードを呼び出すときにこれらのマクロが使えますが、 Perl に制御を戻す前に一部掃除掃除をする必要があります。 例えば:

        dXCPT;    /* set up necessary variables */

        XCPT_TRY_START {
          code_that_may_croak();
        } XCPT_TRY_END

        XCPT_CATCH
        {
          /* do cleanup here */
          XCPT_RETHROW;
        }

Note that you always have to rethrow an exception that has been caught. Using these macros, it is not possible to just catch the exception and ignore it. If you have to ignore the exception, you have to use the call_* function.

捕捉した例外を常に再スローする必要があることに注意してください。 これらのマクロを使って、単に例外を捕捉して無視することはできません。 例外を無視する必要があるなら、call_* 関数を使う必要があります。

The advantage of using the above macros is that you don't have to setup an extra function for call_*, and that using these macros is faster than using call_*.

上述のマクロを使う利点は、call_* のための追加の関数を設定する 必要がないことと、これらのマクロを使うと call_* を使うよりも 高速であることです。

ソース文書

There's an effort going on to document the internal functions and automatically produce reference manuals from them -- perlapi is one such manual which details all the functions which are available to XS writers. perlintern is the autogenerated manual for the functions which are not part of the API and are supposedly for internal use only.

内部関数の文書を書いて、そこからリファレンスマニュアルを自動的に 生成しようという作業が行われています -- perlapi はその一つで、XS 作者が 利用可能な全ての関数の詳細に関するマニュアルです。 perlintern は、API の一部ではなく、内部使用専用と想定されている関数の 自動生成マニュアルです。

Source documentation is created by putting POD comments into the C source, like this:

ソース文書は、以下のように、C ソースに POD コメントを書くことで作成されます:

 /*
 =for apidoc sv_setiv

 Copies an integer into the given SV.  Does not handle 'set' magic.  See
 C<sv_setiv_mg>.

 =cut
 */

Please try and supply some documentation if you add functions to the Perl core.

Perl コアに関数を追加するなら、文書を書いて提供するようにしてください。

後方互換性

The Perl API changes over time. New functions are added or the interfaces of existing functions are changed. The Devel::PPPort module tries to provide compatibility code for some of these changes, so XS writers don't have to code it themselves when supporting multiple versions of Perl.

Perl API は時が経つにつれて変わります。 新しい関数が追加されたり、既にある関数のインターフェースが変更されたりします。 Devel::PPPort モジュールはこれらの変更の一部に関して互換コードを 提供しようとするので、XS 作者は複数バージョンの Perl に対応するときに そのためのコードを自分自身で作る必要はありません。

Devel::PPPort generates a C header file ppport.h that can also be run as a Perl script. To generate ppport.h, run:

Devel::PPPort は、Perl スクリプトとしても実行される C ヘッダファイル ppport.h を生成します。 ppport.h を生成するには、以下のものを実行します:

    perl -MDevel::PPPort -eDevel::PPPort::WriteFile

Besides checking existing XS code, the script can also be used to retrieve compatibility information for various API calls using the --api-info command line switch. For example:

既にある XS コードをチェックするほかに、このスクリプトは、--api-info コマンドラインオプションを使うことで、様々な API 呼び出しの互換性情報を 取得するのにも使えます。 例えば:

  % perl ppport.h --api-info=sv_magicext

For details, see perldoc ppport.h.

詳細については、perldoc ppport.h を参照してください。

Unicode 対応

Perl 5.6.0 introduced Unicode support. It's important for porters and XS writers to understand this support and make sure that the code they write does not corrupt Unicode data.

Perl 5.6.0 から Unicode 対応が導入されました。 porters と XS 作者にとって、この対応を理解して、書いたコードが Unicode データを壊さないようにすることは重要です。

What is Unicode, anyway?

(ところで、Unicode って ?)

In the olden, less enlightened times, we all used to use ASCII. Most of us did, anyway. The big problem with ASCII is that it's American. Well, no, that's not actually the problem; the problem is that it's not particularly useful for people who don't use the Roman alphabet. What used to happen was that particular languages would stick their own alphabet in the upper range of the sequence, between 128 and 255. Of course, we then ended up with plenty of variants that weren't quite ASCII, and the whole point of it being a standard was lost.

古く、あまり啓蒙されていなかった時代、私たち全ては ASCII を使っていました。 とりあえず、私たちのほとんどはそうでした。 ASCII の大きな問題は、これは英語だったことです。 えっと、これは本当の問題ではありません; 問題は、英文字を使わない 人々にとっては特に有用ではないということです。 起こったことは、ある種の言語は独自のアルファベットを並びの上半分、 128 から 255 にくっつけるということでした。 もちろん、結局完全に ASCII ではないものの変種だらけになり、標準となるものは 失われました。

Worse still, if you've got a language like Chinese or Japanese that has hundreds or thousands of characters, then you really can't fit them into a mere 256, so they had to forget about ASCII altogether, and build their own systems using pairs of numbers to refer to one character.

さらに悪いことに、数百または数千の文字がある中国語や日本語のような言語を 使うとき、これらを単に 256 に納めるのは不可能なので、ASCII を完全に 忘れてしまって、一つの文字を参照するのに二つの数の組み合わせを使う 独自のシステムを構築しました。

To fix this, some people formed Unicode, Inc. and produced a new character set containing all the characters you can possibly think of and more. There are several ways of representing these characters, and the one Perl uses is called UTF-8. UTF-8 uses a variable number of bytes to represent a character. You can learn more about Unicode and Perl's Unicode model in perlunicode.

これを修正するために、一部の人々は Unicode, Inc. を作り、考えられる全ての 文字以上のものを含む新しい文字集合を作成しました。 これらの文字を表現するにはいくつかの方法があり、Perl が使うものは UTF-8 と呼ばれます。 UTF-8 は 1 文字を表現するのに可変の数のバイトを使います。 Unicode と Perl の Unicode モデルについては、perlunicode で学べます。

(On EBCDIC platforms, Perl uses instead UTF-EBCDIC, which is a form of UTF-8 adapted for EBCDIC platforms. Below, we just talk about UTF-8. UTF-EBCDIC is like UTF-8, but the details are different. The macros hide the differences from you, just remember that the particular numbers and bit patterns presented below will differ in UTF-EBCDIC.)

(On EBCDIC platforms, Perl uses instead UTF-EBCDIC, which is a form of UTF-8 adapted for EBCDIC platforms. Below, we just talk about UTF-8. UTF-EBCDIC is like UTF-8, but the details are different. The macros hide the differences from you, just remember that the particular numbers and bit patterns presented below will differ in UTF-EBCDIC.) (TBT)

UTF-8 文字列を認識するには?

You can't. This is because UTF-8 data is stored in bytes just like non-UTF-8 data. The Unicode character 200, (0xC8 for you hex types) capital E with a grave accent, is represented by the two bytes v196.172. Unfortunately, the non-Unicode string chr(196).chr(172) has that byte sequence as well. So you can't tell just by looking -- this is what makes Unicode input an interesting problem.

出来ません。 これは、UTF-8 データは非 UTF-8 データと同じようにバイトとして 保管されるからです。 Unicode 文字 200 (16 進数で書くなら 0xC8) である、 大文字 E(重アクセント記号付) は 2 バイト v196.172 で表現されます。 残念ながら、非 Unicode 文字列 chr(196).chr(172) も同じバイト並びを持ちます。 従って、見ただけで判断することは出来ません -- これが Unicode 入力を 興味深い問題にしているものです。

In general, you either have to know what you're dealing with, or you have to guess. The API function is_utf8_string can help; it'll tell you if a string contains only valid UTF-8 characters, and the chances of a non-UTF-8 string looking like valid UTF-8 become very small very quickly with increasing string length. On a character-by-character basis, isUTF8_CHAR will tell you whether the current character in a string is valid UTF-8.

一般的に、どうやって扱うかを知るか、推測するかのどちらかが必要です。 API 関数 is_utf8_string が助けになります; これは、文字列が有効な UTF-8 文字列のみを含んでいるかを返します; そして、非 UTF-8 文字列が正当な UTF-8 文字列に見える可能性は、 文字列が長くなるにつれて非常に急速に非常に小さくなります。 文字単位では、isUTF8_CHAR は文字列中の現在の文字が有効な UTF-8 かどうかを返します。

どうやって UTF-8 は Unicode 文字を表現するの?

As mentioned above, UTF-8 uses a variable number of bytes to store a character. Characters with values 0...127 are stored in one byte, just like good ol' ASCII. Character 128 is stored as v194.128; this continues up to character 191, which is v194.191. Now we've run out of bits (191 is binary 10111111) so we move on; character 192 is v195.128. And so it goes on, moving to three bytes at character 2048. "Unicode Encodings" in perlunicode has pictures of how this works.

上述したように、UTF-8 は文字を格納するのに可変の数のバイトを使います。 値 0...127 の文字はちょうど ASCII と同じように 1 バイトで保管されます。 文字 128 は v194.128 として保管されます; これは 文字 191 v194.191 まで 続きます。 ここでビットがなくなるので (191 は 2 進数では 10111111)、次に進みます; 192 は v195.128 です。 このように進んでいき、文字 2048 では 3 バイトになります。 "Unicode Encodings" in perlunicode はこれがどのように動作するかを描いています。

Assuming you know you're dealing with a UTF-8 string, you can find out how long the first character in it is with the UTF8SKIP macro:

UTF-8 文字列の扱い方を知っていると仮定すると、最初の文字の長さは UTF8SKIP マクロで知ることができます:

    char *utf = "\305\233\340\240\201";
    I32 len;

    len = UTF8SKIP(utf); /* len is 2 here */
    utf += len;
    len = UTF8SKIP(utf); /* len is 3 here */

Another way to skip over characters in a UTF-8 string is to use utf8_hop, which takes a string and a number of characters to skip over. You're on your own about bounds checking, though, so don't use it lightly.

UTF-8 文字列で文字をスキップするもう一つの方法は、utf8_hop を使うことで、 これは文字列とスキップする文字数を取ります。 しかし、独自でも境界チェックは出来るので、これを軽率に使わないでください。

All bytes in a multi-byte UTF-8 character will have the high bit set, so you can test if you need to do something special with this character like this (the UTF8_IS_INVARIANT() is a macro that tests whether the byte is encoded as a single byte even in UTF-8):

マルチバイト UTF-8 文字の全てのバイトは最上位ビットが設定されているので、 このようにこの文字に何か特別のことをする必要がある場合は、これで テストできます(UTF8_IS_INVARIANT() は、たとえ UTF-8 であったとしても 単一のバイトでエンコードされているかどうかをテストします):

    U8 *utf;
    U8 *utf_end; /* 1 beyond buffer pointed to by utf */
    UV uv;      /* Note: a UV, not a U8, not a char */
    STRLEN len; /* length of character in bytes */

    if (!UTF8_IS_INVARIANT(*utf))
        /* Must treat this as UTF-8 */
        uv = utf8_to_uvchr_buf(utf, utf_end, &len);
    else
        /* OK to treat this character as a byte */
        uv = *utf;

You can also see in that example that we use utf8_to_uvchr_buf to get the value of the character; the inverse function uvchr_to_utf8 is available for putting a UV into UTF-8:

この例では、文字の値を得るために utf8_to_uvchr_buf を使うところも見られます; 逆関数 uvchr_to_utf8 は、UV を UTF-8 にするのに使えます:

    if (!UVCHR_IS_INVARIANT(uv))
        /* Must treat this as UTF8 */
        utf8 = uvchr_to_utf8(utf8, uv);
    else
        /* OK to treat this character as a byte */
        *utf8++ = uv;

You must convert characters to UVs using the above functions if you're ever in a situation where you have to match UTF-8 and non-UTF-8 characters. You may not skip over UTF-8 characters in this case. If you do this, you'll lose the ability to match hi-bit non-UTF-8 characters; for instance, if your UTF-8 string contains v196.172, and you skip that character, you can never match a chr(200) in a non-UTF-8 string. So don't do that!

UTF-8 文字列と非 UTF-8 文字列のマッチングをする必要がある場合は、上述の 関数を使って UV に変換 しなければなりません 。 このような場合では UTF-8 文字列を読み飛ばすことはできません。 これをすると、最上位ビットの立った非 UTF-8 文字をマッチングする能力を 失います; 例えば、UTF-8 文字列に v196.172 が含まれていて、この文字を スキップすると、非 UTF-8 文字列の chr(200) にマッチングできません。 従って、そうしないでください!

(Note that we don't have to test for invariant characters in the examples above. The functions work on any well-formed UTF-8 input. It's just that its faster to avoid the function overhead when it's not needed.)

(Note that we don't have to test for invariant characters in the examples above. The functions work on any well-formed UTF-8 input. It's just that its faster to avoid the function overhead when it's not needed.) (TBT)

どうやって Perl は UTF-8 文字列を保管するの?

Currently, Perl deals with UTF-8 strings and non-UTF-8 strings slightly differently. A flag in the SV, SVf_UTF8, indicates that the string is internally encoded as UTF-8. Without it, the byte value is the codepoint number and vice versa. This flag is only meaningful if the SV is SvPOK or immediately after stringification via SvPV or a similar macro. You can check and manipulate this flag with the following macros:

現在のところ、Perl は UTF-8 文字列と非 UTF-8 文字列を少し違う形で扱います。 SV のフラグ SVf_UTF8 は、文字列が内部で UTF-8 で エンコードされていることを示します。 これがない場合は、バイトの値が符号位置で、逆も成り立ちます。 このフラグは、 SV が SvPOK であるか、SvPV や同様のマクロによる文字列化の直後でのみ 意味があります。 以下のマクロでこのフラグのチェックと操作ができます:

    SvUTF8(sv)
    SvUTF8_on(sv)
    SvUTF8_off(sv)

This flag has an important effect on Perl's treatment of the string: if UTF-8 data is not properly distinguished, regular expressions, length, substr and other string handling operations will have undesirable (wrong) results.

このフラグは、Perl の文字列の扱いに重要な効果があります: UTF-8 データが 適切に識別されないと、正規表現、lengthsubstr およびその他の 文字列操作演算子が想定外の(誤った)結果となります。

The problem comes when you have, for instance, a string that isn't flagged as UTF-8, and contains a byte sequence that could be UTF-8 -- especially when combining non-UTF-8 and UTF-8 strings.

問題は、例えば、UTF-8 としてフラグが経っていない文字列と、UTF-8 になり得る バイト並びがある時に起こります -- 特に非 UTF-8 文字列と UTF-8 文字列を 結合するときに起こります。

Never forget that the SVf_UTF8 flag is separate from the PV value; you need to be sure you don't accidentally knock it off while you're manipulating SVs. More specifically, you cannot expect to do this:

SVf_UTF8 フラグは PV の値とは分かれていることを決して忘れないでください; SV の捜査中に間違ってオフにしないように注意する必要があります。 より具体的には、以下のようにすることは想定できません:

    SV *sv;
    SV *nsv;
    STRLEN len;
    char *p;

    p = SvPV(sv, len);
    frobnicate(p);
    nsv = newSVpvn(p, len);

The char* string does not tell you the whole story, and you can't copy or reconstruct an SV just by copying the string value. Check if the old SV has the UTF8 flag set (after the SvPV call), and act accordingly:

char* 文字列は一部始終を示しはせず、単に文字列の値をコピーするだけでは SV のコピーや再構成は出来ません。 (SvPV 呼び出しの 後に) 古い SV の UTF8 フラグがセットされているかどうかを 調べて、それに従って行動します:

    p = SvPV(sv, len);
    is_utf8 = SvUTF8(sv);
    frobnicate(p, is_utf8);
    nsv = newSVpvn(p, len);
    if (is_utf8)
        SvUTF8_on(nsv);

In the above, your frobnicate function has been changed to be made aware of whether or not it's dealing with UTF-8 data, so that it can handle the string appropriately.

このような場合、frobnicate 関数は、文字列を適切に扱えるようにするために、 UTF-8 データを扱えるかどうかが分かるように変更します。

Since just passing an SV to an XS function and copying the data of the SV is not enough to copy the UTF8 flags, even less right is just passing a char * to an XS function.

単に XS 関数に SV を渡して、SV のデータをコピーするだけでは、 UTF8 フラグをコピーするのは不十分です; 正しいのが char * を XS 関数に 渡すことでもです。

For full generality, use the "DO_UTF8" in perlapi macro to see if the string in an SV is to be treated as UTF-8. This takes into account if the call to the XS function is being made from within the scope of use bytes. If so, the underlying bytes that comprise the UTF-8 string are to be exposed, rather than the character they represent. But this pragma should only really be used for debugging and perhaps low-level testing at the byte level. Hence most XS code need not concern itself with this, but various areas of the perl core do need to support it.

For full generality, use the "DO_UTF8" in perlapi macro to see if the string in an SV is to be treated as UTF-8. This takes into account if the call to the XS function is being made from within the scope of use bytes. If so, the underlying bytes that comprise the UTF-8 string are to be exposed, rather than the character they represent. But this pragma should only really be used for debugging and perhaps low-level testing at the byte level. Hence most XS code need not concern itself with this, but various areas of the perl core do need to support it. (TBT)

And this isn't the whole story. Starting in Perl v5.12, strings that aren't encoded in UTF-8 may also be treated as Unicode under various conditions (see "ASCII Rules versus Unicode Rules" in perlunicode). This is only really a problem for characters whose ordinals are between 128 and 255, and their behavior varies under ASCII versus Unicode rules in ways that your code cares about (see "The "Unicode Bug"" in perlunicode). There is no published API for dealing with this, as it is subject to change, but you can look at the code for pp_lc in pp.c for an example as to how it's currently done.

And this isn't the whole story. Starting in Perl v5.12, strings that aren't encoded in UTF-8 may also be treated as Unicode under various conditions (see "ASCII Rules versus Unicode Rules" in perlunicode). This is only really a problem for characters whose ordinals are between 128 and 255, and their behavior varies under ASCII versus Unicode rules in ways that your code cares about (see "The "Unicode Bug"" in perlunicode). There is no published API for dealing with this, as it is subject to change, but you can look at the code for pp_lc in pp.c for an example as to how it's currently done. (TBT)

どうやって文字列を UTF-8 に変換するの?

If you're mixing UTF-8 and non-UTF-8 strings, it is necessary to upgrade the non-UTF-8 strings to UTF-8. If you've got an SV, the easiest way to do this is:

UTF-8 と non-UTF-8 の文字列を混ぜるなら、非 UTF-8 文字列を UTF-8 に 昇格させる必要があります。 SV を使っているなら、これをするのに最も簡単な方法は:

    sv_utf8_upgrade(sv);

However, you must not do this, for example:

しかし、例えば以下のようにしてはいけません:

    if (!SvUTF8(left))
        sv_utf8_upgrade(left);

If you do this in a binary operator, you will actually change one of the strings that came into the operator, and, while it shouldn't be noticeable by the end user, it can cause problems in deficient code.

これを二項演算子で行うなら、演算子から来る文字列の一つを実際に変更し、 エンドユーザーは気がつくべきではない一方、不完全なコードによる 問題を引き起こすかもしれません。

Instead, bytes_to_utf8 will give you a UTF-8-encoded copy of its string argument. This is useful for having the data available for comparisons and so on, without harming the original SV. There's also utf8_to_bytes to go the other way, but naturally, this will fail if the string contains any characters above 255 that can't be represented in a single byte.

代わりに、bytes_to_utf8 は、文字列引数を UTF-8 でエンコードした コピー を作ります。 これは、元の SV に影響を与えることなく、比較などに使えるデータを作るのに 有用です。 また、逆方向を自然に行う utf8_to_bytes もあります; これは文字列に 単一バイトで表現できない、番号 255 を超える文字が含まれていると失敗します。

文字列を比較するには?

"sv_cmp" in perlapi and "sv_cmp_flags" in perlapi do a lexigraphic comparison of two SV's, and handle UTF-8ness properly. Note, however, that Unicode specifies a much fancier mechanism for collation, available via the Unicode::Collate module.

"sv_cmp" in perlapi and "sv_cmp_flags" in perlapi do a lexigraphic comparison of two SV's, and handle UTF-8ness properly. Note, however, that Unicode specifies a much fancier mechanism for collation, available via the Unicode::Collate module. (TBT)

To just compare two strings for equality/non-equality, you can just use memEQ() and memNE() as usual, except the strings must be both UTF-8 or not UTF-8 encoded.

単に二つの文字列の等価性/非等価性を比較するには、 単にいつも通り memEQ()memNE() を 使ってください; 但し文字列は両方とも UTF-8 か両方とも非 UTF-8 でなければ なりません。

To compare two strings case-insensitively, use foldEQ_utf8() (the strings don't have to have the same UTF-8ness).

大文字小文字を無視して二つの文字列を比較するには、 foldEQ_utf8() を使ってください (文字列は同じ UTF-8 性を持っている必要はありません)。

他に知っておくべきことは?

Not really. Just remember these things:

実際にはありません。 単に以下のことを覚えておいてください:

  • There's no way to tell if a char * or U8 * string is UTF-8 or not. But you can tell if an SV is to be treated as UTF-8 by calling DO_UTF8 on it, after stringifying it with SvPV or a similar macro. And, you can tell if SV is actually UTF-8 (even if it is not to be treated as such) by looking at its SvUTF8 flag (again after stringifying it). Don't forget to set the flag if something should be UTF-8. Treat the flag as part of the PV, even though it's not -- if you pass on the PV to somewhere, pass on the flag too.

    char * または U8 * の文字列が UTF-8 かどうかを 知らせる方法はありません。 しかし、SV が UTF-8 として扱われるべきかどうかは、SvPV または 同様のマクロで文字列化した後に DO_UTF8 を呼び出すことで分かります。 そして、SV が (たとえそう扱われていなくても) 実際に UTF-8 かどうかは、 (やはりそれを文字列化した後に) SvUTF8 フラグを見ることで分かります。 何かが UTF-8 であるべきならフラグを設定することを忘れないでください。 たとえそうでなくても、このフラグを PV の一部として扱ってください -- PV を どこかに渡すときは、このフラグも渡してください。

  • If a string is UTF-8, always use utf8_to_uvchr_buf to get at the value, unless UTF8_IS_INVARIANT(*s) in which case you can use *s.

    文字列が UTF-8 なら、値を得るときは 常に utf8_to_uvchr_buf を 使ってください; 但し、UTF8_IS_INVARIANT(*s) の場合は *s を使えます。

  • When writing a character UV to a UTF-8 string, always use uvchr_to_utf8, unless UVCHR_IS_INVARIANT(uv)) in which case you can use *s = uv.

    文字 UV を UTF-8 文字列を書き込むときは 常に uvchr_to_utf8 を 使ってください; 但し、UVCHR_IS_INVARIANT(uv)) の場合は *s = uv を 使えます。

  • Mixing UTF-8 and non-UTF-8 strings is tricky. Use bytes_to_utf8 to get a new string which is UTF-8 encoded, and then combine them.

    UTF-8 と 非 UTF-8 の文字列を混ぜるのはトリッキーです。 UTF-8 エンコードされた新しい文字列を得るには bytes_to_utf8 を 使ってから、結合してください。

カスタム演算子

Custom operator support is an experimental feature that allows you to define your own ops. This is primarily to allow the building of interpreters for other languages in the Perl core, but it also allows optimizations through the creation of "macro-ops" (ops which perform the functions of multiple ops which are usually executed together, such as gvsv, gvsv, add.)

カスタム演算子対応は独自の op を定義できる新しい実験的機能です。 これは主に Perl コアに他の言語のためのインタプリタを 構築できるようにするためのものですが、「マクロ op」 (gvsv, gvsv, add のように、普段一緒に実行される複数の op の関数を 実行する op) を作成することで最適化できるようにもします。

This feature is implemented as a new op type, OP_CUSTOM. The Perl core does not "know" anything special about this op type, and so it will not be involved in any optimizations. This also means that you can define your custom ops to be any op structure -- unary, binary, list and so on -- you like.

この機能は 新しい op 型である OP_CUSTOM として実装されています。 Perl コアはこの op 型について何も特別なことは「知りません」し、 どのような最適化も行いません。 これはまた、どのような op 構造 -- 単項、二項、リストなど -- でも 好きなものになれるカスタム op を定義できるということです。

It's important to know what custom operators won't do for you. They won't let you add new syntax to Perl, directly. They won't even let you add new keywords, directly. In fact, they won't change the way Perl compiles a program at all. You have to do those changes yourself, after Perl has compiled the program. You do this either by manipulating the op tree using a CHECK block and the B::Generate module, or by adding a custom peephole optimizer with the optimize module.

カスタム演算子がしないことを知ることは重要です。 これは Perl に直接新しい文法を追加するものではありません。 これは直接新しいキーワードを追加するものではありません。 実際のところ、Perl がプログラムする方法を何も変えません。 これらの変更は、Perl がプログラムをコンパイルした後、自分でする必要があります。 これは、CHECK ブロックと B::Generate モジュールを使って op 木を 操作するか、optimize モジュールでカスタム覗き穴最適化器を追加することで 行います。

When you do this, you replace ordinary Perl ops with custom ops by creating ops with the type OP_CUSTOM and the op_ppaddr of your own PP function. This should be defined in XS code, and should look like the PP ops in pp_*.c. You are responsible for ensuring that your op takes the appropriate number of values from the stack, and you are responsible for adding stack marks if necessary.

これを行うとき、OP_CUSTOM 型と独自の PP 関数の op_ppaddr を持つ カスタム op を作成して、普通の Perl op を置き換えます。 これは XS コードで定義されるべきで、pp_*.c の PP op のように 見えるべきです。 作成した op がスタックから適切な数の値を取ることと、必要ならスタックに マークを追加することは作成者が責任を持ちます。

You should also "register" your op with the Perl interpreter so that it can produce sensible error and warning messages. Since it is possible to have multiple custom ops within the one "logical" op type OP_CUSTOM, Perl uses the value of o->op_ppaddr to determine which custom op it is dealing with. You should create an XOP structure for each ppaddr you use, set the properties of the custom op with XopENTRY_set, and register the structure against the ppaddr using Perl_custom_op_register. A trivial example might look like:

また、Perl インタプリタに作成した op を「登録」して、適切なエラーと 警告メッセージを生成できるようにします。 一つの「論理」op 型 OP_CUSTOM に複数のカスタム op を 含めることができるので、Perl はどのカスタム op を扱うかを決定するのに o->op_ppaddr の値を使います。 Perl は、どのカスタム op を扱うのかを決定するために o->op_ppaddr を 使います。 使用する ppaddr 毎に XOP 構造体を作成し、カスタム op のプロパティに XopENTRY_set を設定し、Perl_custom_op_register を使って構造体の ppaddr を 登録するべきです。 典型的な例は次のようなものです:

    static XOP my_xop;
    static OP *my_pp(pTHX);

    BOOT:
        XopENTRY_set(&my_xop, xop_name, "myxop");
        XopENTRY_set(&my_xop, xop_desc, "Useless custom op");
        Perl_custom_op_register(aTHX_ my_pp, &my_xop);

The available fields in the structure are:

この構造体で利用可能なフィールドは:

xop_name

A short name for your op. This will be included in some error messages, and will also be returned as $op->name by the B module, so it will appear in the output of module like B::Concise.

op のための短い名前です。 これは一部のエラーメッセージに含まれ、また B モジュールによって $op->name として返されるので、B::Concise のような モジュールの出力として現れます。

xop_desc

A short description of the function of the op.

この op の関数の短い説明。0l

xop_class

Which of the various *OP structures this op uses. This should be one of the OA_* constants from op.h, namely

この op が様々な *OP 構造体のどれを使うか。 これは op.hOA_* 定数のいずれかです; つまり

OA_BASEOP
OA_UNOP
OA_BINOP
OA_LOGOP
OA_LISTOP
OA_PMOP
OA_SVOP
OA_PADOP
OA_PVOP_OR_SVOP

This should be interpreted as 'PVOP' only. The _OR_SVOP is because the only core PVOP, OP_TRANS, can sometimes be a SVOP instead.

これは 'PVOP' のみとして解釈されるべきです。 なぜなら _OR_SVOP はコアの PVOP のみで、OP_TRANS は時々代わりに SVOP になります。

OA_LOOP
OA_COP

The other OA_* constants should not be used.

その他の OA_* 定数は使われるべきではありません。

xop_peep

This member is of type Perl_cpeep_t, which expands to void (*Perl_cpeep_t)(aTHX_ OP *o, OP *oldop). If it is set, this function will be called from Perl_rpeep when ops of this type are encountered by the peephole optimizer. o is the OP that needs optimizing; oldop is the previous OP optimized, whose op_next points to o.

このメンバは Perl_cpeep_t 型で、 void (*Perl_cpeep_t)(aTHX_ OP *o, OP *oldop) に展開されます。 これが設定されていると、この型の op が覗き穴最適化器に遭遇したときに この関数が Perl_rpeep から呼び出されます。 o は最適化が必要な OP です; oldop は最適化された以前の OP で、これの op_nexto を指しています。

B::Generate directly supports the creation of custom ops by name.

B::Generate では名前によるカスタム op の作成に直接対応しています。

作者

Until May 1997, this document was maintained by Jeff Okamoto <okamoto@corp.hp.com>. It is now maintained as part of Perl itself by the Perl 5 Porters <perl5-porters@perl.org>.

1997 年 5 月まで、この文書は Jeff Okamoto <okamoto@corp.hp.com> によって保守されていました。 今では Perl 自身の一部として Perl 5 Porters <perl5-porters@perl.org> によって保守されています。

With lots of help and suggestions from Dean Roehrich, Malcolm Beattie, Andreas Koenig, Paul Hudson, Ilya Zakharevich, Paul Marquess, Neil Bowers, Matthew Green, Tim Bunce, Spider Boardman, Ulrich Pfeifer, Stephen McCamant, and Gurusamy Sarathy.

Dean Roehrich, Malcolm Beattie, Andreas Koenig, Paul Hudson, Ilya Zakharevich, Paul Marquess, Neil Bowers, Matthew Green, Tim Bunce, Spider Boardman, Ulrich Pfeifer, Stephen McCamant, Gurusamy Sarathy から多くの助けと示唆を受けました。

SEE ALSO

perlapi, perlintern, perlxs, perlembed