2017-05-17 40 views
2

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

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

C程序将程序计数器的前一个值放入堆栈,并且不使用返回堆栈。

确实只需要一个返回堆栈,因为它返回栈上的结果,因此程序计数器的前一个值可以被掩埋?

+1

我不是专家,但我想在C中它有助于参数的大小(这是你需要通过以获取到返回地址的数据)在编译时已知,和静态。所以是返回值的大小。在第四,这两个都不知道。 – unwind

+1

在C中,通常返回堆栈和参数堆栈是相同的。参数和返回地址是(通常,这不是必需的)在机器堆栈上。但是C也可以在寄存器中传递参数,并且通常也将它们返回寄存器中。这就是为什么C不是像Forth这样基于堆栈的语言。第四,堆栈对语言至关重要。 –

+1

在第四种情况下,返回堆栈通常也用作临时存储,例如,从数据堆栈中获取值,因此更容易访问它们“下方”的值。它通常在异常处理中发挥作用。它不仅用于记住返回地址。实际上,这样的返回值并不是强制性的。 –

回答

5

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

该语言可以以只需要一个堆栈的方式进行编译。

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

3

前言:我写的硬件调试器扩展追查一些问题搞砸调用栈,所以我已经看到了实际C栈的一些六角转储。

C堆栈由返回地址,局部变量和函数参数混合而成。对于每个函数,你可以找出它在哪里期望哪个值,但是这个知识停留在函数的范围内。

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

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

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

没有任何好处,就像在现代计算机体系结构中一样,每个寄存器都可以用作堆栈指针,所以你可以有一堆没有任何问题的堆栈。因此,最后,你的问题的答案是:是的,你可以实现一个堆栈派生forth,但它是没有收益的痛苦。

相关问题