【发布时间】:2017-10-16 21:38:18
【问题描述】:
Forth 有一个栈和一个返回栈。
据我了解,返回堆栈的目的是存储程序计数器的先前值。
C 程序将程序计数器的先前值放入堆栈,并且不使用返回堆栈。
Forth 是否只需要一个返回堆栈,因为它在堆栈上返回结果,因此程序计数器的先前值可能会被掩埋?
【问题讨论】:
-
我不是专家,但我想在 C 语言中,知道参数的大小(这是为了“获取”返回地址而需要通过的数据)是有帮助的在编译时,并且是静态的。返回值的大小也是如此。在 Forth 中,这两个都是未知的。
-
在C语言中,通常返回栈和参数栈是一样的。参数和返回地址(通常,这不是必需的)在机器堆栈上。但是 C 也可以在寄存器中传递参数,并且通常也可以在寄存器中返回它们。这就是为什么 C 不是像 Forth 这样的基于堆栈的语言的原因。在 Forth 中,堆栈对语言至关重要。
-
在 Forth 中,返回栈也经常被用作临时存储,例如从数据堆栈中获取值,因此更容易访问“低于”它们的值。它一般在异常处理中发挥作用。它不仅用于记住返回地址。实际上,这样的返回值存储在那里甚至不是强制性的。
-
所以,是的,这可能是可能的,但如果参数和局部变量通常不以随机方式访问(如在 C、Pascal 或大多数其他语言中),它会非常难以使用)。
-
问题的简短版本(在标题中)与实际提出的问题不一致。我已经否决了这个问题,但如果你解决这个问题,我会撤销它。
标签: stack forth concatenative-language