今日は勤務研修が終わってから,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!
でた!