トップ(最新)

nDiki : AUTOLOAD

スポンサード リンク

Related term

2004年2月19日 (木)

[ Perl ] PDL::PP で C extension を書く このエントリーを含むはてなブックマーク

PDLを使ったPerl数値処理プログラムによりインタラクティブ性が求められるようになってきたので、一部をCで書いて高速化する事を検討。 問題は Linux でも Windows + ActivePerl でもすんなり動くかどうか。

@ .pd ファイルを書く

とりあず PDL::PP のサンプルから sumit 関数あたりを MathEx.pd に書いておく。

@ Makefile.PLを修正する

Foo::Bar パッケージの中の Foo::Bar::Math の一部を Foo::Bar::MathEx に移して、C extension 化したい。 ということで lib/Foo/Bar/MathEx.pd として、Makefile.PL の各種設定をしてみる。

がどうもうまくいかない。 PDL::PPMakefile.PLサポートは、Makefile.PL と同じ位置に .pd がある事を想定しているようなので、いろいろと小細工をしなければならない。 一方 PerlXS は Foo::Bar のベース名から Bar.so を作る前提になっているようで、これまたパッケージの中の一部のモジュールをどうもXS化しにくい。

@ 子Makefile.PLを作る

Perl の ext/SDBM_File を真似て、子 Makefile.PL を使ってみることにした。

 Foo-Bar-x.xx
   |
   +- Makefile.PL
   |
   +- lib
   |    |
   |    +- Foo
   |         |
   |         +- Bar.pm
   |         |
   |         +- Bar
   |              |
   |              +- Math.pm
   |              |
   |              +- MathNoEx.pm
   |              |
   |              ...
   |
   |
   +- blib/...
   |
   +- MathEx
   |    |
   |    +- Makefile.PL
   |    |
   |    +- MathEx.pd
   ...

パッケージディレクトリの下に MathEx ディレクトリを作り、そこに Makefile.PL と MathEx.pd を置く。 Makefile.PL は MathEx.pd 専用になるので、PDL::PP の標準的なものでOKになる。

全体のパッケージング・PPM化・インストール等が面倒にならないかと心配したが、Foo-Bar パッケージ化で perl Makefile.PL、make xxx を実行すれば子Makefile.PLまできちんと面倒をみてくれる。 MathEx 以下でビルドしたものもパッケージの blib に一緒に入れてくれるし(=一緒にインストールできる・PPM化できる)。 逆に make dist の際には子Makefileの方は余計なとりまとめはしないで、親Makefileが一括して tar.gz に入れてくれる。 これはよい。 MathEx.pd もきちんと Foo/Bar/MathEx.so になった。

@ XSが使えない環境との両対応

XSが使えない環境のために、PerlとPPの両方で関数を書いておく。 XSが使えれば MathEx を、使えなければ MathNoEx.pm を使うように。 表向きのAPIは Foo::Bar::Math とし、ここで AUTOLOAD を使ってどちらか一方を呼び出すようにする。 間接呼び出しにして遅くなるのはいやなので、シンボルテーブルを直接設定する。

 use vars qw($IMPLEMENT_CLASS $AUTOLOAD);
 BEGIN {
   $IMPLEMENT_CLASS = 'Foo::Bar::MathEx';

   eval "use $IMPLEMENT_CLASS";
   if ($@) {
     warn "Can't load $IMPLEMENT_CLASS: $@";
     $IMPLEMENT_CLASS = 'Foo::Bar::MathNoEx';
     eval "use $IMPLEMENT_CLASS";
     die $@ if $@;
   }
 }

 sub AUTOLOAD {
   my $name = $AUTOLOAD;
   $name =~ s/.*://;
   my $implement = $IMPLEMENT_CLASS . '::' .$name;
   no strict "refs";
   *{$name} = \&{$implement}; # ここでシンボルテーブル設定
   return &{$implement}(@_);
 }

最初は、AUTOLOAD の最後の行で die したら、trap してエラーメッセージ中のパッケージ名(Foo::Bar::MathEx や Foo::Bar::MathNoEx)を呼び出された Foo::Bar::Math に置換して die し直すようにしようかと思ったが面倒なのでやめ。

@ ActivePerl 5.6 + Visual C++ 6

使っているWindows BOX には Visual C++ 6 が入っているので、XSも問題なくビルドでき PDL extension もうまく動いた。

 PPM化までここで済ませば、他のPCにも持っていけるはず。

@ さて

これでバシバシPPで書けるわけだが、PPがこれまた難解で最初は苦労しそう。

スポンサード リンク


[ 2月19日全て ]

2004年5月15日 (土)

[ WiKicker ] CGI.pm の依存度減らし このエントリーを含むはてなブックマーク

CGI::Link や start_html の呼び出しをやめて自前で処理したり。

CGI.pm では徹底的といえるほど AUTOLOAD を使うようになっていて、サブルーチンを最初に呼び出したときに _compile 中で eval により定義するようになっている。

使わないサブルーチンの構文解析等に時間がかからないというメリットがあるかわりに、_compile はそれなりに時間もかかるので自前でやれる部分は自分でやった方がちょっと速くなる。


[ 5月15日全て ]

■よく検索されるキーワード

torrent(62) windows(62) perl(58) 提案書(48) 書き方(47) linux(44) アジェンダ(32) usb(29) 動画(27) x31(27) 使い方(27) 手帳(25) ssh(25) mp980(23) thinkpad(22) svn(21) ほぼ日手帳(21) java(21) インストール(20) 画像(20) debian(20) ドラマ(16) subversion(16) cvs(15) ubuntu(15) 設定(15) 秋葉原(14) gmail(13) ヨドバシ(13) 無料動画(13) tortoisesvn(13) dropbox(13) c#(12) .net(12) 壁紙(12) make(12) gnu(12) ノート(11) ヨドバシカメラ(11) a6(11) tc-1(11) ganttproject(11) 冷蔵庫(11) 宮根誠司(11) porter(11) 無印(10) フリー(10) 筆まめ(10) tar(10) 充電式カイロ(10) 方眼(9) パスワード(9) 日本語(9) visual(9) cwrsync(9) wiki(9) gimp(9) フォーマット(9) firefox(8) ボールペン(8) nullpointerexception(8) grub(8) skk(8) ppm(8) ご査収(8) ダウンロード(8) ケース(8) サンプル(8) 提案書の書き方(8) 無料(8) 無印良品(8) google(8) 2008(8) gtd(8) 3.5(8) framework(8) ツール(8) cgi(7) mew(7) バッグインバッグ(7)

この日記のはてなブックマーク数 Add to Google RSS

Process Time: 0.831251s / load averages: 0.14, 0.18, 0.17
nDiki by WATANABE Yoshimasa (profile)
Powered by DiKicker
Base theme by Nana (for tDiary)