【问题标题】:What reasoning lead to `Sequence expression containing recursive definition is compiled incorrectly`什么原因导致`包含递归定义的序列表达式编译不正确`
【发布时间】: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


    【解决方案1】:

    我的推理是这样的:

    在查看计算表达式时谈论“尾调用”可能会产生误导 - 通常确实没有这样的事情(参见例如 this other answer 的一个相关讨论,尽管与 序列 em> 表达式)。

    所以调用gauss 本身不会溢出堆栈,只有迭代它的代码可能会使其溢出。但是一旦我看到调用代码就像Seq.nth,那意味着几乎可以肯定存在编译器错误,因为序列表达式中的“tail yield!ing”模式应该得到优化(不确定如果这是规范的一部分,但我认为它是众所周知的)。因此,这只是查看初始复制的哪些部分是必要的情况。

    用非递归定义替换原始代码中的循环使重现停止失败,删除模式匹配也是如此。我没有发现查看 IL 有帮助(在序列表达式的编译中涉及到很多编译器生成的机器),我只是尝试在源代码级别最小化重现并根据经验测试行为。

    【讨论】:

      猜你喜欢
      • 2018-05-10
      • 1970-01-01
      • 2020-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多