【问题标题】:JavaScript, Lua, tail call optimisationJavaScript、Lua、尾调用优化
【发布时间】:2015-04-23 00:23:24
【问题描述】:

我已经开始阅读 七周内的七种编程语言,并且第一天与 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 是某种劣等语言,它不会优化其尾调用......是吗?

【问题讨论】:

  • 简短的解释是 Lua 是没有丑陋部分的 Javascript。总的来说,Lua 是一种更好的设计语言,它经历了多次迭代,而 Javascript 在某种意义上当时被“匆忙”地满足了项目需求。所以像 TCO 这样的东西并没有进入 ECMA 规范。
  • 所以从字面上看,Lua 更好(无论如何,在这个部门),如果他们做得好,JavaScript 会有 TCO?

标签: javascript lua tail-recursion


【解决方案1】:

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

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

还有:http://duartes.org/gustavo/blog/post/tail-calls-optimization-es6/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-31
    • 2014-04-06
    • 1970-01-01
    • 2019-07-10
    • 2011-07-11
    • 2013-06-20
    • 1970-01-01
    • 2016-09-10
    相关资源
    最近更新 更多