I found 这个问题 https://stackoverflow.com/questions/340762/which-languages-support-tail-recursion-optimization关于哪些语言优化尾递归。为什么 C# 尽可能不优化尾递归?
对于具体情况,为什么不将此方法优化为循环(Visual Studio 2008 http://en.wikipedia.org/wiki/Microsoft_Visual_Studio#Visual_Studio_200832 位,如果重要的话)?:
private static void Foo(int i)
{
if (i == 1000000)
return;
if (i % 100 == 0)
Console.WriteLine(i);
Foo(i+1);
}
JIT 编译是一种棘手的平衡行为,既不花太多时间进行编译阶段(从而大大减慢短期应用程序的速度),又不进行足够的分析以通过标准提前编译保持应用程序的长期竞争力。 。
有趣的是NGen https://en.wikipedia.org/wiki/Native_Image_Generator编译步骤并不是为了更积极地进行优化。我怀疑这是因为他们根本不希望出现错误,其中行为取决于 JIT 还是 NGen 是否负责机器代码。
The CLR https://en.wikipedia.org/wiki/Common_Language_Runtime本身确实支持尾调用优化,但是特定语言的编译器必须知道如何生成相关的opcode https://learn.microsoft.com/en-us/previous-versions/windows/silverlight/dotnet-windows-silverlight/56c08k0k(v=vs.95)?redirectedfrom=MSDNJIT 必须愿意尊重它。F#'s https://en.wikipedia.org/wiki/F_Sharp_(programming_language)fsc 将生成相关的操作码(尽管对于简单的递归,它可能只是将整个事情转换为while
直接循环)。 C# 的 csc 没有。
See 这篇博文 https://learn.microsoft.com/en-us/archive/blogs/davbr/一些细节(考虑到最近的 JIT 变化,现在很可能已经过时了)。请注意,4.0 中的 CLR 发生了变化x86、x64 和 ia64 将尊重它 https://learn.microsoft.com/en-us/archive/blogs/clrcodegeneration/tail-call-improvements-in-net-framework-4.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)