• ベストアンサー

XSUB.h、EXTERN.h、perl.h について

◆状況 C言語+Perlで作られている機能を、 Perlだけのソースに移行しようとしています。 ◆困っていること 今まで、知らない言語を読む際、 ネットや本にある、関数一覧などから、 「そのプログラムで何をしようとしているか?」 を読み取れていたのですが、 C言語+Perlにおける、下記の関数??と思われるものなどについて、 全然、資料/情報が見つからず、困っています。 具体的には、 dXSARGS Perl_croak SvPV_nolen XPUSHs PUTBACK などです。 (恐らくは、EXTERN.h、perl.h、XSUB.h というヘッダファイルに定義されているのかも知れませんが。) stdio.h などにあるような、fopen関数だったり、fscanf関数などのようなものは、 いくらでもネット上/本に載っているのですが、上述のものについて、全然見つかりません、、 /***********************************/ また、includeファイルに、定数、構造体の定義、関数のプロトタイプ、マクロの定義、が記述されると認識していますが、 しかしながら、 ソース上に出てくる「Perl_croak」という箇所は、おそらく、Perl_croakという関数のように思われました。 と、すると、 includeファイルに、引数&戻り値などのインターフェース仕様だけ書かれているのではなく、 Perl_croak関数が行う、「処理の実態」も、ヘッダファイルに記述されているということでしょうか?? また、 dXSARGS という箇所については、戻り値を受け入れるような記述もなく、 dXSARGS; と一行書かれているだけなのですが、関数ではなく、戻り値を必要としないサブルーチンということでしょうか? /***********************************/ どなたか、資料/情報や、もしくは調べ方などをご存知の方がいらっしゃれば、 ご教授お願いできませんでしょうか? 些細な情報でも構いませんので、宜しくお願い致します。。

質問者が選んだベストアンサー

  • ベストアンサー
  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.1

perlの拡張モジュールをC言語で作成する場合に、 上記のEXTERN.h、perl.h、XSUB.hなどが必要になります。 私がC言語でperlの拡張モジュールを作ったのは、しばらく前のことなので、ずいぶん忘れており、的確な回答ができず、申し訳ないのですが、参照URLのみ、添付しておきます。 perl日本語マニュアル http://www.harukaze.net/~mishima/perl/man/ perlapi.1 Perl 5 の C 拡張のアプリケーションプログラミングインタフェース http://www.harukaze.net/~mishima/perl/man/perlapi.1.html perlguts.1 Perl の内部関数 http://www.harukaze.net/~mishima/perl/man/perlguts.1.html http://perldoc.jp/docs/perl/5.8.8/ http://perldoc.jp/docs/perl/5.8.8/perlxs.pod http://perldoc.jp/docs/perl/5.8.8/perlxstut.pod http://argrath.ub32.org/perldocjp/5.10.0/ http://argrath.ub32.org/perldocjp/5.10.0/perlxs.html http://argrath.ub32.org/perldocjp/5.10.0/perlxstut.html

souken_200
質問者

お礼

Perl内部関数に関する記述、非常に参考になりました。 (※下記の部分など。) データ型として、Perl では、主となる 3 つのデータ型を扱うために 3 つのtypedefを行なっていること。 SV スカラ値 AV 配列値 HV ハッシュ値 SVというのは、スカラ値での引数などのやりとりだったのだとわかり、 助かりました。 /***************************************/ SVの操作について おそらく、引数としてスタックに乗っている、SVに対して、 SV* newSViv(IV); 整数 SV* newSVnv(double); 倍精度 SV* newSVpv(char*, int); 文字列 SV* newSVsv(SV*); その他のスカラー で取得し、リターン値として、下記でスタックに乗せる。 XPUSHi(IV) 整数 XPUSHn(double) 倍精度 XPUSHp(char*, I32) 文字列 XPUSHs(SV*) その他のスカラー のだろうとわかりました。 (わかったつもりなだけかもしれませんが。。) ありがとうございまいした!

すると、全ての回答が全文表示されます。

その他の回答 (1)

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.2

質問者さんがあげられている dXSARGS Perl_croak SvPV_nolen XPUSHs PUTBACK ですが、perlapi.pod というドキュメントに当たれば簡単な解説がみつかります。 Perl_croakだけはcroakで探さないと見つかりませんが。 =item dXSARGS X<dXSARGS> Sets up stack and mark pointers for an XSUB, calling dSP and dMARK. Sets up the C<ax> and C<items> variables by calling C<dAX> and C<dITEMS>. This is usually handled automatically by C<xsubpp>. dXSARGS; =for hackers Found in file XSUB.h =item croak X<croak> This is the XSUB-writer's interface to Perl's C<die> function. Normally call this function the same way you call the C C<printf> function. Calling C<croak> returns control directly to Perl, sidestepping the normal C order of execution. See C<warn>. If you want to throw an exception object, assign the object to C<$@> and then pass C<NULL> to croak(): errsv = get_sv("@", TRUE); sv_setsv(errsv, exception_object); croak(NULL); void croak(const char* pat, ...) =for hackers Found in file util.c =item SvPV_nolen X<SvPV_nolen> Returns a pointer to the string in the SV, or a stringified form of the SV if the SV does not contain a string. The SV may cache the stringified form becoming C<SvPOK>. Handles 'get' magic. char* SvPV_nolen(SV* sv) =for hackers Found in file mathoms.c =item XPUSHs X<XPUSHs> Push an SV onto the stack, extending the stack if necessary. Does not handle 'set' magic. Does not use C<TARG>. See also C<XPUSHmortal>, C<PUSHs> and C<PUSHmortal>. void XPUSHs(SV* sv) =for hackers Found in file pp.h =item PUTBACK X<PUTBACK> Closing bracket for XSUB arguments. This is usually handled by C<xsubpp>. See C<PUSHMARK> and L<perlcall> for other uses. PUTBACK; =for hackers Found in file pp.h なんのためにPerlで書き直そうとされてるのかわかりませんが、 仮にやるのであれば実装の詳細を調べて逐一置き換えるようなことではなく 引数と戻り値や処理の仕様から書き直すべきなんじゃないでしょうか。 この辺のマクロ類はPerlとCで書かれた拡張との引数のやり取りだとか 警告の出力のためのものですから、Pure Perlで書き直すために 必要なこととは思えないのですが。

souken_200
質問者

お礼

ありがとうございます! 和訳して、下記のような概略はわかったのですが、 dXSARGS ⇒ スタックに乗せる。 SvPV_nolen ⇒ SVの文字列にポインターを返す。 XPUSHs ⇒ スタック上にSVを乗せる。 PUTBACK ⇒ XSUBの終了を示す。 現状、 SVとは何なのか? なぜスタックへのPUT/GETが必要になるのか? など、理解ができていない段階です。 > この辺のマクロ類はPerlとCで書かれた拡張との > 引数のやり取りだとか警告の出力のためのものですから、 > Pure Perlで書き直すために必要なこととは思えないのですが。 リバースエンジニアリングをする上で、 全く前提知識がなく、ソースの1行1行を解析していたので 引数のやり取りだとか警告の出力のためのものだということ知らずに調べていました。 sakusaker7さんのご教授により、 引数のやり取りだとか警告の出力のためのものだとわかったので、 SVとは何なのか? なぜスタックへのPUT/GETが必要になるのか? をもう一度調べてみました。 が、わからなかったので、無視しようと思います。 ありがとうございまいた!

souken_200
質問者

補足

なお、現状でわかっているのは、 (わかったつもりになっているのは) (1)呼び出し元側と、呼び出される側との間で、 (2)INPUT、OUTPUTの仕様として、 (3)スタックに値を乗せて、インターフェースしている。 というイメージです。 イメージ dXSARGS ⇒ CのPG上で、Perlから与えられた引数をスタックに乗せる。 SvPV_nolen ⇒ スタックに乗っている引数を、添え字指定で、取得。 ↓ (※取得した値を色々加工して、返却する値を作成する。) ↓ XPUSHs ⇒ スタック上にSVを乗せる。 (※現状、推測になるが、おそらくsv_2mortalという機能で、newSVivという格納変数と思わしき機能の値を、スタックに乗せている。) ↓ PUTBACK ⇒ XSUBの終了。 です。

すると、全ての回答が全文表示されます。

関連するQ&A