只有一个堆栈可以实现类似Forth的语言吗?

时间:2017-05-17 12:15:44

标签: stack forth concatenative-language

Forth有一个堆栈和一个返回堆栈。

据我所知,返回堆栈的重点是存储程序计数器的先前值。

C程序将程序计数器的先前值放在堆栈上,并且不使用返回堆栈。

Forth只需要一个返回堆栈,因为它会在堆栈上返回结果,因此程序计数器的先前值可能会被隐藏吗?

3 个答案:

答案 0 :(得分:5)

“便携式汇编语言”应该是关闭的。这是一种语言编译器的概念,几乎与标准/传统Forth相同。可以编写哪种程序有一些限制。大多数情况下,您必须避免无法静态确定堆栈深度的情况。

这种语言的编译方式只需要一个堆栈。

http://www.complang.tuwien.ac.at/anton/euroforth/ef13/papers/ertl-paf.pdf

答案 1 :(得分:4)

前言:我已经为硬件调试器编写了扩展来跟踪混乱调用堆栈的一些问题,所以我看到了一些实际C堆栈的十六进制转储。

C堆栈由返回地址,局部变量和函数参数组成。对于每个函数,您可以找到它期望哪个值的位置,但是这个知识在函数的范围内停止。

你也可以用forth这样做,但这意味着一个巨大的开销:你可以将你的参数放在堆栈上并调用函数,将返回地址放在同一个堆栈的顶部。没问题:每个命令都知道操作数是第二个并且在堆栈后面。但是现在该命令想要使用这些值调用另一个命令:这使得必须更改堆栈的顺序以将值再次置于顶部,因为被调用的命令无法知道它们在堆栈中的埋藏位置,因为写。

更复杂的forth编译器可以跟踪每个命令占用的值数,并在每次命令调用之前对堆栈进行排序。但是要花多少钱!

当然,C程序也有这种开销。如果在内联汇编中看到非内联函数调用,则始终存在一些寄存器交换开销。但好的forth程序由微小的函数组成,因此你有更多的函数调用和更多的开销。

没有任何好处,就像在现代计算机体系结构中一样,每个寄存器都可以用作堆栈指针,所以你可以有一些堆栈没有任何问题。

最后,你的问题的答案是:是的,你可以实现forth的单叠导数,但是没有收获就很痛苦。

答案 2 :(得分:0)

“Forth 有一个栈和一个返回栈。”对于每一个现存的和之前的 Forth 标准、前标准方言,甚至对于像 colorforth 这样有些人不愿称其为 Forth 的方言,都是如此。

所以你已经回答了你自己的问题:一个响亮的不。 这两个堆栈是 Forth 编程模型的核心。程序员有权操作两者。

原因当然是你自己处理数据,返回地址会碍事。 如果您坚持将其与 C 进行比较,C 将按名称操作数据,并处理返回。事实上,C 在其编程模型中没有堆栈。使用一个堆栈是您不应该担心的实现细节。