首页 > 解决方案 > Java 中的尾调用优化

问题描述

从 Java 8 开始,Java 不提供尾调用优化 (TCO)。在研究它时,我开始知道原因是:

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

然而,基于 JVM 的 Scala 支持尾调用优化。Scala 在编译时进行尾递归优化。为什么 Java 不能使用相同的方法?

PS:不确定Java的最新版本(截至目前的Java 11)现在是否具有TCO。如果知道的人也可以分享一下,那就太好了。

笔记:

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

  2. Java 没有尾调用优化,原因与大多数命令式语言没有它的原因相同。命令式循环是该语言的首选风格,程序员可以用命令式循环代替尾递归。(来源

标签: javarecursioncompilationjvmtail-recursion

解决方案


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

我不能说将使用哪种方法,但在Project Loom 的提案中对此进行了更好的解释:

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

据我所知,tail call 的工作还没有开始,因为 Fibers 和 Continuations 目前似乎是一个更高的优先级。


推荐阅读