像C这样的语言使用局部变量和返回地址的系统堆栈。Forth 有数据堆栈和返回堆栈。是否有 Forth 的实现使用系统堆栈作为返回堆栈,因此使用 return 指令来结束单词的执行?这是一种可行的方法吗?
本机call
和ret
指令用于子例程线程代码中。在这种情况下,系统堆栈在 Forth 中扮演返回堆栈的角色。
SP-Forth/4 是使用这种方法(参见 forthproc(以及窥视孔优化的 Forth 系统的示例。
是的,这是完全可行的。
它可能仅在编译单词而不是解释单词时才有用,并且如果您想捕获返回堆栈错误而不仅仅是崩溃,则需要编写某种堆栈帧约定。
可以制作一种只使用一个堆栈的类似 Forth 的语言,但如果你想要一个与标准 Forth 程序兼容的 Forth,则需要单独的数据堆栈和返回堆栈。 Forth 将参数从一个函数传递到另一个函数,只需将它们留在数据堆栈上即可;如果同时使用一个堆栈进行数据和流控制,则需要小心在函数结束之前清除堆栈中的数据。
有些计算机的每个寄存器都可以用作堆栈指针。返回堆栈是在执行调用时推送返回地址的地方,至少假设该指令可用。
有不同的 Forth 实现范例、本机代码和线程代码。这意味着您通常为 Forth 数据堆栈和 Forth 返回堆栈保留两个寄存器。 在本机代码中,将处理器返回堆栈用作 Forth 返回堆栈更有意义,您可以在其中生成调用和返回指令。在线程代码中,可以为 Forth 数据堆栈选择返回堆栈,以便利用特殊的推送和弹出指令来提高速度和紧凑性,并且必须为 Forth 返回堆栈指针选择另一个寄存器。
最重要的是,Forth的普通用户不会注意到它。如果你正在实现一个 Forth,你可能会考虑更多的情况,特别是返回堆栈在与操作系统接口时扮演什么角色。最重要的是,这是一个设计决策,Forth用户并不特别注意到。
这个评论有点面向ARM和AMD86处理器。例如,对于 1802 处理器,这个问题几乎没有意义。