我在以下问题上看到了这句话:构建Web服务时应使用哪种良好的功能语言?
除自递归功能外,Scala特别不支持尾部调用消除,这限制了您可以执行的组合类型(这是JVM的基本限制)。
这是真的?如果是这样,那么创建此基本限制的JVM是什么?
我在以下问题上看到了这句话:构建Web服务时应使用哪种良好的功能语言?
除自递归功能外,Scala特别不支持尾部调用消除,这限制了您可以执行的组合类型(这是JVM的基本限制)。
这是真的?如果是这样,那么创建此基本限制的JVM是什么?
Answers:
帖子:递归还是迭代?可能有帮助。
简而言之,由于安全模型和始终需要可用的堆栈跟踪,因此在JVM中很难进行尾部调用优化。这些要求在理论上可以得到支持,但是可能需要一个新的字节码(请参阅John Rose的非正式建议)。
Sun bug#4726340中还有更多讨论,评估(从2002年开始)在此结束:
我相信仍然可以做到这一点,但这不是一个小任务。
当前,达芬奇机器项目中正在进行一些工作。尾部调用子项目的状态列为“原始80%”;不太可能将其纳入Java 7,但我认为它在Java 8中有很大的机会。
基本的限制仅仅是,JVM不在其字节码中提供尾部调用,因此,没有直接方法可以使基于JVM的语言本身提供尾部调用。有一些变通办法可以达到类似的效果(例如,踩踏),但代价是糟糕的性能以及混淆生成的中间代码,这使调试器无用,从而付出了巨大的代价。
因此,除非Sun在JVM本身中实现尾调用,否则JVM无法支持任何具有生产质量的功能编程语言。他们已经讨论了很多年,但是我怀疑它们是否会实现尾部调用:这将非常困难,因为在实现这种基本功能之前,他们过早地优化了VM,Sun的工作重点是动态语言,而不是功能语言。
因此,有一个非常有力的论据认为Scala不是真正的函数式编程语言:自从Scheme在30多年前首次引入以来,这些语言就将尾调用视为必不可少的功能。
Hence there is a very strong argument that Scala is not a real functional programming language
-这个论点实际上很弱。当然可以tail calls [as] an essential feature
,如果基础硬件(或虚拟机)直接支持它,那就很好。但这是实现细节。
Scala 2.7.x支持尾部调用优化,以实现最终方法和局部函数的自递归(调用自身的函数)。
Scala 2.8也可能附带对蹦床的库支持,这是一种优化相互递归函数的技术。
可以在Rich Dougherty的博客中找到有关Scala递归状态的大量信息。
除了在Lambda The Ultimate中链接的论文(来自上面发布的mmyers链接)之外,Sun的John Rose还谈到了尾部调用优化。
http://blogs.oracle.com/jrose/entry/tail_calls_in_the_vm
我听说有一天它可能会在JVM上实现。达芬奇机器上正在研究尾声支持等功能。
所有资料都指出JVM在尾部递归的情况下无法优化,但是在阅读Java性能调整(2003年,O'reilly)时,我发现作者声称他可以通过实现尾部递归来实现更高的递归性能。
您可以在第212页找到他的主张(搜索“ tail recursion”(尾递归)应该是第二个结果)。是什么赋予了?