具有尾递归优化的 C# 编译?

C# compilation with tail recursive optimization?

基于丰富的Whosebug,我一直在断断续续地回答尾递归优化是否针对特定的c#代码。一些问题似乎在谈论

  1. 正在发布的较新版本的 .net 中的优化推测
  2. 将应用程序构建为 x64 位应用程序以实现优化
  3. 在 Visual Studio 中从调试版本切换到发布版本以实现优化
  4. 根本没有优化,而且微软社区声称他们不会对 "security issues" 进行尾递归优化(没真正理解这个)
  5. 随机发生

那么从 C# 4.0 (Visual Studio 2013/2015) 开始,如果可以确保尾递归优化,如何确保它?

可以在不同级别支持尾调用优化。 JIT 实际上负责任何 .NET 程序中的大部分优化。 C# 编译器本身甚至不进行方法内联,这是 JIT 编译器的责任。 C# 编译器可以使用 Tailcall IL opcode designating a call as a tail call, however I believe no version of C# compiler does this. The JIT compiler is permitted to make tail call optimizations whenever it sees fit. In particular, I believe only the 64-bit JIT does this. This blog post 概述了 JIT64 无法使用尾调用优化的许多场景。我确信标准可能会发生变化,因为他们正在重写代号为 RyuJIT 的 JIT 编译器。

如果你想要一个可以使用 TCO 的程序的简短示例,试试这个:

class Program
{
    static void Main(string[] args)
    {
        Test(1);
    }

    private static void Test(int i)
    {
        Console.WriteLine(i);
        Test(i + 1);
    }
}

将项目设置为构建 Release/x64(或 AnyCPU w/o 更喜欢 32 位)并在不附加调试器的情况下启动。该程序将永远 运行。如果我不做所有这些事情,那么我会在 20947 左右收到一个 Whosebug 异常。