【发布时间】:2016-03-04 14:54:40
【问题描述】:
Stack overflow despite tail call position but only in 64-bit 问题导致在 F# 编译器中发现 bug。
阅读answer 后,我很好奇导致发现错误的原因,因为我想更好地提高解决问题和理解 TCO 的技能。
【问题讨论】:
标签: f# tail-recursion tail-call-optimization
Stack overflow despite tail call position but only in 64-bit 问题导致在 F# 编译器中发现 bug。
阅读answer 后,我很好奇导致发现错误的原因,因为我想更好地提高解决问题和理解 TCO 的技能。
【问题讨论】:
标签: f# tail-recursion tail-call-optimization
我的推理是这样的:
在查看计算表达式时谈论“尾调用”可能会产生误导 - 通常确实没有这样的事情(参见例如 this other answer 的一个相关讨论,尽管与 序列 em> 表达式)。
所以调用gauss 本身不会溢出堆栈,只有迭代它的代码可能会使其溢出。但是一旦我看到调用代码就像Seq.nth,那意味着几乎可以肯定存在编译器错误,因为序列表达式中的“tail yield!ing”模式应该得到优化(不确定如果这是规范的一部分,但我认为它是众所周知的)。因此,这只是查看初始复制的哪些部分是必要的情况。
用非递归定义替换原始代码中的循环使重现停止失败,删除模式匹配也是如此。我没有发现查看 IL 有帮助(在序列表达式的编译中涉及到很多编译器生成的机器),我只是尝试在源代码级别最小化重现并根据经验测试行为。
【讨论】: