CでPerlサブルーチンを作成することを可能にするモジュールです。バージョン0.30から、Inlineモジュールは複数のプログラミング言語をサポートし、各言語はそれぞれ独自のサポートモジュールを持ちます。このドキュメントはプログラミング言語CでInlineを使う方法について説明します。C内部にも少しだけ入っていきます。今すぐプログラムの例を試してみたいのであれば、Inline::C-Cookbookを試してみてください。Inline全般については、Inlineをご覧ください。実際にはInline::Cを直接使うことはありません。これは単にInline.pmをCで使うためのサポート・モジュールに過ぎません。...;関数定義¶CのためのInline文法はあなたCのコードでの特定の関数定義(あるいは記述)を解釈します。記述がInlineによって解釈されると、それがPerlの空間で利用できるようになります。Inlineはその関数をPerlサブルーチンであるかのように呼び出すために必要な"糊"の部分を生成します。記述が理解できなければ、Inlineはそれを単に無視するだけです。それはPerlの空間からは利用することはできません、それがたとえCの空間からは利用できたとしても。InlineはANSI/プロトタイプ形式の関数定義を検索します。あなたはInlineがtypemapで見つけることができるすべての型を使うことが出来ます。InlineはデフォルトでPerlと一緒に配布されるtypemapを利用します。あなたはTYPEMAPSコンフィグレーション・オプションでさらに多くのtypemapを指定することができます。voidという戻り値のデータ型も利用することが出来ます。以下に正しい関数定義の例を示します。戻り値の型としてだけ有効ですInlineは、関数のプロトタイプではなく、関数の定義だけを検索することに注意してください。定義は関数本体の直接前にある書き方です。Inlineはヘッダのような外部ファイルも調べません。ライブラリはリンクすることができますし、Cの空間から呼び出すことが出来ます;しかしInlineに渡されたコードだけが、結びつけのために使われます。構成設定オプション¶Inline構成設定オプションを指定する方法の情報については、Inlineをご覧ください。このセクションでは、Cのために利用できる各構成設定オプションについて説明します。ほとんどのオプションが同じ名前のMakeMakerあるいはXSのオプションに対応します。perlxsをご覧ください。自動的にインクルードされる追加のステートメントを指定します。それらはデフォルトに追加されます。改行文字が自動的に追加されます。AUTOWRAP'とすれば、Inline::CはあなたのCのコードの中の関数宣言(プロトタイプ宣言)を解析します。それがバインドできる各宣言について、外部ライブラリにあるかもしれない本当の関数を呼び出すダミーのラッパーを生成します。これはそうでなければ空のラッパー関数を必要とするだけの関数のためには、とても便利です。これはh2xsから取得できる基本的な機能と同じです。これは外部ライブラリとバインドするためにはとても有効でしょう。BOOTセクションで実行されるCのコードを指定します。XSのパラメータに対応します。使用するコンパイラを指定します。追加のコンパイラ・フラグを指定します。FILTERS¶ソースコード・フィルタのリストを指定することを可能にします。1個以上が要求されるのであれば、配列リファレンスでそれをまとめるようにしてください。フィルターはサブルーチンのリファレンスあるいは、補足のInline::Filtersモジュールによって提供されるフィルタの名前にすることができます。あなたのソースコードはInlineによって解析される直前にフィルターに掛けられます。フィルタに掛けられる前に、MD5フィンガープリントが作成されます。ソースコード・フィルタはPODドキュメントの取り外し、#includeステートメントの事前展開など、あなたの好きなことをするために使うことが出来ます。];フィルタは指定された順番に呼び出されます。さらなる詳細はInline::Filtersをご覧ください。利用するインクルードパスを指定します。MakeMakerのパラメータに対応します。使用するリンカを指定します。使用するリンカ・フラグを指定します。このフラグは単に追加するのではなく、完全に既存のフラグを上書きします。そのため、それらも使用する必要があるのであれば、それらをここで再び指定してください。LIBSあなたのコードにリンクされるべき外部ライブラリを指定します。MakeMakerのパラメータに対応します。使用する'make'ユーティリティの名前を指定します。MYEXTLIB¶リンクされるべき、ユーザがコンパイルしたオブジェクトを指定します。MakeMakerのパラメータに対応します。OPTIMIZE設定を制御します。この値を'-g'に設定することにより、あなたはInline拡張のためのデバッグ・サポートが有効になります。これによりgdbのようなデバッガを使ってあなたのCのコードにブレークポイントを設定することが可能になります。PREFIX¶それらがPerlに結び付けられたとき、Cの関数から外されるプレフィックス(prefix)を指定します。共有ライブラリAPIのためのラッパーを生成し、Perlでの元の名前に結びつけるために便利です。Perlの内部関数と名前がぶつかるときにも便利です。XSのパラメータに対応します。利用する追加のtypemapファイルを指定します。これらのデータ型はCの解析の動きを変えます。MakeMakerのパラメータに対応します。&#39;/your/path/typemap&#39;;CとPerlの結びつけ¶この関数はPerlの変数がCの変数に相互に、どのように対応付けられるのかについて説明します。あなたはPerlがどのようにサブルーチンに引数をやり取りしているかを知っておく必要があります。基本的に、それはスタックを使用します(Stackとしても知られています)。subが呼ばれたとき、丸括弧の中の全ての引数はスカラのリストに展開されます。Stackにプッシュされます。サブループンはStackから、そのパラメータをポップします。subが終了するとき、それはその全ての戻り値をStackにプッシュして戻します。Stackは、内部的にはSVで知られているスカラの配列です。実際にStackは、SVへのポインタあるいはSV*の配列です;このためStackの各要素は、本来、SV*なのです。perlgutsをご覧ください。そこで変数の対応に戻ります。XSは"typemaps"として知られている物を、各SV*をCデータ型に変えたり戻したりするために使用します。APIを通して成し遂げられます。perlapiをご覧ください。XSは、typedefで定義されたstructのように、より凝った標準ではないデータ型のために、あなたがあなた自身のtypemapを定義することを可能にします。typemapファイルをそのデフォルトのデータ型のために使用します。このファイルは/usr/local/lib/perl5/5.6.1/ExtUtils/typemap、あるいはあなたのPerlインストール方法によって、それに似たものになります。それには40種類以上のデータ型が入っています。それらは自動的にInlineによって使われます。(何か可能かをしるために、一度はこのファイルを見ておくべきでしょう。)Inlineは、これらのデータ型のためにあなたのコードを解析し、それらを対応付けるためのXSコードを生成します。SV*デフォルトに入っていないデータ型を扱う必要があるのであれば、単に一般的なSV*データ型を関数定義で使ってください。あなたのコードの中で、あなた自身が対応付けてください。代わりとして、あなた自身のtypemapファイルを生成し、TYPEMAPS構成設定オプションを使って指定することができます。戻り値のデータ型の1つvoidはInlineには特別な意味を持っています。それはStackにあなた自身が返す値をプッシュしようとしているという意味になります。これは値のリストを返す必要があるということです。あなたは本当に何も返したくないのであれば(voidの昔ながらの意味)、単に何もプッシュしないでください。省略や...が引数リストの末尾で使われれば、それは任意の数のSV*が続くかもしれないという意味になります。ここではあなたはStackの値をあなた自身がポップして取り出す必要があります。下記の"例"をご覧ください。StackをCの関数から扱うために便利なマクロが定義されています。Inline_Stack_Varsもしあなたが他の物を使いたいのであれば、これを使う必要があります。それが何であるかは重要ではありません。名前の衝突の可能性を避けるために、それに触れています。このマクロは変数を宣言するので、あなたの他の変数宣言と一緒に関数の先頭に置いておく必要があります。それは実行ステートメントの前、そして他のInline_Stackマクロよりも前になければなりません。Inline_Stack_ItemsStackに渡された引数の数を返します。Inline_Stack_Item(i)Stackでの特定のSV*を参照します。iは0始まりのインデックス番号です。値を取得や設定ために使うことが出来ます。Inline_Stack_ResetStackに何か値をプッシュして戻す前に使ってください。これはStackの内部ポインタをStackのはじめにリセットします。Inline_Stack_Push(sv)Stackに戻り値をプッシュします。値のデータ型はSV*型でなければなりません。Inline_Stack_Done戻り値の全てをプッシュした後、このマクロを呼ばなければいけません。Inline_Stack_Return(n)Stackでのnの要素を返します。Inline_Stack_Voidあなたが本当に何も返さないことを示す特殊なマクロです。Inline_Stack_Return(0);このマクロは実際に、あなたの関数からリターンすることに注意してください。これらのマクロは、あなたのコーディングの好みに合わせて異なる3つの形式で使うことが出来ます。以下の以下のマクロはすべて同等です。INLINE_STACK_VARSこの機能のすべてはXSマクロ呼び出しを通しても利用することができます。それではなぜ機能が重複しているのでしょうか?なぜ私がこの一連のマクロを提供するように決めたのかという理由はいくつかあります。第一にStackへアクセスするための便利な方法として。第二に一貫性があり自己説明的であり分かりにくくないコーディングのために。第三に将来の互換性のために。それは彼らのCのコードのために、多くの人がXSマクロを使いはじめたならば、Perl6ではそのインターフェースが崩れてしまうかもしれないと思われました。このセットを使うことにより、たぶん引数の取扱いでの将来の互換性を保証することが出来ます。APIを使えば、あなたのコードはおそらくPerl6の下では崩れてしまうでしょう。そのためこれは100%の保証ではありません。引数の取扱いは最もよく、あなたが使いそうなインターフェースですから、そうすることが賢いことのようにみえます。Cのサブルーチンの書き方¶あなたのC関数の定義は以下の4つのカテゴリのどれか1つに入ります。各カテゴリ毎に特に注意する点があります。{これが最も単純なケースです。戻り値のデータ型がvoidではなく、固定した数の引数リストを持っています。心配する必要はありません。すべての変換は自動的に行われます。{このカテゴリでは、戻り値の型がvoidです。あなたは何も返したくないか、リストを返したいという意味です。後者のケースでは、あなた自身でStackに値をプッシュする必要があります。これを簡単に行うためのInlineマクロがいくつかあります。Inline_Stack_Done;Stackポインタをリセットした後、このコードは一連の戻り値をプッシュします。最後に戻り値のスタックの最後をマークするためInline_Stack_Doneを使います。あなたが本当に何も返したくないのであれば、Inline_Stack_マクロを使わないでください。あなたがそれを使ったならば、関数の最後でInline_Stack_Voidを使って設定してください。{このカテゴリでは、引数の数が決まっていません。Stackからあなた自身が値をポップする必要があるということです。handle_sv(Inline_Stack_Item(i));Inline_Stack_Item(i)の戻り値のデータ型はSV*です。{このカテゴリでは、戻り値の型としてvoidを持ち、引数の数が決まっていません。カテゴリ3と4からのテクニックを組み合わせてください。以下にいくつかの例を挙げます。それぞれ、あなた自信が実行して試すことができる完全なプログラムです。多くの例についてはInline::C-Cookbookをご覧ください。挨拶(=Greetings)¶この例は1つの文字列の引数(名前)を取り、挨拶を出力します。関数は文字列と数値で呼び出されます。2番目のケースでは数値は文字列へ強制的に変換されます。<stdio.h>とする必要がないことに注意してください。デフォルトでインクルードされるperl.hヘッダ・ファイルは、自動的に標準的なCのヘッダファイルをあなたに代わってロードします。Value)へのポインタ)である点を除けば、上記の例に似ています。SVを文字列に自分自身で変換する必要があるということです。これはPerl内部APIの一部であるSvPVX関数を使うことにより実現できます。perlapiをご覧ください。問題はSvPVXが自動的に文字列を数値に変換しないことです。そのため42に挨拶しようとすると、ちょっとビックリすることになります。このプログラムは、Perlの内部をいじったときによく発生するように、セグメント・フォルトになります。代わりにSvPV関数を使うことにより、例#2での問題を修正することができます。この関数は、それに文字列が含まれていなければ、SVを文字列化します。SvPVはその2番目のパラメータとして、文字列の長さを返します。私たちは長さについて気にしていないので、そこにPL_naを置くだけにすることができます。それはその目的のための特別な変数です。}参考資料¶Inlineについての一般的な情報についてはInlineをご覧ください。CでInlineを使ったサンプル・プログラムについてはInline::C-Cookbookを、ご覧ください。サポートされている言語とプラットホームについてはInline-Supportをご覧くださ。独自のInline言語サポート・モジュールを書くための情報についてはInline-APIをご覧ください。Inlineのメーリングリストはinline@perl.orgです。参加するためには、inline-subscribe@perl.orgにメールしてください。バグと欠陥¶Cの関数名に、たまたまPerlによって内部的に使われているものを使うと、実行時にロードエラーになります。現在のところこれを防いだり、警告する機能はありません。今はPerlの内部シンボルがファイル名'symbols.perl'で、Inlineモジュール・ディストリビューションに入っています。コードではこれらを使わないようにしてください。Association。