Forth/堆栈操作
外观
< 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 )