人们说 clojure 实现非常出色,除了没有尾调用优化的限制 - jvm 的限制而不是 clojure 实现。
http://lambda-the-ultimate.org/node/2547
据说将 TCO 实现到 Python 中会牺牲
- 堆栈跟踪转储,以及
- 调试规律性。
Explain to me what the big deal with tail call optimization is and why Python needs it
是否必须为 TCO 的 jvm 实现做出同样的牺牲?还需要牺牲其他什么吗?
最佳答案
虽然有所不同(因为 il 指令已经存在),但值得注意的是 .Net 64 bit JIT team 的额外努力。必须通过以尊重所有尾部调用。
我特别指出评论:
The down side of course is that if you have to debug or profile optimized code, be prepared to deal with call stacks that look like they’re missing a few frames.
我认为 JVM 也不太可能避免这种情况。
考虑到,在请求尾调用优化的情况下,JIT 应该假定它是必需的 以避免堆栈溢出,这不是可以在调试构建中关闭的东西。如果它们在您到达有趣的部分之前就崩溃了,那么它们对调试没有多大用处。 “优化”实际上是一项永久性功能,也是受其影响的堆栈跟踪的问题。
值得指出的是,在执行程序员在概念上描述/理解为堆栈操作(例如调用函数)的操作时,任何避免创建真正堆栈帧的优化都会固有地导致所呈现的内容之间的脱节在调试/提供堆栈跟踪和现实时向用户提供。
这是不可避免的,因为描述操作的代码与执行操作的状态机的机制越来越分离。
关于python - 为了实现尾调用优化,jvm 必须牺牲什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1006596/