2009-04-28 71 views
14

根据这个答案这是什么意思,一种编程语言是无堆栈的?

https://stackoverflow.com/questions/551950/what-stackless-programming-languages-are-available/671296#671296

所有这些编程语言都无堆叠

  • 无堆栈的Python
  • PyPy
  • Lisp的
  • 方案
  • 的Tcl
  • 的Lua
  • 鹦鹉VM

它究竟意味着它们是无堆叠?这是否意味着他们不使用调用堆栈?如果他们不使用调用堆栈,他们使用什么?

+0

请参见http://stackoverflow.com/questions/1016218/how-does-a-stackless-language-work/1053159#1053159 – 2009-09-18 02:42:15

回答

14

这对他们来说意味着什么是无法堆栈的?这是否意味着他们不使用调用堆栈?

是的,这是正确的。

如果他们不使用调用堆栈,他们使用什么?

当然,确切的实现方式会因语言而异。在Stackless Python中,有一个调度器使用最上面的框架及其结果启动Python解释器。解释器根据需要逐个处理操作码,直到达到操作码CALL_FUNCTION,这是您即将进入函数的信号。这会导致调度程序使用相关信息构建一个新框架,并使用退绕标志返回调度程序。从那里开始,调度员重新开始,将翻译指向最顶层的框架。

无堆栈语言由于多种原因而避免调用堆栈,但在很多情况下,它被用来使某些编程结构变得更容易实现。规范的是continuations。继续是非常强大,非常简单的控制结构,可以表示您可能已经熟悉的任何常用控制结构(whiledoif,switch等)。

如果这是混乱的,你可能会想尝试包装你的头维基百科的文章周围,特别是娇媚延续三明治比喻

说你在厨房里是在冰箱的前,想着三明治。你在那里继续,并将它粘在你的口袋里。然后,你从冰箱里取出一些火鸡和面包,为自己做一个三明治,现在坐在柜台上。你在口袋里调用延续,你发现自己又站在冰箱前面,想着三明治。幸运的是,柜台上有一个三明治,所有用来制作它的材料都没有了。所以你吃了它。

10

它们不使用调用堆栈,因为它们在continuation-passing style中操作。如果您不熟悉尾部呼叫优化,那么理解这意味着什么可能是一个好的第一步。

为了模拟这个模型上的传统调用/返回,不是推送返回地址,而是期望框架的其余部分保持不变,调用者关闭其余代码和任何仍然需要的变量(其余部分被释放)。然后它向被调用者执行一个尾部调用,将这个延续作为参数传递。当被调用者“返回”时,它通过调用这个延续来实现,将返回值作为参数传递给它。

就上述情况而言,这只是一种复杂的函数调用方式。然而,它概括非常漂亮,更复杂的情况:

  1. 例外/最后的/ etc块很容易模仿 - 如果你可以通过一个“回归”的延续作为参数,你可以通过2(或更多)只如同轻松。 lisp-y“条件处理程序”块(可能会或可能不会将控制权返回给调用者)也很容易 - 为该函数的其余部分传递一个延续,可能调用或可能不会调用该函数。
  2. 多个返回值同样很容易 - 通过几个参数继续。
  3. 返回临时/复制不再与函数参数传递不同。这通常会使消除临时对象更容易。
  4. 尾递归优化是微不足道的 - 调用者只是传递它收到的“返回”延续,而不是捕获一个新的延期。