截至Java 8,Java不提供尾调用优化(TCO)。在研究它时,我了解到原因:
在JDK类中[...]有许多安全敏感的方法,这些方法依靠计算JDK库代码和调用代码之间的堆栈帧数量来确定谁在调用它们。
然而基于JVM的Scala支持尾调用优化。Scala在编译时进行尾递归优化。为什么Java不能采用相同的方法?
PS:不确定最新版本(目前是Java 11)是否具有TCO。如果有人知道,能够分享一下就好了。
注意事项:
1. 我知道TCO处于积压状态,并且优先级较低,但想知道为什么Java不能像Scala那样在编译时进行更改。
2. Java没有尾调用优化的原因与大多数命令式语言没有它的原因相同。命令式循环是该语言的首选风格,程序员可以用命令式循环替换尾递归。(来源)
在JDK类中[...]有许多安全敏感的方法,这些方法依靠计算JDK库代码和调用代码之间的堆栈帧数量来确定谁在调用它们。
然而基于JVM的Scala支持尾调用优化。Scala在编译时进行尾递归优化。为什么Java不能采用相同的方法?
PS:不确定最新版本(目前是Java 11)是否具有TCO。如果有人知道,能够分享一下就好了。
注意事项:
1. 我知道TCO处于积压状态,并且优先级较低,但想知道为什么Java不能像Scala那样在编译时进行更改。
2. Java没有尾调用优化的原因与大多数命令式语言没有它的原因相同。命令式循环是该语言的首选风格,程序员可以用命令式循环替换尾递归。(来源)