私はこの言語にはかなり新しいので、テールコールが最適化されているかどうかは疑問でした。他の言語では、機械コードや中間表現を調べて自分自身で判断することができますが、PL/SQLでそれを行う方法についてはわかりません。PL/SQLはテール・コールの最適化を実行しますか?
ありがとうございます。
私はこの言語にはかなり新しいので、テールコールが最適化されているかどうかは疑問でした。他の言語では、機械コードや中間表現を調べて自分自身で判断することができますが、PL/SQLでそれを行う方法についてはわかりません。PL/SQLはテール・コールの最適化を実行しますか?
ありがとうございます。
オンラインドキュメントはありませんお勧め:
http://download-east.oracle.com/docs/cd/B19306_01/appdev.102/b14261/subprograms.htm#i2884
各再帰呼び出しは、パラメータ、 変数、カーソル、例外など サブプログラムで宣言されているすべての項目の新しい インスタンスを作成します。 同様に、SQL ステートメントの新しいインスタンスは、再帰的な降下の各レベル で作成されます。
そして:
少なくとも1つのパス 終了条件になる必要があります。そうでない場合は、PL/SQL が不足し、 の事前定義された例外STORAGE_ERRORが発生するまで、 再帰が実行されます。
末尾呼び出しの最適化が利用可能であった場合は(あなたはそれが長すぎるために実行してみましょう場合、それはいくつかのタイムアウトを打つかもしれませんが。)、それはストレージが不足していないでしょう
あなたは、実験的に何を見ることができるかもしれません自分自身にテールコールで終了する再帰関数を作成し、呼び出したときにOracleプロセスのメモリ使用量を観察するか、または取得したエラーメッセージを確認します。メモリを増やすことなく無期限にハングアップできるかどうかを確認してください。
私はシンプルな階乗をコーディングして、自分のワークステーションで実行されているOracle XE上で実行すると、仮想メモリが使い果たされているので、正しいと思われます。どうもありがとう。 ところで、Oracleからどんな種類のアセンブラを入手することは可能ですか? – Samuel
私はPL/SQLは主に解釈されると思います。 –
PL/SQLは新しいバージョンで解釈またはコンパイルできます。あなたが本当に低レベルを取得したい場合は、PRO * Cでプログラミングを試すことができます。 –