XSを使ってみたい.ついでにC++も勉強したい.とりあえず今日はShibuya.pm #9 のXSトークを何個か見てみた.
PerlからXSの世界をながめてみる
まずは,PerlからXSの世界をながめてみる.整数値は一度文字列化すると文字列表現がキャッシュされる.Devel::PeekでXSレベルの構造体をダンプするとわかるよ.
コード
#!/usr/bin/env perl use strict; use warnings; use Perl6::Say; use Devel::Peek; my $x = 100; say Dump $x; "$x\n"; # 文字列化 say Dump $x;
実行結果
SV = IV(0x80cebc) at 0x800b88 REFCNT = 1 FLAGS = (PADBUSY,PADMY,IOK,pIOK) IV = 100 SV = PVIV(0x802020) at 0x800b88 REFCNT = 1 FLAGS = (PADBUSY,PADMY,IOK,POK,pIOK,pPOK) IV = 100 PV = 0x215c20 "100"\0 # このへんにキャッシュされてる CUR = 3 LEN = 4
おおホントだ! このへんの構造を理解する必要がありそう.
簡単なXSもモジュールを書いてみる
何はともあれ,とりあえず動かしてみる.
モジュールテンプレートを作る
$ module-starter --module=MyHelloWorld --class=Module::Starter::XSimple $ cd MyHelloWorld
XSファイルを修正する
いろいろファイルが生成されるけど,他には目もくれずlib/MyHelloWorld.xsを修正する.もともと作られていたのはごそっと消して以下のようにした.
#include "EXTERN.h" #include "perl.h" #include "XSUB.h" #include "ppport.h" MODULE = MyHelloWorld PACKAGE = MyHelloWorld char *hello() CODE: RETVAL = "Hello, World!"; OUTPUT: RETVAL
typemapといる仕組みがあるらしいので,char*は返せそうなので返してみてる.
ビルド
$ perl Build.PL $ ./Build
Module::Buildはあんまり使わないので新鮮.
実行
$ cd .. $ perl -Mblib -MMyHelloWorld -MPerl6::Say -e 'say MyHelloWorld::hello()' Hello, World!
おお,たしかにPerlからCで書いたコードを呼びだせた! けど,単に文字列返してるだけで何のありがたみもないぜ…
とりあえず
- 書いたら動いた.けど,何にもできない.
- SVとかPVIVとかそのへんの話がほとんどわかってないので,
perldoc perlxstut
なんかのドキュメントを読んで勉強する - そもそも,C/C++で何がしたいかとかがなくて指針がない.目標を決めて勉強する
- C++の勉強を平行してやりたいのでC++の流行をチェックして何ができそうか調べてみよう
- 最終的になんかひとつXSモジュールを書く
XS勉強するだけが目的だと,どっちに向って走ればいいのかわかんないかんじなので,C/C++の世界をいろいろウォッチしてみて,おもしろそうなネタがないかさがしてみよう.