◆状況
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.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が必要になるのか?
をもう一度調べてみました。
が、わからなかったので、無視しようと思います。
ありがとうございまいた!
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*) その他のスカラー
のだろうとわかりました。
(わかったつもりなだけかもしれませんが。。)
ありがとうございまいした!
お探しの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を探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
オリジナルの掲示板
-
LCD ディスプレイを Raspberry ...
-
ArduinoのジャイロモジュールMP...
-
Excel VBAでリンク切れをチェッ...
-
モジュールとクラスの違いって...
-
VBAでoutlook365が起動しません。
-
Excel VBAで、ユーザーフォー...
-
Wordで、分かち書きをするVBA ...
-
Excel VBA 定義されたプロージ...
-
Excelで時刻になったら知らせて...
-
powershellで関数名を変更する...
-
グラフのX,Y座標を取得したい
-
vba 標準モジュールインポート...
-
例外処理のフローチャートの記...
-
COBOLで、Shellを起動するには?
-
Perl+DBD::Oracleのエラーがわ...
-
VB.NETでの他アプリケーション...
-
VBAのモジュールについて教えて...
-
Apache2 静的・動的モジュール...
-
BASP21使用のメール送信でコマ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
tex についての質問です このコ...
-
PHPとPerlの違い
-
JAVAとperlはどっちが将来有望...
-
校正ツールのパールって何ですか。
-
perl/tkとtcl/tkの違いを知りたい
-
phpとperl
-
Excel VBAでリンク切れをチェッ...
-
Excel VBA 定義されたプロージ...
-
例外処理のフローチャートの記...
-
ArduinoのジャイロモジュールMP...
-
ユーザー定義関数に#NAME?が返...
-
「デバイスは PRN を初期化でき...
-
VBAで別モジュールへの変数の受...
-
Excel VBA 『Call』で呼び出す...
-
エクセルVBAでシートモジュール...
-
LCD ディスプレイを Raspberry ...
-
モジュールとは何ですか
-
ハマったので助けて~。Apache...
-
VBA This Workbookモジュール...
-
VBでグローバル変数を宣言するには
おすすめ情報