为了账号安全,请及时绑定邮箱和手机立即绑定

JVM是否会阻止尾调用优化?

JVM是否会阻止尾调用优化?

JVM
繁星点点滴滴 2019-07-30 16:25:53
JVM是否会阻止尾调用优化?我在这个问题上看到了这个引用:什么是构建Web服务的好函数语言?特别是Scala不支持尾调用消除,除了自递归函数,这限制了你可以做的组合种类(这是JVM的一个基本限制)。这是真的?如果是这样,那么创建这个基本限制的JVM是什么呢?
查看完整描述

3 回答

?
白板的微信

TA贡献1883条经验 获得超3个赞

这篇文章:递归或迭代?可能有帮助。

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

Sun bug#4726340中也有更多的讨论,评估(从2002年)结束:

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

目前,Da Vinci Machine项目正在进行一些工作。尾调用子项目的状态列为“proto 80%”; 它不太可能进入Java 7,但我认为它在Java 8上有很好的机会。


查看完整回答
反对 回复 2019-07-30
?
动漫人物

TA贡献1815条经验 获得超10个赞

基本限制只是JVM不在其字节代码中提供尾调用,因此,构建在JVM上的语言本身没有直接提供尾调用的方法。有一些解决方法可以达到类似的效果(例如蹦床),但它们会带来糟糕的性能和混淆生成的中间代码,这使得调试器无用。

因此,在Sun实现JVM本身的尾调用之前,JVM不能支持任何生产质量的函数式编程语言。他们多年来一直在讨论它,但我怀疑它们是否会实现尾调用:它将非常困难,因为它们在实现这些基本功能之前过早地优化了它们,而Sun的工作主要集中在动态语言而不是函数语言上。

因此,有一个非常强烈的论点,即Scala不是一种真正的函数式编程语言:自从30多年前首次引入Scheme以来,这些语言一直认为尾调用是一个必不可少的特性。


查看完整回答
反对 回复 2019-07-30
?
慕运维8079593

TA贡献1876条经验 获得超5个赞

Scala 2.7.x支持对最终方法和本地函数的自递归(一个函数调用自身)进行尾调用优化。

Scala 2.8也可能带有对trampoline的库支持,这是一种优化相互递归函数的技术。

有关Scala递归状态的大量信息可以在Rich Dougherty的博客中找到


查看完整回答
反对 回复 2019-07-30
  • 3 回答
  • 0 关注
  • 631 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信