餃子を食べるとき、何をつけますか?

◆状況
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;
と一行書かれているだけなのですが、関数ではなく、戻り値を必要としないサブルーチンということでしょうか?

/***********************************/

どなたか、資料/情報や、もしくは調べ方などをご存知の方がいらっしゃれば、
ご教授お願いできませんでしょうか?
些細な情報でも構いませんので、宜しくお願い致します。。

A 回答 (2件)

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/perlap …
perlguts.1 Perl の内部関数
http://www.harukaze.net/~mishima/perl/man/perlgu …

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. …
http://argrath.ub32.org/perldocjp/5.10.0/perlxst …
    • good
    • 0
この回答へのお礼

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*) その他のスカラー

のだろうとわかりました。
(わかったつもりなだけかもしれませんが。。)

ありがとうございまいした!

お礼日時:2009/05/07 13:45

質問者さんがあげられている



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);

voidcroak(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>.

voidXPUSHs(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で書き直すために
必要なこととは思えないのですが。

この回答への補足

なお、現状でわかっているのは、
(わかったつもりになっているのは)

(1)呼び出し元側と、呼び出される側との間で、
(2)INPUT、OUTPUTの仕様として、
(3)スタックに値を乗せて、インターフェースしている。

というイメージです。

イメージ
dXSARGS ⇒ CのPG上で、Perlから与えられた引数をスタックに乗せる。
SvPV_nolen ⇒ スタックに乗っている引数を、添え字指定で、取得。

(※取得した値を色々加工して、返却する値を作成する。)

XPUSHs ⇒ スタック上にSVを乗せる。
(※現状、推測になるが、おそらくsv_2mortalという機能で、newSVivという格納変数と思わしき機能の値を、スタックに乗せている。)

PUTBACK ⇒ XSUBの終了。

です。

補足日時:2009/05/07 13:24
    • good
    • 0
この回答へのお礼

ありがとうございます!

和訳して、下記のような概略はわかったのですが、
dXSARGS ⇒ スタックに乗せる。
SvPV_nolen ⇒ SVの文字列にポインターを返す。
XPUSHs ⇒ スタック上にSVを乗せる。
PUTBACK ⇒ XSUBの終了を示す。

現状、
SVとは何なのか?
なぜスタックへのPUT/GETが必要になるのか?
など、理解ができていない段階です。

> この辺のマクロ類はPerlとCで書かれた拡張との
> 引数のやり取りだとか警告の出力のためのものですから、
> Pure Perlで書き直すために必要なこととは思えないのですが。

リバースエンジニアリングをする上で、
全く前提知識がなく、ソースの1行1行を解析していたので
引数のやり取りだとか警告の出力のためのものだということ知らずに調べていました。

sakusaker7さんのご教授により、
引数のやり取りだとか警告の出力のためのものだとわかったので、
SVとは何なのか?
なぜスタックへのPUT/GETが必要になるのか?
をもう一度調べてみました。

が、わからなかったので、無視しようと思います。

ありがとうございまいた!

お礼日時:2009/05/07 13:20

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報