一个编程语言是"stackless"意味着什么?

18

请参考以下链接查看答案:https://dev59.com/wXNA5IYBdhLWcg3wUL5Y#1053159 - Ira Baxter
该页面不存在 http://stackoverflow.com/questions/551950/what-stackless-programming-languages-are-available/671296#671296 - PADYMKO
2个回答

19
“他们是无栈的” 究竟意味着什么?这是否意味着他们不使用调用堆栈?
是的,差不多就是这样。
如果他们不使用调用堆栈,那他们使用什么?
具体实现当然因语言而异。在Stackless Python中,有一个分发器,它使用最上层的帧和其结果启动Python解释器。解释器一次处理一个操作码,直到它到达CALL_FUNCTION操作码,表示你即将进入一个函数。这会导致分发器构建具有相关信息的新框架,并带有展开标志返回到分发器。从那里开始,分发器重新开始,将解释器指向最上面的帧。
无堆栈语言出于许多原因避免使用调用堆栈,但在许多情况下,这是为了使某些编程结构更容易实现。典型的例子是continuations。Continuations是非常强大、非常简单的控制结构,可以表示您可能已经熟悉的任何常规控制结构(如whiledoifswitch等)。
如果这很令人困惑,您可能需要尝试理解维基百科文章,特别是可爱的continuation sandwich analogy
假设你站在厨房里,冰箱前面,想着要吃个三明治。你在那儿拿了一个 continuation 并把它放进了口袋里。然后你从冰箱里拿出了火鸡肉和面包,做了一个三明治,现在摆在柜台上。你调用了口袋里的 continuation,发现自己又站在冰箱前面,想着要吃个三明治。但幸运的是,柜台上有一个三明治,而且制作所需的所有材料都已经消失了。所以你就吃掉了它。

12

他们不使用调用栈,因为它们采用延续传递样式。如果您不熟悉尾递归优化,了解这意味着什么可能是一个很好的第一步。

为了在该模型上模拟传统的调用/返回,调用者不会推送返回地址,并期望剩余的框架保持不变,而是将其余的代码和任何仍然需要的变量(其余的被释放)封闭起来。然后,它执行对被调用方的尾调用,将此续体作为参数传递。当被调用者“返回”时,它通过调用此续体并将返回值作为参数传递给它来实现。

就上述而言,这只是一种复杂的函数调用方式。但是,它可以很好地推广到更复杂的情况:

  1. 异常/finally/etc块可以非常容易地建模 - 如果您可以将一个“返回”续体作为参数传递,那么您也可以轻松地传递2个(或更多)。类似于Lisp的“条件处理器”块(可能会或可能不会将控制权返回给调用者)也很容易 - 将用于此函数余下部分的续体传递,该续体可能会或可能不会被调用。
  2. 多个返回值同样变得容易 - 将几个参数传递给续体。
  3. 返回临时/复制物不再与函数参数传递有所不同。这通常使消除临时变量更容易。
  4. 尾递归优化很容易 - 调用者只需传递其收到的“返回”续体而不是捕获新续体即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接