跳转到内容

Forth/堆栈操作

来自维基教科书,开放的书籍,开放的世界

参数堆栈

堆栈是一种常见于多种语言的数据结构。一种被称为参数堆栈(为了区别于返回堆栈)的 LIFO(后进先出)类型的堆栈,在 FORTH 中经常是许多数据和算术操作的隐式来源和目的地。

典型的操作会在堆栈上找到它们的输入参数,通常会移除(弹出)这些输入,然后将新的结果放回堆栈(压入)。

虽然 FORTH 有变量、数组、字符串和其他数据结构,但堆栈的使用与语言的哲学相结合,以实现多种优势。

  • 如果一段代码仅使用堆栈作为其输入、输出和中间值,那么它几乎在所有情况下都是本质上可重入的。
  • 如果一段代码保持堆栈奇偶性,也就是说,它在开始和结束之间不会从堆栈上移除或遗弃任何值,那么可以在代码主体中的任何地方插入对它的调用。
  • 堆栈就像一个调车场,可以从任何地方获取数据并发送到任何地方。通过读取或写入堆栈顶部的元素,数据可以在系统的各个部分之间进行切换。
  • 操作码不需要使用位来指定寄存器值,而是依次使用两个 RISC 样式的机器指令,类似于 LOAD 然后 ADD。这些更简单的指令允许高效实现。

当你输入一个数字时,它会进入堆栈。当你输入多个数字时,它们都会进入堆栈,最近的数字位于堆栈顶部。例如,在输入 7 22 -8 14 9 并按下 ENTER 后,堆栈看起来像这样

            cell #   contents
              0         9        (TOS) 
              1        14        (NOS) 
              2        -8 
              3        22
              4         7

许多程序员使用堆栈图来记录一个词,在词执行之前和之后使用两个堆栈的“图像”(TOS 最右边)。

SWAP ( ... a b -- ... b a )

DROP ( ... x y z -- ... x y )

DUP ( ... x y z -- ... x y z z )

ROT ( ... a b c d -- ... a c d b )

华夏公益教科书