【发布时间】: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