
◆状況
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で質問しましょう!
似たような質問が見つかりました
- Perl perlでリテラル値はメモリにどのように格納されているか? 1 2023/01/15 20:45
- Perl perlで2次元配列をサブルーチンに値渡しで渡す 5 2022/12/17 18:49
- C言語・C++・C# c言語の問題です 2 2023/07/21 10:51
- Perl perlをバージョンアップしたら、今まで正常に動いていたプログラムが、エラーになってしまった 3 2022/10/05 15:44
- Perl Windows10においての『Perl』のプログラムについて 1 2022/05/09 16:04
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- HTML・CSS HTMLタグのあるCSVファイルを利用する方法 4 2023/03/19 14:41
- Perl Perlで特定文字列から特定文字列までを抜き出したい 4 2022/04/02 14:24
- その他(Microsoft Office) エクセルの関数について 4 2022/07/30 16:42
- Excel(エクセル) エクセルのマクロ作成について教えてください 5 2023/02/20 00:39
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・「これはヤバかったな」という遅刻エピソード
- ・初めて自分の家と他人の家が違う、と意識した時
- ・いちばん失敗した人決定戦
- ・思い出すきっかけは 音楽?におい?景色?
- ・あなたなりのストレス発散方法を教えてください!
- ・もし10億円当たったら何に使いますか?
- ・何回やってもうまくいかないことは?
- ・今年はじめたいことは?
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プログラマー達は何故、プログ...
-
int16_t の _t は何?
-
大量のデータを読み込んで表示...
-
c言語
-
VisualStudioでC++クラスを追加...
-
最初に聞かれたこと
-
C言語 列挙型(enum型)変数について
-
c言語でイベントフラグを使った...
-
C言語 関数、変数の宣言について
-
C言語のことです。写真(見にく...
-
C#でログファイルにファイルパ...
-
C言語 バッファについて。
-
C++プログラミングコードにポリ...
-
Windows Formアプリからコンソ...
-
PIC12F1822でLED調光器を作りたい
-
プログラミングc++を全く分か...
-
プログラミング言語でアプリや...
-
今ってプログラミング言語は何...
-
どうして+3
-
プログラミング言語についてc++...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
tex についての質問です このコ...
-
perlとphpとASPの連携
-
XSUB.h、EXTERN.h、perl.h につ...
-
ブログなどのHTMLソース内の<{ ...
-
基本的な質問ですが・・
-
例外処理のフローチャートの記...
-
Excel VBAでリンク切れをチェッ...
-
エクセルVBAでシートモジュール...
-
Excel VBAで、ユーザーフォーム...
-
vba userFormのSubを標準モジュ...
-
LCD ディスプレイを Raspberry ...
-
「デバイスは PRN を初期化でき...
-
ユーザー定義関数に#NAME?が返...
-
VBSがコンパイルエラーになりま...
-
VBでグローバル変数を宣言するには
-
Excel VBA 『Call』で呼び出す...
-
モジュールの最大数はいくつな...
-
VBAで旧字体を異字体に一括で変...
-
【vba】フォームに書いてあ...
-
VBAで別モジュールへの変数の受...
おすすめ情報