CodeGeneration パッケージ
Maple 8 の新機能である CodeGeneration パッケージ は、Maple のコードを他の言語に変換するための、関数の集合です。このワークシートには、本パッケージを使用し始めるに当たっての、いくつかのシンプルな例題が用意されています。追加の情報や例題は、パッケージおよび個々のパッケージを構成する機能に関するヘルプページ内で見ることが可能です。
|
CodeGeneration パッケージの紹介
|
|
以下のコマンドにより、CodeGeneration パッケージ内にある関数名の短い形を使用できるようなります。3つの関数 C, Fortran, Java が、それぞれ ANSI C, Fortran 77, Java への変換用に用意されています。
CodeGeneration パッケージにより、式、計算列を表す等式のリスト、手続きまたは rtable を、目的の言語のいずれかに変換することが可能です。8
•
|
式と rtable 要素は、自動的に生成される名前により、変数への割り当てとして変換されます。
|
•
|
等式のリストは、割り当ての列として変換されます。
|
•
|
手続きは、目的言語でそれに等価なものに変換されます。
|
>
|
C([x=2, y=x+z, z=x*y+5]);
|
>
|
f := proc(u, v) return u*v+u-v end proc:
Fortran(f);
|
>
|
Java(Matrix(2, 2, [[15.0, x], [-2.5, y]]));
|
CodeGeneration パッケージは、Maple 言語の一部分だけを変換します。パッケージを構成するもの全体に共通する制限事項および特定の機能については、CodeGeneration パッケージを用いたコード変換に関する注意点 のヘルプページに記述されています。個々の目的言語特有のさらなる詳細については、C へのコード変換における注意点, Fortran へのコード変換における注意点 および Java へのコード変換における注意点 のヘルプページに記述されています。
以前のバージョンの Maple では、codegen[C] および codegen[fortran] の変換ツールを使用していました。現在では、codegen[C] および codegen[fortran] とほとんど同じ機能を持ち、以下に記述するような追加の機能を持っている、CodeGeneration の変換ツールの使用を推奨します。
|
|
出力のカスタマイズに関するオプション
|
|
Maple 言語と CodeGeneration でサポートされている目的言語との間には、基本的な違いがあるため、いくつかの場合では直接的な変換が難しいことがあります。例えば、Maple はインタプリタ言語であり、豊富な型の組み合わせを持ち、陰的な戻り値を許しています。目的言語は、より制限された型の組み合わせや必要となる変数についてサポートしており、またコンパイル時に既知となる型を返します。
これらの違いの結果として、CodeGeneration の関数は、複数の結果をとり得る場合に、しばしば最も適切な返還を選択する必要に迫られます。時折、その選択により、予期しない、あるいは希望しない結果を生むことがあります。しかし、出力をカスタマイズするために使用が可能な、いくつかのオプションが用意されています。CodeGeneration の関数全体に共通するオプションについては、 CodeGeneration のオプション のヘルプページに記述されています。
|
型の変換の制御
|
|
以下の例では、全てのパラメータにデフォルトで浮動小数点型が割り当てられます。
>
|
f := proc(x, y, z) return x*y-y*z+x*z; end proc:
C(f);
|
型のない変数に与えられるデフォルトの型は、defaulttype オプションを用いて変更が可能です。
>
|
C(f, defaulttype=integer);
|
CodeGeneration は、型のない変数の型を判定しようと試みます。デフォルトの型は、自動の型判定処理の後でも型がない状態で残っている変数に対してのみ、与えられます。以下の例では、浮動小数点変数 x を伴う式内に存在するという理由から、パラメータ y および z には、浮動小数点型が与えられます。ここでは、デフォルトの型である整数型は割り当てられません。
>
|
f := proc(x::float, y, z) return x*y-y*z+x*z; end proc:
C(f, defaulttype=integer);
|
deducetypes=false オプションを用いて、自動の型判定システムを使用しないように設定することも可能です。以下の例では、今度はパラメータ y および z にデフォルトの型が与えられます。
>
|
C(f, defaulttype=integer, deducetypes=false);
|
coercetypes=false オプションを用いて、明示的な型の対応付けを行わないように設定することが可能です。
>
|
C(f, defaulttype=integer, deducetypes=false, coercetypes=false);
|
手続きの中、または式と共に declare オプションを用いることで、パラメータや局所変数の判定でどのような型が割り当てられるか、またどのように明示的に型を返すかについて、より多くの制御を行うことが可能となります。
>
|
C(1+x+y, declare=[x::float, y::integer]);
|
|
|
他の共通に使用されるオプション
|
|
以下の例では、optimize オプションは、Java への変換を行う前に、計算列の最適化を行うように指定しています。
>
|
cs := [s=1.0+x, t=ln(x)*exp(-x), r=exp(-x)+x*t]:
Java(cs, optimize);
|
CodeGeneration 関数は普通、書式化された結果を出力します。output=string オプションを用いて、返されるべき結果を含む文字列を指定することが可能です。output オプションは、結果をファイルに出力するためにも使用できます。
>
|
s := Java(log(x)+sin(y), output=string);
|
このワークシートには記述されていないオプションも、他にいくつか存在します。利用可能なオプションに関する情報については、CodeGeneration のオプション のヘルプページを参照して下さい。
|
|
|
他の Maple 関数と共に CodeGeneration を使用する例
|
|
他の Maple 関数と CodeGeneration の関数を組み合わせることで、特定の問題を解くための、しっかりとしたC, Fortran, Java のコードの一部をより簡単に作成することが可能です。2つの例題を以下に示します。
|
スプラインの例
|
|
CurveFitting[Spline] 関数を用いて、与えられる点のリストを通るような自然なスプライン曲線を作成します。
>
|
s := CurveFitting[Spline]([[0,0],[1,1],[2,4],[3,3],[4,2]], v);
|
unapply 関数を用いることで、結果の式である piecewise 関数を、手続きに変えます。そして piecewise 関数を "if" 文に変換するために、 codegen[prep2trans] 関数を使用します。 codegen[C] および codegen[fortran] 関数の使用はもう推奨されませんが、codegen パッケージにはまだ、CodeGeneration パッケージと組み合わせて使用することが可能な、有用なユーティリティがいくつか含まれています。
>
|
p := codegen[prep2trans](unapply(s, v));
|
この手続きを Fortran に変換します。この時、v は浮動小数点数のパラメータであると判定されるべきです。
>
|
Fortran(p, declare=[v::float]);
|
|
|
自動微分の例
|
|
手続き f を作成します。
>
|
f := proc(x::float, y::float)
local t::float;
t := exp(-x);
return y * t + t;
end proc:
|
codegen[GRADIENT] 関数を用いて、 f の勾配(偏導関数のベクトル)を計算します。
>
|
g := codegen[GRADIENT](f);
|
変換前に Maple のコードの最適化を行って、勾配を C に変換します。
|
|
Index for Example Worksheets に戻る
|