JavaScript,Lua,尾部调用优化

时间:2015-02-21 08:58:40

标签: javascript lua tail-recursion

我开始在七周内阅读七种以上编程语言,第一天与Lua进行交易。我对Lua不太了解(但是!)但是我的第一个想法是,嗯,这似乎与JavaScript有很多相似之处。

类似于JavaScript的方式在Tail Cails的侧栏中快速突出显示。以下代码:

function reverse(s, t)
    if #s < 1 then return 1 end
    first = string.sub(s, 1, 1)
    rest = string.sub(2, 2, -1)
    return reverse(rest, first .. t)
end

large = string.rep('hello ', 5000)
print(reverse(large, ''))

确实如本书所述,在Lua中工作正常,但在翻译为JavaScript并在我的Chrome浏览器的控制台中运行时,它会被打破。

然后我想到了几个问题:

(1)任何人都可以扩展这本书的断言“Lua正确优化递归调用到一个简单的goto”来完成计算吗?两种语言都在发生什么事情,使一个人能够处理这个操作,并阻止另一个?

(2)相关地,我猜,有没有一个很好的理由让JavaScript允许这种递归来破坏堆栈?从一个天真的角度来看,在我看来,如果两个高级语言中的代码看起来几乎完全相同,并且 是一种让它在较低级别上按预期工作的方式,你可能会以及语言设计师做出使其工作所需的一切。我假设它不是只是因为JavaScript是某种低级语言,它不会优化它的尾部调用......是吗?

1 个答案:

答案 0 :(得分:1)

JavaScript(ES4)不支持尾调用优化。另请注意,尾调用并不总是递归的。

请参阅http://www.paulbarry.com/articles/2009/08/30/tail-call-optimization了解一篇好文章。

另外:http://duartes.org/gustavo/blog/post/tail-calls-optimization-es6/