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.如果有些知道的人也能分享这个,那就太好了.
注意
我知道TCO处于积压状态并且优先级较低,但是想知道为什么Java在编译时不能像Scala那样进行更改.
由于大多数命令式语言都没有Java,因此Java没有尾调用优化.命令式循环是该语言的首选样式,程序员可以用命令式循环替换尾递归.(来源)
Jon*_*gel 17
我在这里阅读了一篇关于如何在 Java 中实现尾递归的非常好的博客文章: Knoldus blog post on Java tail recursion
但是,他们博客上的代码无法编译,因此我用他们的代码创建了一个小型存储库,但修复了语法以便可以编译。 包含工作代码的 Github 存储库
希望这对某人有用,我发现 Knoldus 博客文章中提出的想法非常有趣。
编辑:实际上我后来发现博客文章中提出的想法最初是 Venkat Subramaniam 的。他在这里的演讲中讨论了这些主题。
Java为什么不能使用相同的方法?
我不能说将使用哪种方法,但是在Project Loom的提案中有更好的解释:
毫无疑问,由于需要向JVM添加操作调用堆栈的功能,因此该项目的目标也是添加更轻量级的结构,该结构将展开堆栈到某个点,然后调用具有给定参数的方法(基本上是有效的尾调用的概括)。我们将其称为展开和调用功能,即UAI。向JVM添加自动尾部调用优化不是该项目的目标。
据我所知,关于“尾随”的工作尚未开始,因为“纤维和连续性”似乎是当前的重中之重。
归档时间: |
|
查看次数: |
1090 次 |
最近记录: |