我自己从scala编译器源代码构建一个scala编译器。在编译器的源代码中,有许多尾递归函数/方法。从scala编译器的源代码构建scala编译器也需要编译编译器本身的源代码。如果我在编译源代码期间添加选项-g:notailcalls
以关闭尾部递归优化,则在运行构建的编译器时将出现堆栈溢出错误。
总之,在一个有很多递归调用的大型复杂scala程序中,编译时省略尾递归优化是否可能导致运行时堆栈溢出错误?
当然可以。但是请注意Scala能够自己判断函数是否是尾部递归的,你不需要传递@tailrec
注释给函数。
然而,scala无法将合适的函数转换为尾递归形式。您必须手动执行此操作,但并非每个函数都可以以这种方式转换。