Java 中的尾部调用优化

2024-01-04

从 Java 8 开始,Java 不提供尾部调用优化 (TCO)。 经过研究,我了解到这是:

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

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

PS:不确定 Java 的最新版本(Java 11 目前)是否有 TCO。如果有知道的朋友也能分享一下就太好了。

Notes:

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

  2. Java 没有尾部调用优化,其原因与大多数命令式语言没有尾部调用优化的原因相同。命令式循环是该语言的首选样式,程序员可以用命令式循环替换尾递归。 (Source https://softwareengineering.stackexchange.com/questions/272061/why-doesnt-java-have-optimization-for-tail-recursion-at-all/272082#272082)


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

我不能说which将使用方法,但它的更好解释是Loom 项目的提案 http://cr.openjdk.java.net/~rpressler/loom/Loom-Proposal.html:

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

据我所知,尾部调用的工作尚未开始,因为 Fibers 和 Continuations 目前似乎具有更高的优先级。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 中的尾部调用优化 的相关文章

随机推荐