JVM是否阻止tail调用优化?

我在这个问题上看到了这样一句话: 什么是build立一个Web服务的好的函数式语言?

除了在自recursion函数中,Scala特别不​​支持tail-call消除,这限制了你可以做的组合types(这是JVM的一个基本限制)。

这是真的? 如果是这样的话,JVM是什么造成了这个基本的限制呢?

这篇文章: recursion或迭代? 可能会有帮助

简而言之,由于安全模型和始终需要堆栈跟踪的需要,JVM中的尾部调用难以做到。 这些要求理论上可以得到支持,但可能需要一个新的字节码(参见John Rose的非正式提案 )。

Sun错误#4726340中还有更多的讨论,评估(从2002年开始)结束:

我相信这可以做,但这不是一个小任务。

目前, 达芬奇机器项目正在进行一些工作。 尾调用子项目状态列为“原80%”; 它不太可能成为Java 7,但我认为它在Java 8中有很好的机会。

根本的限制就是JVM不在其字节代码中提供尾调用,因此,build立在JVM上的语言本身没有直接的方式提供尾调用。 有一些解决方法可以达到类似的效果(例如蹦床),但是它们的性能非常糟糕,并且模糊了生成的中间代码,使得debugging器无用。

所以JVM不能支持任何产品质量的函数式编程语言,直到Sun在JVM中实现tail调用。 他们多年来一直在讨论这个问题,但是我怀疑他们会不会实现tail调用:这将会非常困难,因为他们在实现这些基本function之前就过早地优化了虚拟机,Sun的工作强调的是dynamic语言而不是function语言。

因此,有一个非常强烈的论据认为Scala不是一个真正的函数式编程语言:自从30年前计划被首次引入以来,这些语言就把尾部调用看作是一个基本特征。

Scala 2.7.x支持最终方法和本地函数的自recursion(自我调用函数)的尾调优化。

Scala 2.8也可能带有对蹦床的库支持,这是一种优化相互recursionfunction的技术。

关于Scalarecursion状态的大量信息可以在Rich Dougherty的博客中find 。

除了Lambda The Ultimate(来自上面链接的链接)链接的论文之外,来自Sun的John Rose还有一些关于尾部呼叫优化的内容。

http://blogs.oracle.com/jrose/entry/tail_calls_in_the_vm

我听说有一天它可能会在JVM上实现。 达芬奇机器正在研究尾巴呼叫支持等。

http://openjdk.java.net/projects/mlvm/

所有的资源都指向JVM在尾recursion的情况下无法优化,但是在阅读Java性能优化 (2003,O'reilly)之后,我发现作者声称他可以通过实现尾recursion来获得更大的recursion性能。

你可以在第212页find他的主张(search“尾recursion”应该是第二个结果)。 是什么赋予了?