我在这个问题上看到了以下引用:什么是适合构建Web服务的好的函数式语言?
特别是在Scala中,尾递归消除只在自递归函数中支持,这限制了你可以做哪些组合(这是JVM的根本局限)。
这是真的吗?如果是的话,是什么让JVM产生了这种根本性的限制?
我在这个问题上看到了以下引用:什么是适合构建Web服务的好的函数式语言?
特别是在Scala中,尾递归消除只在自递归函数中支持,这限制了你可以做哪些组合(这是JVM的根本局限)。
这是真的吗?如果是的话,是什么让JVM产生了这种根本性的限制?
目前,在Da Vinci Machine项目中正在进行一些工作。尾调用子项目的状态被列为“proto 80%”;它不太可能进入Java 7,但我认为它在Java 8中有很大的机会。我相信这仍然是可行的,但这不是一个小任务。
根本限制在于JVM在它的字节码中没有提供尾调用,因此,基于JVM构建的语言无法直接提供尾调用。虽然有一些变通方法可以实现类似的效果(如trampolining),但它们的代价是性能极差,并且会混淆生成的中间代码,使调试器无法使用。
因此,在Sun公司实现JVM中的尾调用之前,JVM无法支持任何生产级别的函数式编程语言。他们已经讨论了多年,但我怀疑他们是否会实现尾调用:这将非常困难,因为他们在实现这种基本功能之前过早地优化了他们的虚拟机,而Sun公司的努力主要集中在动态语言而不是函数式语言上。
因此,有一个很强的论点认为Scala不是一个真正的函数式编程语言:自从Scheme在30多年前首次推出以来,这些语言一直把尾调用视为一个基本特征。
Scala 2.7.x支持尾递归优化自递归(函数调用自身)的最终方法和局部函数。
Scala 2.8可能会提供库支持来优化相互递归函数的trampoline技术。
关于Scala递归状态的大量信息可以在Rich Dougherty's博客中找到。
除了Lambda The Ultimate上的文章(来自mmyers上面的链接),来自Sun的John Rose还谈到了尾递归优化。
http://blogs.oracle.com/jrose/entry/tail_calls_in_the_vm
我听说JVM可能会在某一天实现这个功能。Da Vinci Machine正在研究尾调用支持和其他一些东西。