从Java 8开始,Java不提供尾叫优化(TCO).通过对它的研究,我了解了原因,即:
在JDK班..。有许多安全敏感的方法依赖于计算JDK库代码和调用代码之间的堆栈帧来确定谁在调用它们。
然而,基于JVM的Scala支持尾部调用优化。Scala在编译时进行尾递归优化。为什么Java不能使用相同的方法呢?
PS:不确定Java的最新版本(截至目前的Java 11 )是否有TCO。如果一些知道的人也能分享这一点,那就太好了。
备注:
发布于 2018-11-17 19:50:12
为什么Java不能使用相同的方法呢?
我不能说将使用哪种方法,但在项目织机的建议中解释得更好
由于向JVM添加操作调用堆栈的能力无疑是必需的,这个项目的目标也是添加一个更轻量级的构造,允许将堆栈展开到某个点,然后调用带有给定参数的方法(基本上是高效尾调用的泛化)。我们将把这一特性称为展开和调用,即UAI。这个项目的目标不是为JVM添加一个自动的尾叫优化。
据我所知,关于尾叫的工作还没有开始,因为纤维和延续性目前似乎是一个更高的优先事项。
发布于 2018-12-14 23:00:29
我在这里读到了一篇关于如何在Java:Knoldus博客上关于Java尾部递归的文章中实现尾递归的非常好的博客文章。
但是,他们的博客上的代码没有编译,所以我用他们的代码创建了一个小回购,但是修改了语法,这样就可以编译了。带有工作代码的Github回购
希望这对某人有用,我发现在Knoldus博客文章中提出的想法非常有趣。
编辑:事实上,后来我发现博客文章中的观点最初是Venkat的,他在他的talk 这里中讨论了这些主题。
https://stackoverflow.com/questions/53354898
复制相似问题