XS(とC++)入門したい

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++の世界をいろいろウォッチしてみて,おもしろそうなネタがないかさがしてみよう.