为什么Scala编译器不应用尾部调用优化,除非方法是最终的? 例如,这个: class C { @tailrec def fact(n: Int, result: Int): Int = if(n == 0) result else fact(n – 1, n * result) } 结果是 错误:无法优化@tailrec注释的方法:它既不是私有也不是最终的,因此可以被覆盖 如果编译器在这种情况下应用TCO ,究竟会出现什么问题呢?
出于好奇,我试图用C#生成一个尾调用操作码。 斐波纳契是一个很容易的,所以我的c#例子看起来像这样: private static void Main(string[] args) { Console.WriteLine(Fib(int.MaxValue, 0)); } public static int Fib(int i, int acc) { if (i == 0) { return acc; } return Fib(i – 1, acc + i); } 如果我在发行版中构build它,并且在不进行debugging的情况下运行,我不会发生堆栈溢出。 debugging或运行它没有优化,我确实得到一个堆栈溢出,这意味着在优化(这是我所期望的)发布时,尾部调用正在工作。 这个MSIL看起来像这样: .method public hidebysig static int32 Fib(int32 i, int32 acc) cil managed { // Method Start RVA 0x205e […]