◆状況
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;
と一行書かれているだけなのですが、関数ではなく、戻り値を必要としないサブルーチンということでしょうか?
/***********************************/
どなたか、資料/情報や、もしくは調べ方などをご存知の方がいらっしゃれば、
ご教授お願いできませんでしょうか?
些細な情報でも構いませんので、宜しくお願い致します。。
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/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 …
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*) その他のスカラー
のだろうとわかりました。
(わかったつもりなだけかもしれませんが。。)
ありがとうございまいした!
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);
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の終了。
です。
ありがとうございます!
和訳して、下記のような概略はわかったのですが、
dXSARGS ⇒ スタックに乗せる。
SvPV_nolen ⇒ SVの文字列にポインターを返す。
XPUSHs ⇒ スタック上にSVを乗せる。
PUTBACK ⇒ XSUBの終了を示す。
現状、
SVとは何なのか?
なぜスタックへのPUT/GETが必要になるのか?
など、理解ができていない段階です。
> この辺のマクロ類はPerlとCで書かれた拡張との
> 引数のやり取りだとか警告の出力のためのものですから、
> Pure Perlで書き直すために必要なこととは思えないのですが。
リバースエンジニアリングをする上で、
全く前提知識がなく、ソースの1行1行を解析していたので
引数のやり取りだとか警告の出力のためのものだということ知らずに調べていました。
sakusaker7さんのご教授により、
引数のやり取りだとか警告の出力のためのものだとわかったので、
SVとは何なのか?
なぜスタックへのPUT/GETが必要になるのか?
をもう一度調べてみました。
が、わからなかったので、無視しようと思います。
ありがとうございまいた!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Cのプログラムからアクセスでき...
-
大量のデータを読み込んで表示...
-
プログラミング言語でアプリや...
-
c++の勉強方法を教えてくださ...
-
プログラミング 素数か素数では...
-
C言語について。
-
いまc言語を独学で勉強している...
-
C# でソフト開発をした事のある...
-
逆コンパイルと逆アセンブルの...
-
C言語について。
-
C言語について。
-
だれがとけるの?
-
C言語 配列と関数の練習問題
-
システムエンジニアの適正について
-
どちのほうがすきですか?
-
gccを行ってもexeファイルが生...
-
C++でデスクトップGUIアプリ開...
-
C言語でファクト関数を使わずに...
-
C言語 1から20までの逆数の和を...
-
パソコン
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
tex についての質問です このコ...
-
ブログなどのHTMLソース内の<{ ...
-
HTMLの中にperlを記述する方法...
-
スクリプト言語「perl」はすた...
-
校正ツールのパールって何ですか。
-
C、C++、Peal、PHPその他「高級...
-
例外処理のフローチャートの記...
-
Excel VBAでリンク切れをチェッ...
-
LCD ディスプレイを Raspberry ...
-
VBSがコンパイルエラーになりま...
-
Excel VBAで、ユーザーフォーム...
-
「デバイスは PRN を初期化でき...
-
ユーザー定義関数に#NAME?が返...
-
Excel VBA 『Call』で呼び出す...
-
エクセルVBAでシートモジュール...
-
VBAで別モジュールへの変数の受...
-
モジュールの最大数はいくつな...
-
VBでグローバル変数を宣言するには
-
グラフのX,Y座標を取得したい
-
VBA This Workbookモジュール...
おすすめ情報