前回の(1)はこちらから。
お試しInline::C
では、基本的なC拡張のための記述を、Inline::Cを用いてPerlのソースコード上で体験してみましょう。
この回では、足し算を行う次のPerlサブルーチンに該当するコードを、Inline::Cを用いて作成します。
実行結果は次のとおりとなります。
上記で定義したPerlのadd
サブルーチンで注目すべきポイントとして、以下が挙げられます。
- 引数を2つ受け取る
- それらの値を用いて計算した結果を返す
PerlとCの間で値の受け渡しがどう行われるのかを、コードを書いて試してみましょう。
Inline::Cのインストール
Inline::Cは、cpanmを利用している人であれば簡単にインストールできます。
スクリプトで書くHello, World
Inline::Cを用いて、Hello, World
を出力するCのコードを書いてみましょう。
今までCを書いたことがある人は、Cの標準的な関数を利用するためにstdio.h
などのヘッダファイルの宣言を記述しないことに違和感を感じるかもしれません。Inline::Cはperl.h
など、Cで拡張するために必要なヘッダファイルを自動的に読み込むので、記述する必要がありません。
上記のコードからわかるように、Inline::Cを用いた場合のそれぞれの言語を記述するセクションは基本的に次のとおりとなります。
また、Cのコードを文字列として表現することもできます。次の例ではヒアドキュメントを用いています。
これらの例で、いずれもCのコードはコンパイル時にロードされます。もし変数に文字列としてCのコードを持たせておき、その変数を用いてロードしたい場合は、BEGIN
を用いる必要があります。
ワンライナーで書くHello, World
Inline::Cはワンライナーでも使用できます。
通常Perlモジュールを扱う場合は、次の書き方が一般的です。
しかしInline::Cの場合は、スクリプトと同様にuse
を使わなければいけません。
CとPerl間のやりとり
本稿では触れませんが、Perlはtypemapと呼ばれる、SVからIVを取り出しintへキャストしてCにその値を渡したり、intからSVを作成してPerlへ渡すといったロジックのマッピングを持っています。それを用いて型の操作を裏側で行うので、いつもどおりのCを書くことができます。
本来ならCのコードを書く際にSVの値を直接操作して整数値を取り出すなどしないといけないのですが、Inline::Cを使うとtypemapを用いて自動的に変換してくれます[1]。
Perlの値をCへ渡す
本節の冒頭で挙げた足し算を行うコードをCで実装するには、引数をPerlからCへと渡す必要があります。次のようなコードでPerlからCに引数を渡せます。
Perl側ではいつもどおりサブルーチンへ引数を渡しています。Cのコードでも普段どおりに、int型の引数を2つ受け取って足し算を行った結果を出力する関数を定義しています。
Cの値をPerlへ渡す
Cのコードで生成した値をPerlの世界でも扱いたいはずです。Cで生成した値をPerlの世界へ渡してみましょう。ここでも特別に難しい考えは必要としません。
先ほど記述した引数のコードを少し修正して、戻り値を返すコードを記述します。
Cの関数が値を返すように修正しただけで、処理の結果をPerlへ返すコードが簡単に記述できました。
<続きの(3)はこちら。>
- 特集1
イミュータブルデータモデルで始める
実践データモデリング
業務の複雑さをシンプルに表現!
- 特集2
いまはじめるFlutter
iOS/Android両対応アプリを開発してみよう
- 特集3
作って学ぶWeb3
ブロックチェーン、スマートコントラクト、NFT