簡體   English   中英

可以只用一個堆棧來實現類似 Forth 的語言嗎?

[英]Can a Forth-like language be implemented with just one stack?

Forth 有一個棧和一個返回棧。

據我了解,返回堆棧的重點是存儲程序計數器的先前值。

C 程序將程序計數器的先前值放在堆棧上,並且不使用返回堆棧。

Forth 是否只需要一個返回堆棧,因為它在堆棧上返回結果,因此程序計數器的先前值可能會被掩埋?

“便攜式匯編語言”應該很接近。 這是一個幾乎與標准/傳統 Forth 相同的語言的編譯器概念。 對於可以編寫的程序類型有一些限制。 大多數情況下,您必須避免無法靜態確定堆棧深度的情況。

這種語言可以以只需要一個堆棧的方式進行編譯。

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

前言:我已經為硬件調試器編寫了擴展來跟蹤混亂的調用堆棧的一些問題,所以我看到了一些實際C堆棧的十六進制轉儲。

C堆棧由返回地址、局部變量和函數參數的混合組成。 對於每個函數,您可以找出它期望哪個值的位置,但這種知識僅停留在函數的范圍內。

你可以這樣來做forth為好,但這意味着一個巨大的開銷:您可以將堆棧上的參數,調用函數,將返回地址在同一個堆棧的頂部。 沒問題:每個命令都知道操作數在堆棧中是第二個和后面的。 但是現在命令想要使用這些值調用另一個命令:這使得有必要更改堆棧的順序以再次將值放在頂部,因為被調用的命令無法知道它們在堆棧中的位置,因為您寫道。

更復雜的forth編譯器可以跟蹤每個命令采用多少個值,並在每個命令調用之前對堆棧進行排序。 但代價是什么!

當然, C程序也有這種開銷。 如果您在內聯匯編中看到非內聯函數調用,那么總會有一些寄存器交換開銷。 但是,良好的forth程序由微小的功能,讓你有更多的函數調用和更大量的開銷。

而且沒有任何好處,就像在現代計算機體系結構中一樣,每個寄存器都可以用作堆棧指針,因此您可以毫無問題地擁有少量堆棧。

所以最后,回答你的問題是:是的,你可以實現的一組衍生forth ,但它的痛苦沒有增益。

“Forth 有一個棧和一個返回棧。” 對於每一個現存的和之前的 Forth 標准,對於前標准方言,甚至對於像 colorforth 這樣的方言,有些人不願將其稱為 Forth。

所以你已經回答了你自己的問題:一個響亮的不。 這兩個堆棧是 Forth 編程模型的核心。 程序員有權操作兩者。

原因當然是您自己處理數據並且返回地址會礙事。 如果您堅持將其與 C 進行比較,C 將按名稱操作數據,並處理返回。 事實上,C 在其編程模型中沒有堆棧。 使用一個堆棧是一個您不應該擔心的實現細節。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM