【问题标题】:Can a Forth-like language be implemented with just one stack?一个类似 Forth 的语言可以用一个栈来实现吗?
【发布时间】:2017-10-16 21:38:18
【问题描述】:

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

据我了解,返回堆栈的目的是存储程序计数器的先前值。

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

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

【问题讨论】:

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

标签: stack forth concatenative-language


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    C 堆栈由返回地址、局部变量和函数参数的混合体组成。对于每个函数,您可以找出它期望哪个值的位置,但这种知识仅限于函数的范围。

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

    更复杂的forth 编译器可以跟踪每个命令的取值数量,并在每个命令调用之前对堆栈进行排序。但是要付出什么代价!

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

    并且没有任何好处,因为在现代计算机体系结构中,每个寄存器都可以用作堆栈指针,因此您可以毫无问题地拥有少量堆栈。

    所以最后,您的问题的答案是:是的,您可以实现 forth 的单栈导数,但这是没有收获的痛苦。

    【讨论】:

      【解决方案3】:

      “Forth 有一个栈和一个返回栈。”这适用于所有现存的和之前的 Forth 标准、标准前的方言,甚至像 colorforth 这样一些人不愿称之为 Forth 的方言。

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

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

      【讨论】:

        猜你喜欢
        • 2010-10-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多