Java中的尾调用优化
从Java
8开始,Java不提供尾叫优化(TCO)。经过研究,我知道原因是:
在JDK类中,有许多对安全性敏感的方法,它们依赖于对JDK库代码和调用代码之间的堆栈帧进行计数,以确定谁在调用它们。
但是,基于JVM的Scala支持尾叫优化。Scala在编译时进行尾递归优化。Java为什么不能使用相同的方法?
PS:不确定Java的最新版本(截至现在的Java 11)是否具有TCO。如果知道的人也可以分享这一点,那就太好了。
笔记:
我知道TCO处于积压状态,并且优先级较低,但是想知道为什么Java无法像Scala那样在编译时进行更改。
Java没有尾调用优化,原因与大多数命令式语言没有的原因相同。命令式循环是该语言的首选样式,程序员可以用命令式循环代替尾部递归。(来源)
回答:
Java为什么不能使用相同的方法?
我不能说将使用 哪种 方法,但是在Project
Loom的提案中有更好的解释:
毫无疑问,由于需要向JVM添加操作调用堆栈的功能,因此,本项目的目标也是添加更轻量级的结构,以允许将堆栈展开到某个点,然后调用具有给定参数的方法(基本上是有效的尾调用的概括)。我们将称该功能为“展开并调用”或UAI。向JVM添加自动尾部调用优化不是该项目的目标。
据我所知,关于尾音的工作尚未开始,因为“光纤和连续性”似乎是当前的重中之重。
以上是 Java中的尾调用优化 的全部内容, 来源链接: utcz.com/qa/408321.html