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

CVS リポジトリの参照

Annotation 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.2 - (hide annotations) (download)
Thu Jan 27 13:14:57 2011 UTC (13 years, 3 months ago) by iwai
Branch: MAIN
CVS Tags: HEAD
Changes since 1.1: +3 -0 lines
add encoding tag

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

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