[解決済み] なぜ.NET/C#は末尾再帰を最適化しないのですか?
2022-09-16 20:37:59
質問
私は この質問 を見つけました。なぜC#は可能な限り末尾再帰を最適化しないのですか?
具体的な事例として、なぜこのメソッドはループに最適化されないのでしょうか ( Visual Studio 2008 32-bit, if that matters)?
private static void Foo(int i)
{
if (i == 1000000)
return;
if (i % 100 == 0)
Console.WriteLine(i);
Foo(i+1);
}
どのように解決するのですか?
JIT コンパイルは、コンパイル フェーズにあまり時間をかけない (したがって、短期間のアプリケーションを大幅に遅くする) ことと、標準の先行時間コンパイルで長期的にアプリケーションの競争力を維持するために十分な分析を行わないことのバランスを取るのが難しい作業です。
興味深いことに NGen のコンパイルステップでは、より積極的に最適化することを目標としていません。これは、JIT と NGen のどちらがマシン コードを担当したかに動作が依存するようなバグを発生させたくないだけなのでしょう。
その
CLR
自体はテールコールの最適化をサポートしますが、言語固有のコンパイラは、関連する
オペコード
を生成する方法を知っている必要があり、JIT はそれを尊重する必要があります。
F#の
fscは関連するオペコードを生成します(ただし、単純な再帰の場合は、全体を
while
ループに直接変換する)。C#のcscはそうではありません。
参照 このブログ記事 を参照してください (最近の JIT の変更からすると、かなり古くなっている可能性があります)。4.0 での CLR の変更に注意してください。 x86、x64、ia64 はそれを尊重します。 .
関連
-
[解決済み】スクリプトクラスが見つからないので、スクリプトコンポーネントを追加できない?
-
[解決済み] 'SubSonic.Schema .DatabaseColumn' 型のオブジェクトをシリアライズする際に、循環参照が検出されました。
-
[解決済み】aspNetCore 2.2.0 - AspNetCoreModuleV2 エラー
-
[解決済み】別のスレッドがこのオブジェクトを所有しているため、呼び出し側のスレッドはこのオブジェクトにアクセスできない
-
[解決済み] 末尾再帰とは何ですか?
-
[解決済み] テールコール最適化とは何ですか?
-
[解決済み] .NET String.Format()で数値の千の位にカンマを追加する
-
[解決済み] Collatz予想の検証を行うC++のコードは、なぜ手書きのアセンブリよりも高速に動作するのでしょうか?
-
[解決済み】Pythonは末尾再帰を最適化するか?
-
[解決済み] 末尾再帰最適化を行うC++コンパイラがあるとすれば、どのコンパイラですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C#はJavaのcharAt()と同等?)
-
[解決済み】値が期待した範囲に収まらない
-
[解決済み】EF 5 Enable-Migrations : アセンブリにコンテキストタイプが見つかりませんでした
-
[解決済み】Unity 「関連するスクリプトを読み込むことができません」「Win32Exception: システムは指定されたファイルを見つけることができません"
-
[解決済み】「...は'型'であり、与えられたコンテキストでは有効ではありません」を解決するにはどうすればよいですか?(C#)
-
[解決済み】値をNULLにすることはできません。パラメータ名:source
-
[解決済み】aspNetCore 2.2.0 - AspNetCoreModuleV2 エラー
-
[解決済み] [Solved] .NETでスレッドの終了を待つには?
-
[解決済み】プロセスが実行されているかどうかを知るには?
-
[解決済み】別のスレッドがこのオブジェクトを所有しているため、呼び出し側のスレッドはこのオブジェクトにアクセスできない