理系学生日記

おまえはいつまで学生気分なのか

Shibuya.pm に行ってきた

今日は勤務研修が終わってから,Shibuya.pm に行ってきたよー.18:30 開始で,会場の部屋についたのが 18:28 とかでした.危険すぎる.
今日の Shibuya.pm は XS Nite と銘打たれておりまして,まさに XS のための夜であり,ぼくが初めて dan さんを目にした夜だったりします.

まぁぼくなんかは XS を書いた経験とか全然なかったわけですけど,XS で変態とか魔法使いになれるという話でしたから,ぼくは XS をちょっと体験してみることにしたのでした.

id:hirose31 さんの話によると,最初にはまず perlxstut を読むといいよみたいな話なので,よっしゃ読み始めるどー! 以下はたぶんですけど,直接 perlxstut を読んだ方がずっと分かりやすいと思います.

Example 1

まず h2xs を実行します!
h2xs ってなんだろーみたいな疑問は http://bulknews.net/lib/slides/perl-ruby-con2000/11.html とかで.ただ,リンク先はモジュールを作成するという話なので,XS のコードを生成しない -X (--omit-XS) オプションを使ってます.ぼくは今から XS とか触って変態魔法使いになるので,-X オプションはいらない!

[y-kiri xs 19:29:42 ] h2xs -A -n MyTest
Defaulting to backwards compatibility with perl 5.8.8
If you intend this module to be compatible with earlier perl versions, please
specify a minimum perl version with the -b option.

Writing MyTest/ppport.h
Writing MyTest/lib/MyTest.pm
Writing MyTest/MyTest.xs
Writing MyTest/Makefile.PL
Writing MyTest/README
Writing MyTest/t/MyTest.t
Writing MyTest/Changes
Writing MyTest/MANIFEST

拡張子 .xs だ! 変態魔法使いへの第一歩!

従順なぼくは,引き続き MyTest.xs に Hello World プログラムを追加します!
ちなみにあんまし関係ないですけど,Hello World プログラムは初心者用プログラムの看板を降ろさないといけないみたいだ! なんかそういう感じですけど,このプレゼンはとても面白かったのです.


気をとりなおして,MyTest.xs はこんな感じ.非常にシンプルなコードだ!

#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#include "ppport.h"

MODULE = MyTest         PACKAGE = MyTest

void hello()
    CODE:
        printf( "hello world!\n" );

よしよし,Makefile.PL 実行する.

[y-kiri MyTest 19:48:08 ] perl Makefile.PL
Checking if your kit is complete...
Looks good
Writing Makefile for MyTest

よしよし,make 実行する.

[y-kiri MyTest 19:48:27 ] make
cp lib/MyTest.pm blib/lib/MyTest.pm
/usr/bin/perl /System/Library/Perl/5.8.8/ExtUtils/xsubpp  -typemap /System/Library/Perl/5.8.8/ExtUtils/typemap  MyTest.xs > MyTest.xsc && mv MyTest.xsc MyTest.c
Please specify prototyping behavior for MyTest.xs (see perlxs manual)
cc -c  -I. -arch i386 -arch ppc -g -pipe -fno-common -DPERL_DARWIN -no-cpp-precomp -fno-strict-aliasing -Wdeclaration-after-statement -I/usr/local/include -O3   -DVERSION=\"0.01\" -DXS_VERSION=\"0.01\"  "-I/System/Library/Perl/5.8.8/darwin-thread-multi-2level/CORE"   MyTest.c
Running Mkbootstrap for MyTest ()
chmod 644 MyTest.bs
rm -f blib/arch/auto/MyTest/MyTest.bundle
cc -mmacosx-version-min=10.5  -arch i386 -arch ppc -bundle -undefined dynamic_lookup -L/usr/local/lib MyTest.o  -o blib/arch/auto/MyTest/MyTest.bundle  \
                \

chmod 755 blib/arch/auto/MyTest/MyTest.bundle
cp MyTest.bs blib/arch/auto/MyTest/MyTest.bs
chmod 644 blib/arch/auto/MyTest/MyTest.bs
Manifying blib/man3/MyTest.3pm

ところで,上記メッセージの中でお願いされてる箇所があるんですけど,

Please specify prototyping behavior for MyTest.xs (see perlxs manual)

perlxstut によると,これシカト対象.

よっしゃ,よびだす!

#!/usr/bin/perl
use ExtUtils::testlib;
use MyTest;
use strict;

MyTest::hello();

これでついに,Hello World でるよ!

[y-kiri MyTest 20:31:23 ] ./test.pl
hello world!

でた!