根据这个答案
所有这些编程语言都是无堆栈的
它们无堆叠意味着什么?这是否意味着他们不使用调用堆栈?如果他们不使用调用堆栈,他们会使用什么?
答案 0 :(得分:15)
它们无堆叠意味着什么?这是否意味着他们不使用调用堆栈?
是的,那是对的。
如果他们不使用调用堆栈,他们会使用什么?
当然,确切的实施方式因语言而异。在Stackless Python中,有一个调度程序,它使用最顶层的框架及其结果启动Python解释器。解释器根据需要逐个处理操作码,直到它达到CALL_FUNCTION
操作码,即即将进入函数的信号。这会导致调度程序使用相关信息构建新框架,并使用展开标志返回调度程序。从那里开始,调度员重新开始,将翻译指向最顶层的框架。
无堆栈语言出于多种原因避开调用堆栈,但在许多情况下,它被使用以便某些编程结构变得更容易实现。规范的是 continuations 。 Continuations是非常强大,非常简单的控制结构,可以代表您可能已经熟悉的任何常用控制结构(while
,do
,if
,switch
,等等。
如果这令人困惑,你可能想尝试围绕维基百科的文章,特别是可爱的延续三明治类比:
说你在冰箱前的厨房里,想着一个三明治。你在那里继续,并把它放在你的口袋里。然后你从冰箱里拿出一些火鸡和面包,自己做一个三明治,现在坐在柜台上。你在口袋里调用了延续物,你发现自己再次站在冰箱前面,想着一个三明治。但幸运的是,柜台上有一个三明治,用来制作它的所有材料都不见了。所以你吃它。
答案 1 :(得分:11)
他们不使用调用堆栈,因为它们在continuation-passing style中运行。如果您不熟悉尾部呼叫优化,那么这可能是了解这意味着什么的良好的第一步。
要模拟此模型上的传统调用/返回,而不是按下返回地址并期望帧的其余部分保持不变,调用者将关闭其代码的剩余部分以及仍然需要的任何变量(其余的是释放)。然后它对被调用者执行尾调用,将此continuation作为参数传递。当被调用者“返回”时,它通过调用此continuation,将返回值作为参数传递给它来实现。
就上述情况而言,它只是一种复杂的函数调用方式。但是,它非常适用于更复杂的场景: