为了实现尾调用优化,jvm必须牺牲什么?

haw*_*eye 3 python jvm clojure stack-trace tail-call-optimization

人们说除了没有尾调用优化的限制之外,clojure实现是优秀的 - 限制jvm而不是clojure实现.

http://lambda-the-ultimate.org/node/2547

有人说,将Python实现TCO会牺牲

  • 堆栈跟踪转储和
  • 调试规律性.

向我解释尾调用优化的重要性以及Python需要它的原因

是否必须为实施TCO的jvm做出同样的牺牲?还有什么需要牺牲的吗?

Shu*_*oUk 6

虽然不同(因为已经存在il指令),但值得注意的是.Net 64位JIT团队必须通过额外的努力来尊重所有尾部调用.

我特别提到了评论:

当然,缺点是如果你必须调试或配置优化代码,那么就要准备好处理看起来像是缺少几帧的调用堆栈.

我认为JVM也不太可能避免这种情况.

鉴于此,在请求尾部调用优化的情况下,JIT应该假定需要避免堆栈溢出,这不是可以在Debug构建中关闭的东西.如果它们在你到达有趣的部分之前崩溃,它们对调试没有多大用处.事实上,"优化"是一个永久性功能,也是受其影响的堆栈跟踪的问题.

这是值得指出的是作为一个堆栈操作(调用例如功能),这样做,程序员概念描述的操作时,可以防止产生一个真正的堆栈帧任何优化/了解本身将造成什么呈现给用户之间的脱节在调试/提供堆栈跟踪和现实时.
这是不可避免的,因为描述操作的代码变得与执行操作的状态机的机制进一步分离.