编程语言是无堆栈的到底意味着啥?
Posted
技术标签:
【中文标题】编程语言是无堆栈的到底意味着啥?【英文标题】:What does it really mean that a programming language is stackless?编程语言是无堆栈的到底意味着什么? 【发布时间】:2010-10-22 05:24:44 【问题描述】:根据这个答案
https://***.com/questions/551950/what-stackless-programming-languages-are-available/671296#671296
所有这些编程语言都是无堆栈的
无堆栈 Python PyPy Lisp 方案 Tcl 卢阿 鹦鹉虚拟机对他们来说,无堆栈到底意味着什么?这是否意味着他们不使用调用堆栈?如果他们不使用调用堆栈,他们使用什么?
【问题讨论】:
在***.com/questions/1016218/…查看答案 页面不存在***.com/questions/551950/… 【参考方案1】:对他们来说,无堆栈到底意味着什么?这是否意味着他们不使用调用堆栈?
是的,没错。
如果他们不使用调用堆栈,他们会使用什么?
当然,具体的实现会因语言而异。在 Stackless Python 中,有一个调度程序使用最顶层的帧及其结果启动 Python 解释器。解释器根据需要一次处理一个操作码,直到它到达CALL_FUNCTION
操作码,这是您即将进入函数的信号。这会导致调度程序使用相关信息构建一个新框架并返回带有展开标志的调度程序。从那里,调度程序重新开始,将解释器指向最顶层的帧。
出于多种原因,无堆栈语言避免使用调用堆栈,但在许多情况下,它的使用是为了使某些编程结构变得更容易实现。典型的是 continuations。延续是非常强大、非常简单的控制结构,可以表示您可能已经熟悉的任何常用控制结构(while
、do
、if
、switch
等等)。
如果这令人困惑,您可能想尝试一下 Wikipedia 文章,尤其是可爱的连续三明治类比:
假设您在冰箱前的厨房里,想吃三明治。你在那里拿一个延续,把它放在你的口袋里。然后你从冰箱里拿出一些火鸡和面包,给自己做一个三明治,现在放在柜台上。你调用你口袋里的延续,你发现自己又站在冰箱前,想着一个三明治。不过好在柜台上有一个三明治,所有用来做三明治的材料都没有了。所以你吃吧。
【讨论】:
【参考方案2】:它们不使用调用堆栈,因为它们在continuation-passing style 中运行。如果您不熟悉尾调用优化,这可能是了解其含义的良好第一步。
为了在此模型上模拟传统的调用/返回,而不是推送返回地址并期望帧的其余部分保持不变,调用者关闭其代码的其余部分和仍然需要的任何变量(其余部分是释放)。然后它对被调用者执行尾调用,将此延续作为参数传递。当被调用者“返回”时,它会调用这个延续,将返回值作为参数传递给它。
就上述内容而言,这只是进行函数调用的一种复杂方式。但是,它可以很好地推广到更复杂的场景:
-
exception/finally/etc 块很容易建模 - 如果您可以传递一个“返回”延续作为参数,则可以同样轻松地传递 2(或更多)。 lisp-y“条件处理程序”块(可能会或可能不会将控制权返回给调用者)也很容易 - 为这个函数的其余部分传递一个延续,可能会或可能不会被调用。
多个返回值同样变得容易 - 将多个参数传递给延续。
返回临时/复制不再不同于函数参数传递。这通常可以更轻松地消除临时性。
尾递归优化是微不足道的 - 调用者只是传递它收到的“返回”延续而不是捕获一个新的延续。
【讨论】:
以上是关于编程语言是无堆栈的到底意味着啥?的主要内容,如果未能解决你的问题,请参考以下文章