Location : Home > Languages > Perl > Package Title : Math::Symbolic::Custom::CCompiler |
![]() |
Math::Symbolic::Custom::CCompiler - Math::Symbolic ツリーを C でコンパイル
use Math::Symbolic qw/:all/; use Math::Symbolic::Custom::CCompiler; my $function = parse_from_string(... some expression ...); # ... 計算 ... Math::Symbolic を参照せよ。 my $c_code = $function->to_c(); # $c_code は C コードに含まれ、元々からある関数のように振舞う。 my $anon_subroutine = $function->to_compiled_c(); # C コードを生成しコンパイルする。結果を動的にリンクするには Inline::C を使う。 # Returns an元の関数と同じ振る舞いをする匿名 Perl サブルーティンを返す。 # ただしコンパイルされた C の内部で。(value() メソッドを用いてツリーを使うより1000倍は速い)
本モジュールは Math::Symbolic の機能を C コードでシンボリック数学ツリーをコンパイルすることにより拡張する。
Perl のMath::Symbolic パッケージにおける記号演算で行い、生成された C コードをランタイム時にコンパイルしてリンクするためには Inline::C を使う。これにより高速な計算環境で結果を利用できる。
本ソフトウェアはコードを生成する。Code 生成はテストを行うことが困難であるが、本モジュールをリリースしてから1年半経つがまだバグ報告を受けていないので、それなりに安定していると言っていいだろう。
Math::Symbolic のディストリビューションに同梱されている Math::Symbolic::Compiler のマニュアルページを参照のこと。Perl サブルーチンに関数のコンパイルに関連するたいていのことは本モジュールを C にコンパイルする場合にも適用できる。
Perl プログラムを速く実行するためではなく、C コードを生成するために利用してもよい。私は C で稼動するゼルニケ多項式(Zernike Polynomials)のための実装を生成するために使った。
本モジュールは Math::Symbolic オブジェクトに以下の2つのメソッドを供給する。
$ms_tree->to_c()
本メソッドは関数により生成された C コードを返す。このコードはいかなる予約語とも重複しないように変数名と関数名を生成しているので人間に可読とは言いがたいことに注意されたい。気になるのであれば置換すればよい。
このコードは人間に読ませることを意図しているのではなく、C コンパイラに理解させればよいと考えている。
このメソッドはオプションで配列参照の引数を取ることができる。配列参照には数式が記述されている識別子名のいくつかまたは全てが含まれている必要がある。使用されていた識別子名を取得するのに Math::Symbolic オブジェクトに対する 'signature()'メソッドを利用することもできる。識別子名の順は C 関数パラメータが識別子にマップされている順を示す。省略された識別子はアルファベット順でリストの末尾に追加される。配列参照が1つもなければ引数はアルファベット順であると認識される。
この振る舞いは Math::Symbolic::Compiler で提供されるコンパイルメソッドと等しいので、詳細は対応するマニュアルを参照のこと。
$ms_tree->to_compiled_c()
本メソッドは 'to_c()' が生成し Inline::C 及び C コンパイラを用いてコンパイルするのと同等のコードを生成する。バイナリは Inline::C における魔法を通じて Perl のインスタンスへ動的にリンクされる。もしやってみて理解できなければ文句を言えばよい。が、私は対応しないがね。
Inline::C はコンパイルされた C 関数のための Perl ラッパを生成し、参照され、値を返す。(当初のパッケージはメモリリークを防ぐために削除された)
フィードバック・バグ報告・サポート要請は貢献者の誰かまたは Math::Symbolic メーリングリストまで。
本モジュールの最新バージョンは http://steffen-mueller.net または CPAN のサイトで入手可能である。
Math::Symbolic, Math::Symbolic::Compiler, Math::Symbolic::Custom, Math::Symbolic::Custom::Base
【訳注と解説】
![]() |
Updated : 2006/11/08 |