読者です 読者をやめる 読者になる 読者になる

初代Masteries

きっとモヒカンにもなれないお前たちに告げる!!!

MinillaでXSモジュールを作る

perl module XS

モジュール開発のテンプレート(ひな形)生成・サポートツールとして最近注目を集めているMinillaですが, これPPモジュールだけでなく, XSモジュールの開発もできるんですね.

$ minil new -p XS Hoge::Fuga

このコマンドで, XS用のテンプレートを作ってくれるようです.

Minillaを使ったXSモジュールの開発

以下, 簡単にではありますが, Minillaを使ったXSモジュールの開発の流れを紹介したいと思います.

テンプレート生成

テンプレート(ひな形)の生成は, 前述のコマンドでできます. 今回は, XS::Tutorialという名前のモジュールを作ることにしましょう.

$ minil new -p XS XS::Tutorial

生成直後のディレクトリの中身は, このようになっているはずです.

.
└── XS-Tutorial
    ├── Build.PL
    ├── Changes
    ├── LICENSE
    ├── META.json
    ├── README.md
    ├── cpanfile
    ├── lib
    │   └── XS
    │       ├── Tutorial.pm
    │       ├── Tutorial.xs
    │       └── ppport.h
    └── t
        ├── 00_compile.t
        └── 01_simple.t

Tutorial.pmはXSを読み出すだけなので, Tutorial.xsを編集していく形になります.

xsファイルとテスト

#ifdef __cplusplus
extern "C" {
#endif

#define PERL_NO_GET_CONTEXT /* we want efficiency */
#include <EXTERN.h>
#include <perl.h>
#include <XSUB.h>

#ifdef __cplusplus
} /* extern "C" */
#endif

#define NEED_newSVpvn_flags
#include "ppport.h"

MODULE = XS::Tutorial    PACKAGE = XS::Tutorial

PROTOTYPES: DISABLE

void
hello()
CODE:
{
    ST(0) = newSVpvs_flags("Hello, world!", SVs_TEMP);
}

'lib/XS/Tutorial.xs'を見てみましょう.
初期状態では, "Hello, world!"という文字列を返す, 'hello'という関数が定義されています.
このテストが, 't/01_simple.t'に書かれています.

use strict;
use Test::More;

use XS::Tutorial;

is(XS::Tutorial::hello(), 'Hello, world!');

done_testing;

それでは, テストを実行してみましょう.

$ minil test
        (中略)
t/00_compile.t ........ ok
t/01_simple.t ......... ok
xt/cpan_meta.t ........ ok
xt/minimum_version.t .. ok
xt/pod.t .............. ok
xt/spelling.t ......... ok
All tests successful.
Files=6, Tests=10,  1 wallclock secs ( 0.04 usr  0.01 sys +  1.02 cusr  0.06 csys =  1.13 CPU)
Result: PASS

このようにMinillaは, XSファイルを実行可能な形にコンパイルして, テストをしてくれます.

XSモジュールの開発

後は, Tutorial.xsを編集し, 必要なテストを書いて, 'minil test'で確認... という流れを繰り返していきます.

ここから先は, 資料を参考にして... と言いたい所なのですが, XSモジュールを開発するにあたって使える日本語の情報はあまり多くありません.
自分が知っている範囲での情報を掲載しておきます.

まず書籍だと, @さんこと牧さんが書いた「モダンPerl入門」でXSモジュールの開発手法が何ページか使って紹介されています.

ウェブサイトだと, やはりPerldoc.jpは鉄板です. perlxsperlgutsあたりに情報が載っています.

あとは, サンプルコードによるPerl入門にも, XSについてまとめている「XS入門」というページがあります.

勉強会の資料だと, 昨年のHokkaido.pm #8で@さんが発表されていた, 「XSにまつわる話」というものがあります.
最初にこれを読んで, 「あー, XSってこんな感じのものなんだー...」と掴むのはアリだと思います.

追記

@さんから, こちらの動画も参考資料として使える, と紹介して頂きました!
Shibuya Perl Mongersテクニカルトーク#9

また, 逆にXSをPPにする際のお話ですが, @さんのYAPC::Asia 2010のスライド資料も結構勉強になりますので見てみる価値があると思います: XSからPPへ

「XSをPP化する中で, XSに詳しくなれた」という話もありますので, こちらも挑戦する価値がありそうですね!

まとめ

Minillaを使ったXSモジュールの開発の流れと, その際に活用できる日本語の参考資料を紹介しました.
「これもいい資料になるよ!」という情報があれば, ぜひぜひ教えて頂ければと思います.