代码之家  ›  专栏  ›  技术社区  ›  tatsuhirosatou

编程语言是无栈的真正含义是什么?

  •  14
  • tatsuhirosatou  · 技术社区  · 16 年前

    根据这个答案

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

    所有这些编程语言都是无堆栈的

    • 无堆叠蟒蛇
    • 派皮
    • Lisp
    • 方案
    • TCL
    • 卢阿
    • 鹦鹉虚拟机

    对他们来说,无堆叠到底意味着什么?这是否意味着他们不使用调用堆栈?如果他们不使用调用堆栈,他们使用什么?

    2 回复  |  直到 16 年前
        1
  •  14
  •   John Feminella    16 年前

    对他们来说,无堆叠到底意味着什么?这是否意味着他们不使用调用堆栈?

    是的,那是对的。

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

    当然,具体的实现将因语言而异。在无堆栈的python中,有一个调度器使用最顶层的帧启动python解释器及其结果。解释器根据需要一次处理一个操作码,直到它到达 CALL_FUNCTION 操作码,即将进入函数的信号。这会导致调度器使用相关信息构建一个新的帧,并使用“展开”标志返回调度器。从那里,调度器重新开始,将解释器指向最顶端的帧。

    无堆栈语言避开调用堆栈有很多原因,但在许多情况下,它被使用,因此某些编程构造变得更容易实现。典型的是 continuations .延续是非常强大、非常简单的控制结构,可以表示您可能已经熟悉的任何常见控制结构。( while , do , if , switch 等等。

    如果这让人困惑的话,你可以试着在维基百科的文章中,特别是那些滑稽的文章中绕一圈。 连续三明治类比 :

    比如说你在冰箱前面的厨房里,想着三明治。你在那儿接上一段,然后把它放进口袋里。然后你从冰箱里拿出一些火鸡和面包,给自己做一个三明治,现在它就放在柜台上了。你调用口袋里的续句,你发现自己又站在冰箱前,想着三明治。但幸运的是,柜台上有一个三明治,用来做三明治的所有材料都不见了。所以你吃它。

        2
  •  10
  •   puetzk    16 年前

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

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

    就以上所述,这只是一种复杂的函数调用方法。但是,它很好地概括为更复杂的场景:

    1. exception/finally/etc块很容易建模——如果您可以将一个“返回”延续作为参数传递,那么您可以同样轻松地传递2个(或更多)。lisp-y“条件处理程序”块(可能会或可能不会将控制权返回给调用方)也很容易传递此函数其余部分的一个延续,该延续可能会或可能不会被调用。
    2. 同样,多个返回值也很容易实现-将多个参数传递给继续符。
    3. 返回临时/复制不再与传递函数参数不同。这通常会使消除临时事件变得更容易。
    4. 尾部递归优化是微不足道的-调用方只是传递它接收到的“返回”继续符,而不是捕获新的继续符。
    推荐文章