仅用一个堆栈就可以实现类似 Forth 的语言吗?
Can a Forth-like language be implemented with just one stack?
Forth 有一个堆栈和一个 return-堆栈。
据我了解,return-stack 的要点是存储程序计数器的先前值。
C 程序将程序计数器的先前值放在堆栈上,并且不使用 return 堆栈。
Forth 是否只需要一个 return 堆栈,因为它 return 的结果在堆栈上,因此程序计数器的先前值可以被掩埋?
"Portable Assembly Language" 应该很接近。这是一个编译器的概念,用于一种几乎与 standard/traditional Forth 相同的语言。对于可以编写哪种程序有一些限制。大多数情况下,您必须避免无法静态确定堆栈深度的情况。
这种语言可以用一种只需要一个堆栈的方式编译。
http://www.complang.tuwien.ac.at/anton/euroforth/ef13/papers/ertl-paf.pdf
前言:我已经为硬件调试器编写了扩展程序来跟踪混乱调用堆栈的一些问题,所以我看到了一些实际 C
堆栈的十六进制转储。
C
堆栈由 return 地址、局部变量和函数参数的混合组成。对于每个函数,您可以找出它期望哪个值的位置,但这种知识仅限于函数的范围。
您也可以用 forth
这样做,但这意味着巨大的开销:您可以将参数放在堆栈上并调用函数,将 return 地址放在顶部同一个堆栈。没问题:每个命令都知道操作数在堆栈中是第二个和后面的。但是现在该命令想要使用这些值调用另一个命令:这使得有必要更改堆栈的顺序以再次将这些值放在顶部,因为被调用的命令无法知道它们在堆栈中的位置,因为您写了。
更复杂的 forth
编译器可以跟踪每个命令采用多少个值,并在每次命令调用之前对堆栈进行排序。但代价是什么!
当然,C
程序也有这种开销。如果在内联汇编中看到非内联函数调用,则总会有一些寄存器交换开销。但是好的 forth
程序由微小的函数组成,所以你有更多的函数调用和更多的开销。
而且没有任何好处,因为在现代计算机体系结构中,每个寄存器都可以用作堆栈指针,因此您可以毫无问题地拥有少量堆栈。
所以最后,你的问题的答案是:是的,你可以实现forth
的单栈导数,但这是痛苦的,没有收获。
“Forth 有一个堆栈和一个 return-堆栈。”对于每一个现存的和之前的 Forth 标准,对于标准前的方言,甚至对于像 colorforth 这样有些人犹豫是否称之为 Forth 的方言,都是如此。
所以你已经回答了你自己 question:A 响亮的否定。
这两个堆栈是 Forth 编程模型的核心。程序员有权操纵两者。
原因当然是您自己处理数据,return 地址会挡道。
如果非要和C比较的话,C是按名字操作数据,处理returning。事实上,C 在其编程模型中没有堆栈。使用一个堆栈是您不应该担心的实现细节。
Forth 有一个堆栈和一个 return-堆栈。
据我了解,return-stack 的要点是存储程序计数器的先前值。
C 程序将程序计数器的先前值放在堆栈上,并且不使用 return 堆栈。
Forth 是否只需要一个 return 堆栈,因为它 return 的结果在堆栈上,因此程序计数器的先前值可以被掩埋?
"Portable Assembly Language" 应该很接近。这是一个编译器的概念,用于一种几乎与 standard/traditional Forth 相同的语言。对于可以编写哪种程序有一些限制。大多数情况下,您必须避免无法静态确定堆栈深度的情况。
这种语言可以用一种只需要一个堆栈的方式编译。
http://www.complang.tuwien.ac.at/anton/euroforth/ef13/papers/ertl-paf.pdf
前言:我已经为硬件调试器编写了扩展程序来跟踪混乱调用堆栈的一些问题,所以我看到了一些实际 C
堆栈的十六进制转储。
C
堆栈由 return 地址、局部变量和函数参数的混合组成。对于每个函数,您可以找出它期望哪个值的位置,但这种知识仅限于函数的范围。
您也可以用 forth
这样做,但这意味着巨大的开销:您可以将参数放在堆栈上并调用函数,将 return 地址放在顶部同一个堆栈。没问题:每个命令都知道操作数在堆栈中是第二个和后面的。但是现在该命令想要使用这些值调用另一个命令:这使得有必要更改堆栈的顺序以再次将这些值放在顶部,因为被调用的命令无法知道它们在堆栈中的位置,因为您写了。
更复杂的 forth
编译器可以跟踪每个命令采用多少个值,并在每次命令调用之前对堆栈进行排序。但代价是什么!
当然,C
程序也有这种开销。如果在内联汇编中看到非内联函数调用,则总会有一些寄存器交换开销。但是好的 forth
程序由微小的函数组成,所以你有更多的函数调用和更多的开销。
而且没有任何好处,因为在现代计算机体系结构中,每个寄存器都可以用作堆栈指针,因此您可以毫无问题地拥有少量堆栈。
所以最后,你的问题的答案是:是的,你可以实现forth
的单栈导数,但这是痛苦的,没有收获。
“Forth 有一个堆栈和一个 return-堆栈。”对于每一个现存的和之前的 Forth 标准,对于标准前的方言,甚至对于像 colorforth 这样有些人犹豫是否称之为 Forth 的方言,都是如此。
所以你已经回答了你自己 question:A 响亮的否定。 这两个堆栈是 Forth 编程模型的核心。程序员有权操纵两者。
原因当然是您自己处理数据,return 地址会挡道。 如果非要和C比较的话,C是按名字操作数据,处理returning。事实上,C 在其编程模型中没有堆栈。使用一个堆栈是您不应该担心的实现细节。