JavaScript,Lua,尾调用优化

我已经开始阅读七周内学会七种编程语言,第一天的主题是 Lua。我对 Lua 不是很了解(但是!)但我第一个想法是,嗯,这似乎与 JavaScript 有很多相似之处。

一个它 与 JavaScript 不相似的地方在拖尾调用侧边栏中很快突出。以下代码:

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 是某种较低级别的语言而不能优化其拖尾调用...是吗?

点赞
用户757681
用户757681

Tail Call Optimization 在 JavaScript (ES4) 中不受支持。同时请注意,尾递归函数并不总是递归调用。

请阅读 Paul Barry 的一篇好文章,链接为:http://www.paulbarry.com/articles/2009/08/30/tail-call-optimization

此外,这篇文章也值得一读:http://duartes.org/gustavo/blog/post/tail-calls-optimization-es6/

2015-02-21 09:11:04