Forth 有一个栈和一个返回栈。
据我了解,返回堆栈的目的是存储程序计数器的先前值。
C 程序将程序计数器的先前值放在堆栈上,并且不使用返回堆栈。
Forth 是否只需要一个返回堆栈,因为它在堆栈上返回结果,因此程序计数器的先前值可能会被掩埋?
Forth 有一个栈和一个返回栈。
据我了解,返回堆栈的目的是存储程序计数器的先前值。
C 程序将程序计数器的先前值放在堆栈上,并且不使用返回堆栈。
Forth 是否只需要一个返回堆栈,因为它在堆栈上返回结果,因此程序计数器的先前值可能会被掩埋?
“可移植汇编语言”应该是关闭的。它是一种语言编译器的概念,几乎与标准/传统 Forth 相同。可以编写哪种程序有一些限制。大多数情况下,您必须避免无法静态确定堆栈深度的情况。
这种语言可以以只需要一个堆栈的方式进行编译。
http://www.complang.tuwien.ac.at/anton/euroforth/ef13/papers/ertl-paf.pdf
前言:我已经为硬件调试器编写了扩展来跟踪一些混乱的调用堆栈的问题,所以我看到了一些实际C
堆栈的十六进制转储。
C
堆栈由返回地址、局部变量和函数参数的混合组成。对于每个函数,您可以找出它期望哪个值的位置,但这种知识仅限于函数的范围。
您也可以这样做forth
,但这意味着巨大的开销:您可以将参数放在堆栈上并调用函数,将返回地址放在同一个堆栈的顶部。没问题:每个命令都知道操作数在堆栈上是第二个并且在其后。但是现在该命令想要使用这些值调用另一个命令:这使得有必要更改堆栈的顺序以再次将值放在顶部,因为被调用的命令无法知道它们在堆栈中的位置,因为您写道。
更复杂的forth
编译器可以跟踪每个命令需要多少值,并在每个命令调用之前对堆栈进行排序。但是要付出什么代价!
当然,C
程序也有这种开销。如果您在内联汇编中看到非内联函数调用,那么总会有一些寄存器交换开销。但是好的forth
程序由微小的函数组成,所以你有更多的函数调用和更多的开销。
并且没有任何好处,就像在现代计算机体系结构中一样,每个寄存器都可以用作堆栈指针,因此您可以毫无问题地拥有少量堆栈。
所以最后,你的问题的答案是:是的,你可以实现 的单栈导数forth
,但这是没有收获的痛苦。
“Forth 有一个堆栈和一个返回堆栈。” 这适用于所有现存的和之前的 Forth 标准,适用于标准前的方言,甚至对于像 colorforth 这样的方言,有些人不愿称其为 Forth。
所以你已经回答了你自己的问题:一个响亮的不。这两个堆栈是 Forth 编程模型的核心。程序员有权操纵两者。
原因当然是您自己处理数据并且返回地址会妨碍您。如果你坚持要与 C 比较,C 会按名称操作数据,并处理返回。事实上,C 在其编程模型中没有堆栈。使用一个堆栈是您不应该担心的实现细节。