codegen[C] - C 言語のソースコードの生成
使い方
C(s)
C(s,options)
パラメータ
s - 式、式の配列、方程式のリスト、または手続き
|
説明
|
|
•
|
C 関数は入力を評価する C言語のソースコードを生成します。入力 s は以下のいずれかでなければなりません: 単一の代数式、代数式の配列、name = algebraic の形の等式のリスト(これは代入文の列と解釈されます。)、または Maple の手続き。配列に名前が付けられてなければ、名前 unknown が用いられます。残りの引数はオプションであり、以下のように記述されます。Maple の手続きの C言語への翻訳に関するヘルプは、codegen/C/procedure を参照してください。注意 : 型宣言は Maple の手続きに対してのみ与えられます。他の生成された C言語のソース・コードは C言語サブルーチンまたはメイン・プログラムのなかに置かれます、ここで型宣言はユーザによって補われなくてはいけません。
|
•
|
filename オプション:デフォルトにおいて、出力は標準出力に送られます。ユーザが対話的に C コマンドを用いるのならば、出力は端末画面に現れます。filename = "f.c" の形の付加的な引数により出力をファイル f.c に書き込むことができます。
|
•
|
optimized オプション:キーワード optimized が付加的な引数として指定されると、共通部分式の最適化を行ないます。結果は、一時的な値が文字 t で始まる局所変数にストアされる代入文の列となります。この目的のため、C によって大域変数名 t0, t1, t2, ... はリザーブされています。オプティマイザーへの入力はある条件を満足しなければなりません。より詳しい情報は codegen/optimize を参照してください。
|
•
|
precision オプション:オプション引数 precision=single または precision=double は浮動小数点変数および浮動小数点定数を生成する際、単精度または倍精度のいずれが用いられるかを指定します。デフォルトは、mode=single オプションが与えられているとき単精度で、そうでなければ倍精度です。
|
•
|
mode オプション:オプション引数 mode=single または mode=double は単精度または倍精度いずれの数学関数名が生成されるかを指定します。precision=single オプションが与えられていても、デフォルトは倍精度です。(結果的に標準数学関数ライブラリにおける名前となります。)
|
•
|
digits オプション:整数、分数、そして Pi のような記号など浮動小数点形式でない Maple の定数は evalf を用いることにより浮動小数点定数に変換されますが、この際、例えば sqrt などの実数関数への引数が必要となります。デフォルトで、単精度に対して 7、倍精度に対して 16 が用いられます。またオプション引数 digits = n を指定することによって n に設定することができます。
|
•
|
ansi オプション:入力が Maple の手続きの場合、デフォルトで、パラメータ宣言は旧式 (Kernighan & Ritchie 方式) の C言語コンパイラー規則に従います。このオプションが与えられれば、パラメータ宣言は ANSI C 方式の規則に従います。例の節の最後の例を見てください。
|
•
|
declarations オプション:付加的な引数 declarations = x::t が与えられると、翻訳において変数 x は型 t として与えられます。Maple の手続きの翻訳に関するより詳細なヘルプは codegen/C/procedure を見てください。
|
•
|
parameters、locals、および globals オプション: s が計算列(方程式のリスト)ならば、デフォルトで、C は方程式の左辺のすべての変数を、計算列より取り除くことができない大域変数と仮定します。これらのオプションは別の状況を指定するために用いられます。局所変数は C トランスレータにより式列より取り除かれるかもしれません。
|
•
|
配列 (Maple のベクトル、行列、および他の配列) を翻訳する際、C関数は、C言語の要請により、配列の添え字を 0 から始まるインデックスに付け直します。配列が値の代入されていないエントリーを含むと、C言語ソース・コードにおいて出力される値は文字列 undefined となります。
|
•
|
C トランスレータはある種の Maple 関数を C言語における等価物に翻訳します。知られている関数を以下に列挙します。例えば、sin(x) + sec(x) は倍精度モードにおいて sin(x)+1/cos(x)、単精度モードにおいて sinf(x)+1/cosf(x) に翻訳されます。ある関数を C トランスレータによって扱えない場合、ユーザは情報を受け、関数はそのように翻訳されます。
|
•
|
C トランスレータによって理解される Maple の浮動少数点関数は abs(x), signum(x), min(x,y), max(x,y), sqrt(x), ceil(x), round(x), trunc(x), ln(x), exp(x), erf(x), と三角関数、双曲線関数、およびそれらの逆関数です。また、理解される Maple の整数関数は abx(s), min(a,b), max(a,b), signum(a), irem(a,b), iquo(a,b), modp(a,p) です。
|
•
|
関数 Cは C言語ソースコードを副作用として生成し、関数の値としては NULL を返します。従って、ディット・コマンド(% および %%)は C コマンドによって出力を呼び戻しません。
|
•
|
with(codegen,C) コマンドはこのコマンドの短縮形の使用を可能にします。
|
|
|
例
|
|
>
|
with(codegen,C):
f := 1-x/2+3*x^2-x^3+x^4;
|
| (2.1) |
t0 = 1.0-x/2.0+3.0*x*x-x*x*x+x*x*x*x;
| |
t2 = x*x;
t5 = t2*t2;
t6 = 1.0-x/2.0+3.0*t2-t2*x+t5;
| |
>
|
f := Pi*ln(x^2)-sqrt(2)*ln(x^2)^2;
|
| (2.2) |
t1 = x*x;
t2 = log(t1);
t4 = sqrt(2.0);
t5 = t2*t2;
t7 = 0.3141592653589793E1*t2-t4*t5;
| |
>
|
cs := [s = 1+x, t = ln(s)*exp(-x), r = exp(-x)+x*t ];
|
| (2.3) |
s = 1.0+x;
t1 = log(s);
t2 = exp(-x);
t = t1*t2;
r = t2+x*t;
| |
>
|
C( cs, optimized, locals=[s,t,r] );
|
t1 = log(1.0+x);
t2 = exp(-x);
r = t2+x*t1*t2;
| |
>
|
v := array([exp(-x)*x,exp(-x)*x^2]):
C(v,optimized);
|
t1 = exp(-x);
t3 = x*x;
v[0] = t1*x;
v[1] = t1*t3;
| |
定義されないエントリーを持つ行列
>
|
A := array(1..2,1..2,symmetric):
A[1,1] := log(x): A[1,2] := 1-log(x):
print(A);
|
| (2.4) |
A[0][0] = logf(x);
A[0][1] = 1.0-logf(x);
A[1][0] = 1.0-logf(x);
A[1][1] = (0.0/0.0);
| |
t1 = log(x);
t2 = 1.0-t1;
A[0][0] = t1;
A[0][1] = t2;
A[1][0] = t2;
A[1][1] = (0.0/0.0);
| |
宣言を持つ簡単な手続き
>
|
f := convert(1-3*x^2-2*x^3+x^4,horner);
|
| (2.5) |
>
|
f := unapply(f,x); # Make the expression into a procedure
|
/* The options were : operatorarrow */
double f(x)
double x;
{
{
return(1.0+(-3.0+(-2.0+x)*x)*x*x);
}
}
| |
/* The options were : operatorarrow */
double f(double x)
{
{
return(1.0+(-3.0+(-2.0+x)*x)*x*x);
}
}
| |
|
|