オープンソース・ソフトウェアの開発とダウンロード

CVS リポジトリの参照

Contents of /perldocjp/docs/modules/Inline-0.43/C/C.pod

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.1 - (show annotations) (download)
Fri Jul 19 08:25:17 2002 UTC (21 years, 9 months ago) by oyama
Branch: MAIN
Initial import

1 =head1 名前
2
3 Inline::C - CでPerlサブルーチンを作成
4
5 =head1 説明
6
7 C<Inline::C> は、CでPerlサブルーチンを作成することを可能にするモジュールです。バージョン0.30から、Inlineモジュールは複数のプログラミング言語をサポートし、各言語はそれぞれ独自のサポートモジュールを持ちます。このドキュメントはプログラミング言語CでInlineを使う方法について説明します。それはPerl C内部にも少しだけ入っていきます。
8
9 今すぐプログラムの例を試してみたいのであれば、L<Inline::C-Cookbook>を試してみてください。Inline全般については、L<Inline>をご覧ください。
10
11 =head1 使用方法
12
13 実際にはC<Inline::C>を直接使うことはありません。これは単にC<Inline.pm>をCで使うためのサポート・モジュールに過ぎません。そこで使い方は常に以下のようになります:
14
15 use Inline C => ...;
16
17 あるいは
18
19 bind Inline C => ...;
20
21 =head1 関数定義
22
23 CのためのInline文法はあなたCのコードでの特定の関数定義(あるいは記述)を解釈します。記述がInlineによって解釈されると、それがPerlの空間で利用できるようになります。つまり、Inlineはその関数をPerlサブルーチンであるかのように呼び出すために必要な"糊"の部分を生成します。もし記述が理解できなければ、Inlineはそれを単に無視するだけです。何も言いません。それはPerlの空間からは利用することはできません、それがたとえCの空間からは利用できたとしても。
24
25 InlineはANSI/プロトタイプ形式の関数定義を検索します。それは以下のような形式になります:
26
27 戻り値のデータ型 関数名 ( データ型-名前の組み合わせの集合 ) { ... }
28
29 よく使われるデータ型は:C<int>, C<long>, C<double>, C<char*>, そして C<SV*>です。しかし、あなたはInlineがtypemapで見つけることができるすべての型を使うことが出来ます。InlineはデフォルトでPerlと一緒に配布されるC<typemap>を利用します。あなたはTYPEMAPSコンフィグレーション・オプションでさらに多くのtypemapを指定することができます。
30
31 C<void>という戻り値のデータ型も利用することが出来ます。以下に正しい関数定義の例を示します。
32
33 int Foo(double num, char* str) {
34 void Foo(double num, char* str) {
35 SV* Foo() {
36 void Foo(SV*, ...) {
37 long Foo(int i, int j, ...) {
38
39 以下の定義は理解されません:
40
41 Foo(int i) { # 戻り値の型がありません
42 int Foo(float f) { # floatの(デフォルトの)typemapはありません
43 unsigned int Foo(int i) { # 'unsigned int' は理解されません
44 int Foo(num, str) double num; char* str; {
45 void Foo(void) { # void は戻り値の型としてだけ有効です
46
47 Inlineは、関数のI<プロトタイプ>ではなく、関数のI<定義>だけを検索することに注意してください。定義は関数本体の直接前にある書き方です。またInlineはヘッダのような外部ファイルも調べません。ライブラリはリンクすることができますし、Cの空間から呼び出すことが出来ます;しかしInlineに渡されたコードだけが、結びつけのために使われます。
48
49 =head1 C 構成設定オプション
50
51 Inline構成設定オプションを指定する方法の情報については、L<Inline>をご覧ください。このセクションでは、Cのために利用できる各構成設定オプションについて説明します。ほとんどのオプションが同じ名前のMakeMakerあるいはXSのオプションに対応します。L<ExtUtils::MakeMaker> と L<perlxs>をご覧ください。
52
53 =head2 AUTO_INCLUDE
54
55 自動的にインクルードされる追加のステートメントを指定します。それらはデフォルトに追加されます。改行文字が自動的に追加されます。
56
57 use C => Config => AUTO_INCLUDE => '#include "yourheader.h"';
58
59 =head2 AUTOWRAP
60
61 もし'ENABLE => AUTOWRAP'とすれば、Inline::CはあなたのCのコードの中の関数宣言(プロトタイプ宣言)を解析します。それがバインドできる各宣言について、外部ライブラリにあるかもしれない本当の関数を呼び出すダミーのラッパーを生成します。これはそうでなければ空のラッパー関数を必要とするだけの関数のためには、とても便利です。
62
63 これはC<h2xs>から取得できる基本的な機能と同じです。これは外部ライブラリとバインドするためにはとても有効でしょう。
64
65 =head2 BOOT
66
67 XS BOOTセクションで実行されるCのコードを指定します。XSのパラメータに対応します。
68
69 =head2 CC
70
71 使用するコンパイラを指定します。
72
73 =head2 CCFLAGS
74
75 追加のコンパイラ・フラグを指定します。
76
77 =head2 FILTERS
78
79 ソースコード・フィルタのリストを指定することを可能にします。1個以上が要求されるのであれば、配列リファレンスでそれをまとめるようにしてください。フィルターはサブルーチンのリファレンスあるいは、補足のInline::Filtersモジュールによって提供されるフィルタの名前にすることができます。
80
81 あなたのソースコードはInlineによって解析される直前にフィルターに掛けられます。フィルタに掛けられる前に、MD5フィンガープリントが作成されます。ソースコード・フィルタはPODドキュメントの取り外し、#includeステートメントの事前展開など、あなたの好きなことをするために使うことが出来ます。例えば:
82
83 use Inline C => DATA =>
84 FILTERS => [Strip_POD => \&MyFilter => Preprocess ];
85
86 フィルタは指定された順番に呼び出されます。さらなる詳細はL<Inline::Filters>をご覧ください。
87
88 =head2 INC
89
90 利用するインクルードパスを指定します。MakeMakerのパラメータに対応します。
91
92 use C => Config => INC => '-I/inc/path';
93
94 =head2 LD
95
96 使用するリンカを指定します。
97
98 =head2 LDDLFLAGS
99
100 使用するリンカ・フラグを指定します。
101
102 注意: このフラグは単に追加するのではなく、完全に既存のフラグを上書きします。そのため、それらも使用する必要があるのであれば、それらをここで再び指定してください。
103 =head2 LIBS
104
105 あなたのコードにリンクされるべき外部ライブラリを指定します。MakeMakerのパラメータに対応します。
106
107 use C => Config => LIBS => '-lyourlib';
108
109 あるいは
110
111 use C => Config => LIBS => '-L/your/path -lyourlib';
112
113 =head2 MAKE
114
115 使用する'make'ユーティリティの名前を指定します。
116
117 =head2 MYEXTLIB
118
119 リンクされるべき、ユーザがコンパイルしたオブジェクトを指定します。MakeMakerのパラメータに対応します。
120
121 use C => Config => MYEXTLIB => '/your/path/yourmodule.so';
122
123 =head2 OPTIMIZE
124
125 これはMakeMaker OPTIMIZE設定を制御します。この値を'-g'に設定することにより、あなたはInline拡張のためのデバッグ・サポートが有効になります。これによりgdbのようなデバッガを使ってあなたのCのコードにブレークポイントを設定することが可能になります。
126
127 =head2 PREFIX
128
129 それらがPerlに結び付けられたとき、Cの関数から外されるプレフィックス(prefix)を指定します。共有ライブラリAPIのためのラッパーを生成し、Perlでの元の名前に結びつけるために便利です。またPerlの内部関数と名前がぶつかるときにも便利です。XSのパラメータに対応します。
130
131 use C => Config => PREFIX => 'ZLIB_';
132
133 =head2 TYPEMAPS
134
135 利用する追加のtypemapファイルを指定します。これらのデータ型はCの解析の動きを変えます。MakeMakerのパラメータに対応します。
136
137 use C => Config => TYPEMAPS => '/your/path/typemap';
138
139 =head1 CとPerlの結びつけ
140
141 この関数はC<Perl>の変数がC<C>の変数に相互に、どのように対応付けられるのかについて説明します。
142
143 まず、あなたはC<Perl>がどのようにサブルーチンに引数をやり取りしているかを知っておく必要があります。基本的に、それはスタックを使用します(B<Stack>としても知られています)。subが呼ばれたとき、丸括弧の中の全ての引数はスカラのリストに展開されます。そしてB<Stack>にプッシュされます。そしてサブループンはB<Stack>から、そのパラメータをポップします。subが終了するとき、それはその全ての戻り値をB<Stack>にプッシュして戻します。
144
145 B<Stack>は、内部的にはC<SV>で知られているスカラの配列です。実際にB<Stack>は、B<SVへのポインタ>あるいはC<SV*>の配列です;このためB<Stack>の各要素は、本来、C<SV*>なのです。これについてのI<FMTYEWTK>は、C<perldoc perlguts>をご覧ください。
146
147 そこで変数の対応に戻ります。XSは"typemaps"として知られている物を、各C<SV*>をC<C>データ型に変えたり戻したりするために使用します。これはさまざまなXSマクロ呼び出し、キャスト、そしてPerl APIを通して成し遂げられます。C<perldoc perlapi>をご覧ください。XSは、C<typedef>で定義されたstructのように、より凝った標準ではないデータ型のために、あなたがあなた自身のtypemapを定義することを可能にします。
148
149 Inlineは、デフォルトのPerl typemapファイルをそのデフォルトのデータ型のために使用します。このファイルはC</usr/local/lib/perl5/5.6.1/ExtUtils/typemap>、あるいはあなたのPerlインストール方法によって、それに似たものになります。それには40種類以上のデータ型が入っています。それらは自動的にInlineによって使われます。(何か可能かをしるために、一度はこのファイルを見ておくべきでしょう。)
150
151 Inlineは、これらのデータ型のためにあなたのコードを解析し、それらを対応付けるためのXSコードを生成します。最もよく使われるデータ型は以下のものです:
152
153 - int
154 - long
155 - double
156 - char*
157 - void
158 - SV*
159
160 デフォルトに入っていないデータ型を扱う必要があるのであれば、単に一般的なC<SV*>データ型を関数定義で使ってください。そして、あなたのコードの中で、あなた自身が対応付けてください。代わりとして、あなた自身のtypemapファイルを生成し、C<TYPEMAPS>構成設定オプションを使って指定することができます。
161
162 戻り値のデータ型の1つC<void>はInlineには特別な意味を持っています。それはB<Stack>にあなた自身が返す値をプッシュしようとしているという意味になります。これは値のリストを返す必要があるということです。もしあなたは本当に何も返したくないのであれば(C<void>の昔ながらの意味)、単に何もプッシュしないでください。
163
164 もし省略やC<...>が引数リストの末尾で使われれば、それは任意の数のC<SV*>が続くかもしれないという意味になります。ここではあなたはC<Stack>の値をあなた自身がポップして取り出す必要があります。
165
166 下記のL<"例">をご覧ください。
167
168 =head1 Inline Stack マクロ
169
170 Inline Cを書くとき、(デフォルトでは)以下の行が自動的にあなたのコードの前につけられます:
171
172 #include "EXTERN.h"
173 #include "perl.h"
174 #include "XSUB.h"
175 #include "INLINE.h"
176
177 ファイルC<INLINE.h>は、Perl StackをCの関数から扱うために便利なマクロが定義されています。
178
179 =over 4
180
181 =item Inline_Stack_Vars
182
183 もしあなたが他の物を使いたいのであれば、これを使う必要があります。これは他のマクロによって使われる、いくつかのローカル変数を設定します:C<sp>, C<items>, C<ax> and C<mark>。それが何であるかは重要ではありません。しかし名前の衝突の可能性を避けるために、それに触れています。
184
185 注意: このマクロは変数を宣言するので、あなたの他の変数宣言と一緒に関数の先頭に置いておく必要があります。それは実行ステートメントの前、そして他のC<Inline_Stack>マクロよりも前になければなりません。
186
187 =item Inline_Stack_Items
188
189 Stackに渡された引数の数を返します。
190
191 =item Inline_Stack_Item(i)
192
193 Stackでの特定のC<SV*>を参照します。C<i>は0始まりのインデックス番号です。値を取得や設定ために使うことが出来ます。
194
195 =item Inline_Stack_Reset
196
197 Stackに何か値をプッシュして戻す前に使ってください。これはStackの内部ポインタをStackのはじめにリセットします。
198
199 =item Inline_Stack_Push(sv)
200
201 Stackに戻り値をプッシュします。値のデータ型はC<SV*>型でなければなりません。
202
203 =item Inline_Stack_Done
204
205 戻り値の全てをプッシュした後、このマクロを呼ばなければいけません。
206
207 =item Inline_Stack_Return(n)
208
209 StackでのC<n>の要素を返します。
210
211 =item Inline_Stack_Void
212
213 あなたが本当に何も返さないことを示す特殊なマクロです。以下のものと同じです:
214
215 Inline_Stack_Return(0);
216
217 このマクロは実際に、あなたの関数からB<リターンする>ことに注意してください。
218
219 =back
220
221 これらのマクロは、あなたのコーディングの好みに合わせて異なる3つの形式で使うことが出来ます。以下の以下のマクロはすべて同等です。
222
223 Inline_Stack_Vars
224 inline_stack_vars
225 INLINE_STACK_VARS
226
227 この機能のすべてはXSマクロ呼び出しを通しても利用することができます。それではなぜ機能が重複しているのでしょうか?なぜ私がこの一連のマクロを提供するように決めたのかという理由はいくつかあります。第一にStackへアクセスするための便利な方法として。第二に一貫性があり自己説明的であり分かりにくくないコーディングのために。第三に将来の互換性のために。それは彼らのCのコードのために、多くの人がXSマクロを使いはじめたならば、Perl6ではそのインターフェースが崩れてしまうかもしれないと思われました。このセットを使うことにより、たぶん引数の取扱いでの将来の互換性を保証することが出来ます。
228
229 もちろん、あなたが他のPerl APIを使えば、あなたのコードはおそらくPerl6の下では崩れてしまうでしょう。そのためこれは100%の保証ではありません。しかし引数の取扱いは最もよく、あなたが使いそうなインターフェースですから、そうすることが賢いことのようにみえます。
230
231 =head1 Cのサブルーチンの書き方
232
233 あなたのC関数の定義は以下の4つのカテゴリのどれか1つに入ります。各カテゴリ毎に特に注意する点があります。
234
235 =over 4
236
237 =item 1
238
239 int Foo(int arg1, char* arg2, SV* arg3) {
240
241 これが最も単純なケースです。戻り値のデータ型がC<void>ではなく、固定した数の引数リストを持っています。あまり心配する必要はありません。すべての変換は自動的に行われます。
242
243 =item 2
244
245 void Foo(int arg1, char* arg2, SV* arg3) {
246
247 このカテゴリでは、戻り値の型がC<void>です。つまりあなたは何も返したくないか、リストを返したいという意味です。後者のケースでは、あなた自身でB<Stack>に値をプッシュする必要があります。これを簡単に行うためのInlineマクロがいくつかあります。コードは以下のようになります:
248
249 int i, max; SV* my_sv[10];
250 Inline_Stack_Vars;
251 Inline_Stack_Reset;
252 for (i = 0; i < max; i++)
253 Inline_Stack_Push(my_sv[i]);
254 Inline_Stack_Done;
255
256 Stackポインタをリセットした後、このコードは一連の戻り値をプッシュします。最後に戻り値のスタックの最後をマークするためC<Inline_Stack_Done>を使います。
257
258 あなたが本当に何も返したくないのであれば、C<Inline_Stack_>マクロを使わないでください。あなたがそれを使ったならば、関数の最後でC<Inline_Stack_Void>を使って設定してください。
259
260 =item 3
261
262 char* Foo(SV* arg1, ...) {
263
264 このカテゴリでは、引数の数が決まっていません。つまりB<Stack>からあなた自身が値をポップする必要があるということです。以下のようにしてください:
265
266 int i;
267 Inline_Stack_Vars;
268 for (i = 0; i < Inline_Stack_Items; i++)
269 handle_sv(Inline_Stack_Item(i));
270
271 C<Inline_Stack_Item(i)>の戻り値のデータ型はC<SV*>です。
272
273 =item 4
274
275 void* Foo(SV* arg1, ...) {
276
277 このカテゴリでは、戻り値の型としてC<void>を持ち、引数の数が決まっていません。単に、カテゴリ3と4からのテクニックを組み合わせてください。(訳者注:これは2,3の間違いでしょう)
278
279 =back
280
281 =head1 例
282
283 以下にいくつかの例を挙げます。それぞれ、あなた自信が実行して試すことができる完全なプログラムです。より多くの例についてはL<Inline::C-Cookbook>をご覧ください。
284
285 =head2 例 #1 - 挨拶(=Greetings)
286
287 この例は1つの文字列の引数(名前)を取り、挨拶を出力します。関数は文字列と数値で呼び出されます。2番目のケースでは数値は文字列へ強制的に変換されます。
288
289 C<#include <stdio.h>>とする必要がないことに注意してください。デフォルトでインクルードされるC<perl.h>ヘッダ・ファイルは、自動的に標準的なCのヘッダファイルをあなたに代わってロードします。
290
291 use Inline C;
292 greet('Ingy');
293 greet(42);
294 __END__
295 __C__
296 void greet(char* name) {
297 printf("Hello %s!\n", name);
298 }
299
300 =head2 例 #2 - さらに挨拶の言葉
301
302 これは、文字列(C<char*>)ではなく、名前(=name)がC<SV*>(スカラ値(=Scalar Value)へのポインタ)である点を除けば、上記の例に似ています。つまりC<SV>を文字列に自分自身で変換する必要があるということです。これはC<Perl>内部APIの一部であるC<SvPVX>関数を使うことにより実現できます。さらなる情報についてはC<perldoc perlapi>をご覧ください。
303
304 問題はC<SvPVX>が自動的に文字列を数値に変換しないことです。そのためC<42>に挨拶しようとすると、ちょっとビックリすることになります。このプログラムは、Perlの内部をいじったときによく発生するように、セグメント・フォルトになります。
305
306 use Inline C;
307 greet('Ingy');
308 greet(42);
309 __END__
310 __C__
311 void greet(SV* sv_name) {
312 printf("Hello %s!\n", SvPVX(sv_name));
313 }
314
315 =head2 例 #3 - 問題の修正
316
317 代わりにC<SvPV>関数を使うことにより、例#2での問題を修正することができます。この関数は、それに文字列が含まれていなければ、C<SV>を文字列化します。C<SvPV>はその2番目のパラメータとして、文字列の長さを返します。私たちは長さについて気にしていないので、そこにC<PL_na>を置くだけにすることができます。それはその目的のための特別な変数です。
318
319 use Inline C;
320 greet('Ingy');
321 greet(42);
322 __END__
323 __C__
324 void greet(SV* sv_name) {
325 printf("Hello %s!\n", SvPV(sv_name, PL_na));
326 }
327
328 =head1 参考資料
329
330 Inlineについての一般的な情報についてはL<Inline>をご覧ください。
331
332 CでInlineを使ったサンプル・プログラムについてはL<Inline::C-Cookbook>を、ご覧ください。
333
334 サポートされている言語とプラットホームについてはL<Inline-Support>をご覧くださ。い。
335
336 独自のInline言語サポート・モジュールを書くための情報についてはL<Inline-API>をご覧ください。
337
338 Inlineのメーリングリストはinline@perl.orgです。
339
340 参加するためには、inline-subscribe@perl.orgにメールしてください。
341
342 =head1 バグと欠陥
343
344 =over 4
345
346 =item 1
347
348 Cの関数名に、たまたまPerlによって内部的に使われているものを使うと、実行時にロードエラーになります。現在のところこれを防いだり、警告する機能はありません。今はPerlの内部シンボルがファイル名C<'symbols.perl'>で、Inlineモジュール・ディストリビューションに入っています。コードではこれらを使わないようにしてください。
349
350 =back
351
352 =head1 作者(AUTHOR)
353
354 Brian Ingerson <INGY@cpan.org>
355
356 =head1 著作権(COPYRIGHT)
357
358 Copyright (c) 2000, 2001. Brian Ingerson. All rights reserved.
359
360 This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
361
362 See http://www.perl.com/perl/misc/Artistic.html
363
364 =head1 翻訳者
365
366 川合孝典 <kwitknr@cpan.org>
367
368 =cut

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26