Java中的尾调用优化

Ris*_*wal 9 java recursion jvm tail-recursion compilation

Java 8开始,Java不提供Tail-Call Optimization(TCO).在研究它时,我开始知道原因是:

在jdk类中,有许多安全敏感方法依赖于计算jdk库代码和调用代码之间的堆栈帧来确定谁在调用它们.

但是,基于JVM的Scala支持Tail-Call Optimization.Scala在编译时进行尾递归优化.为什么Java不能使用相同的方法?

PS:不确定Java的最新版本(现在的Java 11)现在是否具有TCO.如果有些知道的人也能分享这个,那就太好了.

注意

  1. 我知道TCO处于积压状态并且优先级较低,但是想知道为什么Java在编译时不能像Scala那样进行更改.

  2. 由于大多数命令式语言都没有Java,因此Java没有尾调用优化.命令式循环是该语言的首选样式,程序员可以用命令式循环替换尾递归.(来源)

Jon*_*gel 17

我在这里阅读了一篇关于如何在 Java 中实现尾递归的非常好的博客文章: Knoldus blog post on Java tail recursion

但是,他们博客上的代码无法编译,因此我用他们的代码创建了一个小型存储库,但修复了语法以便可以编译。 包含工作代码的 Github 存储库

希望这对某人有用,我发现 Knoldus 博客文章中提出的想法非常有趣。

编辑:实际上我后来发现博客文章中提出的想法最初是 Venkat Subramaniam 的。他在这里的演讲中讨论了这些主题。


Jac*_* G. 7

Java为什么不能使用相同的方法?

我不能说将使用哪种方法,但是在Project Loom的提案中有更好的解释:

毫无疑问,由于需要向JVM添加操作调用堆栈的功能,因此该项目的目标也是添加更轻量级的结构,该结构将展开堆栈到某个点,然后调用具有给定参数的方法(基本上是有效的尾调用的概括)。我们将其称为展开和调用功能,即UAI。向JVM添加自动尾部调用优化不是该项目的目标。

据我所知,关于“尾随”的工作尚未开始,因为“纤维和连续性”似乎是当前的重中之重。

  • 任何更新?JVM 中的 TCO 是人们期待已久的。 (4认同)