java - 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 添加自动尾调用优化。
据我所知,tail call 的工作还没有开始,因为 Fibers 和 Continuations 目前似乎是一个更高的优先级。
推荐阅读
- python-3.x - 在 anaconda python 3. Windows 10-64 上安装 Scapy
- java - 解决 SSLHandshakeException 后的 Java SSLPeerUnverifiedException
- android - 如何在 Android Studio 中添加带有从上到下文本的垂直按钮?
- java - 想要检查用户输入并相应地给出提示
- chart.js - Chart.js stepSize 不适用于 min
- wcf - 是否可以使用浏览器中的普通 netHttpBinding 创建到 WCF 服务的基于肥皂的 websocket 连接?
- iphone - 使用 iOS Web Inspector 调试问题
- angular - Angular Animation 在 IE11 和 Firefox 中没有过渡(在 Chrome 中工作)
- django - Django - super(ModelForm, self).clean() 没有引发 ValidationError
- node.js - 导入时强制转换类的名称以防止“不是构造函数”错误