XSやってみた
以前、print()のオーバーライドができないと書いた際、id:tokuhiromさんとid:gfxさんが「PL_check」を使うとはてダで書かれていて、「?」状態だった僕です。
この単語で検索したら一番上にPL_check hack - daily dayflowerが見つかって、ああXSかあ、と。
そういえば、何冊か参考書読んできたけど、XSとTESTとPODについては飛ばしてたなあ(しみじみ)。
まあその時はとりあえず即戦力となるような情報が欲しかったわけで、じゃあ今からならやってみてもいいのでは、ということでやってみた。
まずは何でもいいから動くコード。
[Perl] XS利用でPerl高速化 - Higepon’s blog
上記を参考に。
まずはh2xsを使って外側の構成だけ作る。
% h2xs -A -n MyTestXS Defaulting to backwards compatibility with perl 5.10.0 If you intend this module to be compatible with earlier perl versions, please specify a minimum perl version with the -b option. Writing MyTestXS/ppport.h Writing MyTestXS/lib/MyTestXS.pm Writing MyTestXS/MyTestXS.xs Writing MyTestXS/Makefile.PL Writing MyTestXS/README Writing MyTestXS/t/MyTestXS.t Writing MyTestXS/Changes Writing MyTestXS/MANIFEST
なんか警告みたいなのが出た。
「デフォルトでPerl5.10.0の後方互換なんですが、もっと前のも互換させたいなら-b使ってミニマムPerlを指定してください」かな。
よくわからないので進める。
% perl Makefile.PL % vi MyTestXS.xs % make % cat lib/MyTestXS.pm
MyTest.xsの中は参考サイトのまんま(引数の数に2を足して返す)。
で、できたのをcatしたらこんな感じだった。
package MyTestXS; use 5.010000; use strict; use warnings; require Exporter; our @ISA = qw(Exporter); # Items to export into callers namespace by default. Note: do not export # names by default without a very good reason. Use EXPORT_OK instead. # Do not simply export all your public functions/methods/constants. # This allows declaration use MyTestXS ':all'; # If you do not need this, moving things directly into @EXPORT or @EXPORT_OK # will save memory. our %EXPORT_TAGS = ( 'all' => [ qw( ) ] ); our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } ); our @EXPORT = qw( ); our $VERSION = '0.01'; require XSLoader; XSLoader::load('MyTestXS', $VERSION); # Preloaded methods go here. 1; __END__ ......
おおXSLoader!
これでuse MyTestXS;したらちゃんとincrement2()が呼べた。
自分でXSLoader使えたのは初めてだ!
多分、MyTestXS.xs内で出てきた「RETVAL」のような予約語(かな?)の中に「PL_check」が含まれているんだと想像する(調べてない)。
ちょっとずつまた勉強する。