CodeGeneration パッケージを用いたコード変換に関する注意事項
|
名前の変換
|
|
•
|
通常、入力コードで使われる名前は出力にそのまま使われます。提供されたトランスレータは、入力の中の名前が変換先言語の識別子としての条件を満たしているかチェックを実行します。しかし、このようなチェックは完全ではあり得ないため、変換先言語のキーワードに相当する名前を使用した場合、予期せぬ結果を招くことがあります。
|
•
|
結果と戻り値(戻り値の変数を新しく作成する必要がある場合)の名前は resultname および returnvariablename のオプション指定することができます。
|
•
|
CodeGeneration では、次の名前を特別なものと認識します: Pi, gamma, Catalan, true, false
|
|
|
言語の構成要素の変換
|
|
•
|
モジュールに対するサポートは限られています。変換先言語によっては Maple モジュールに似た構成要素を持たないものもあります。そのような場合、モジュールは一番近いものに変換されます。モジュールの型の解析と推論はプロシージャのそれほど信頼性が高くありません。特に、モジュールのローカルおよびエクスポートの宣言における型アサーションは、作成されたインスタンスのローカルやエクスポートの解析に必ずしも適用されません。
|
•
|
反復命令文の変換のサポートは完全ではありません。CodeGeneration は for-in ループを変換できません。for ループと while ループは変換できますが、条件に for と while が混在するループは変換できません。
|
•
|
try 文と、if 命令の演算子形をサポートしていない変換先言語があります。
|
•
|
複合割り当ての変換のサポートは限られています。左辺と右辺は同数の要素を含む式列でなければなりません。同時割り当てをサポートしていない変換先言語に対しては、式列で現れる要素の順序に従い一連の割り当て文を生成します。
|
|
|
型の変換
|
|
•
|
CodeGeneration パッケージは Maple の numeric、float、sfloat、integer の各型を認識します。最初の 3 つの型は CodeGeneration により同等と認識され、浮動小数型に変換されます。また、CodeGeneration は、要素が前述の型のどれかであるような Maple の Array と rtable の型も認識します。ここに挙げた型は、どれも変数の宣言(declare オプションによるものを含む)に用いることができます。
|
•
|
CodeGeneration パッケージは、positive、negative、nonpositive、nonnegative、extended_numeric の各型を含んだ型宣言を受け付けます。ただし、これらは numeric と等価と見なされ、変換先言語ではみな同じ浮動小数点型に変換されます。posint、negint、nonnegint、nonposint の各型も integer と見なされ受け付けられます。
|
•
|
CodeGeneration パッケージは、限られた状況下で他の型の Maple オブジェクトも認識します。有理数は浮動小数の比に変換されます。文字列はエラー文や一部関数内で認識されます。選択文や反復文内に出てくる Boolean 型も認識されます。これらの型は、一般的には CodeGeneration に認識されません。
|
•
|
変数の宣言に現れる型名が認識されないと、既知の型が自動的に割り当てられ警告が発せられます。割り当てる型は、可能な場合は前後関係より推定され、それができない場合はデフォルトの型が与えられます。
|
•
|
CodeGeneration 関数は、異なる型を伴う演算が変換先言語に変換できることを確認します。型が両立しない場合、可能な場合一方の型を強制的に他方の型に変換します。型の整合性が取れない場合、さらに入力を変換する試みが行われ、警告が発せられます。
|
•
|
単精度と倍精度の間の陽な変換は行われません。従って、単精度・倍精度の間の自動的な変換をサポートしない言語に変換する場合、注意が必要なことがあります。
|
|
|
自動的な型推論
|
|
•
|
CodeGeneration は、型指定の無い変数すべてについて、前後関係から型推論を試みます。例えば、型指定の無い変数に整数が割り当てられる場合、型指定の無い変数は整数型と見なされます。型が推論できない場合は、デフォルトの型が割り当てられます。
|
•
|
大域変数には型推論を行いません。これは、大域変数の有効範囲が変換されるべきコードよりも広いため、コードがその変数の型を推論するための情報を十分に含んでいないためです。
|
•
|
この型推論システムの能力は限られたもので、予期せぬ結果を得ることもあります。例えば、型指定の無い変数は Maple 命令文が解析されると同時に型指定されて行き、過去に行った指定を遡って修正することはありません。次の例では、 は最初の割り当てで整数型とされますが、2 回目の割り当てで が浮動小数型であるべきであることが分かります。
|
>
|
CodeGeneration[C]([x=1, x=2.0]);
|
•
|
型推論システムの動作を変えたり機能そのものを無効にするため、オプションがいくつかあります(機能を無効にすると型指定無しの変数は全てデフォルトの型となります)。このようなオプションには、coercetypes、declare、deducetypes、defaulttype があります。
|
|
|
リターン文と暗黙リターンの変換
|
|
•
|
プロシージャの戻り値の型は、ユーザによる宣言が無い場合推論されます。複数のリターン文がある場合は、戻される全オブジェクトの型が互換性のあるものでなければなりません。ひとつのリターン文が 2 つ以上のオブジェクトの列を含むとき、その列は配列に変換されます。
|
•
|
Maple プロシージャにおける暗黙リターンは、場合により認識されます。必要な場合、戻り値は自動的に生成される戻り変数に割り当てられます。暗黙リターンから明示リターンへの変換は deducereturn=false により無効にできます。
|
•
|
配列を直接返せない言語もあります。このような場合、自動的に生成された戻り変数に配列がコピーされます。その変数は、関数の出力パラメータと見なされ、パラメータリストに追加されます。expandarrays オプションを使うと配列のコピーの変換方法を指定できます。CodeGeneration は、配列が関与するリターン文の変換を完全にはサポートしておらず、場合により生成されたコードを変更する必要があるので注意してください。
|
•
|
自動的に生成されるリターン変数の名前は returnvariablename オプションで指定できます。
|
|
|
関数の変換
|
|
•
|
トランスレータの詳細ヘルプページに別途明記されている場合を除いて、 CodeGeneration トランスレータは次の関数を認識します: sin、 cos、 tan、 csc、 sec、 cot、 arcsin、 arccos、 arctan、 arccsc、 arcsec、 arccot、 sinh、 cosh、 tanh、 csch、 sech、 coth、 arcsinh、 arccosh、 arctanh、 arccsch、 arcsech、 arccoth、 abs、 exp、 ln、 log、 log10、 sqrt、 round、 trunc、 signum、 sign、 max、 min、 irem、 mod、 modp、 mods、 evalf、 evalhf、 print、 printf。認識されない関数名は変換後もそのまま使用します。
|
•
|
eval、iquo の両関数については、引数の型の認識が限られているため部分的な変換しかできません。
|
•
|
各関数は、変換先言語または標準の外部ライブラリで最も近いものに変換されます。同一のものがない場合は、CodeGeneration は変換先言語で利用できる関数を簡潔に組み合わせて相当する機能を構築するか、エラーを発します。例えば、arcsinh などの双曲線三角関数の逆関数は、対数や平方根を用いた式に変換されます。
|
•
|
eval 関数は認識されますが、その引数は計算せずそのまま変換されます。evalf および evalhf へのコールは変換先言語の float 操作のみに変換され、変換先言語では Digits の設定は無視され、ハードウェア・ソフトウェアの浮動小数の区別はされません。
|
|
|
配列の変換
|
|
•
|
このセクションでは、「配列」という言葉は、1 つまたは複数の整数によりインデックスされたデータ構造という一般的な意味で用います。Maple の配列構造を指すときは「Maple 配列」ということにします。rtable は Maple の rtable データ構造を指し、配列のほか行列・ベクトル構造も含みます。
|
•
|
CodeGeneration 関数は Maple 配列や rtable を変換先言語の配列に変換できます。しかし、配列に対する型の解析と推論の能力はごく限られています。例えば、CodeGeneration は各要素の情報から配列全体の型を推定することはできません。強制型変換や配列の代入は完全にはサポートされていません。また、CodeGeneration は集合を認識しません。
|
•
|
CodeGeneration の諸関数は、プロシージャ中の rtable の型宣言やコンストラクタの一部を解析できます。データの型、次元、レンジは認識されますが、ほとんどのオプションは無視されます。初期化子としてはリストだけが許されます。次元とレンジは整数値のみ許され、非整数で次元が指定されたコンストラクタは現在はサポートされていません(例えば Vector(n)、ただし n はプロシージャのパラメータ)。インデックスは、必要であれば変換先言語との互換性を確保するために振りなおされます。
|
•
|
最大限の性能を得るため、全ての配列の型とレンジを宣言することを推奨します。これは、プロシージャ中の宣言(パラメータ、局所、大域)または declare オプションを使って行います。
|
•
|
入力が Maple 配列または rtable の場合、入力値を変換先言語の配列に要素ごとに割り当てる命令を生成します。ただし、この割り当てには入力オブジェクトの初期化された要素だけが含まれます。必要であれば、配列を初期化するためのコードを変換先言語出力に追加してください。
|
•
|
場合により、リストは配列に変換されます。どのようなネスティングレベルのリストでも、サブリストの長さが全て一致しているときに限り変換先言語の多次元配列に変換することができます。リストが初期化子として利用されている場合、その次元は宣言された次元と一致していなければなりません。リストが判別不能な文脈で現れる場合は、そのまま変更されずに残ります。
|
•
|
配列から配列へのコピーは、変換先言語が配列のコピーをサポートしていない場合要素ごとの割り当てとして変換されます。expandarrays=false のオプションを用いると、この動作を無効にできます。この場合は、配列名から配列名への単純な代入とされるので、変換後のコードを適宜変更してください。
|
|
|
最適化その他の Maple コードの変換
|
|
•
|
optimize オプションは、コードの最適化を指定するのに用います。
|
•
|
optimize オプションは、プロシージャや計算シーケンスで使用するためのものです。入力がモジュールのときは作用がありません。
|
|
|
効率
|
|
•
|
CodeGeneration 関数を用いた変換は、実行時間とメモリを沢山必要とする場合がよくあります。通常、変換しようとしている Maple コードは全体的に解析され、可能な限り正確な変換をすべく何回かに分けて変換されます。一方、reduceanalysis オプションを使えば、計算シーケンスを変換する際に必要となるリソースを大幅に削減することができます。この場合、計算シーケンスはシーケンスとしてではなく代入文ひとつごとに解析されます。このオプションはプロシージャとモジュールには該当しないことに注意してください。
|
|
|
エラー報告
|
|
•
|
内部的には、CodeGeneration 関数は Maple 入力の不活性表現(ToInert および FromInert 参照)に作用します。エラーや警告が発生する場合、CodeGeneration パッケージはそのメッセージを誘発した元の Maple 式を見つけ、そのエラー・警告の詳細なメッセージを返そうとします。これが出来ない場合、発生した問題の一般的記述を、該当すれば不活性表現と共に報告します。
|
•
|
エラーが発生したときは、infolevel[CodeGeneration] を変えることで userinfo 命令文により原因の詳細情報を取得できます。
|
|
|
Download Help Document
Was this information helpful?