scala中没有尾递归优化时堆栈溢出?
Stack overflow when no tail-recursion optimization in scala?
我正在自己从 scala 编译器源代码构建一个 scala 编译器。在编译器的源代码中,有很多尾递归functions/methods。从源代码构建 scala 编译器也需要编译编译器本身的源代码。如果我在编译源代码时添加选项-g:notailcalls
关闭尾递归优化,运行编译内置编译器时会出现statck溢出错误。
总而言之,在递归调用较多的大而复杂的scala程序中,编译时遗漏了尾递归优化会不会在运行时导致堆栈溢出错误?
当然可以。但请注意,Scala 能够自行判断函数是否为尾递归,您无需将 @tailrec
注释传递给函数。
但是,scala 无法将合适的函数转换为其尾递归形式。您必须手动执行此操作,但并非所有功能都可以通过这种方式进行转换。
我正在自己从 scala 编译器源代码构建一个 scala 编译器。在编译器的源代码中,有很多尾递归functions/methods。从源代码构建 scala 编译器也需要编译编译器本身的源代码。如果我在编译源代码时添加选项-g:notailcalls
关闭尾递归优化,运行编译内置编译器时会出现statck溢出错误。
总而言之,在递归调用较多的大而复杂的scala程序中,编译时遗漏了尾递归优化会不会在运行时导致堆栈溢出错误?
当然可以。但请注意,Scala 能够自行判断函数是否为尾递归,您无需将 @tailrec
注释传递给函数。
但是,scala 无法将合适的函数转换为其尾递归形式。您必须手动执行此操作,但并非所有功能都可以通过这种方式进行转换。