2017-05-17 77 views
2

Forth有一個堆棧和一個返回堆棧。只有一個堆棧可以實現類似Forth的語言嗎?

據我所知,返回棧的重點是存儲程序計數器的以前的值。

C程序將程序計數器的前一個值放入堆棧,並且不使用返回堆棧。

確實只需要一個返回堆棧,因爲它返回棧上的結果,因此程序計數器的前一個值可以被掩埋?

+1

我不是專家,但我想在C中它有助於參數的大小(這是你需要通過以獲取到返回地址的數據)在編譯時已知,和靜態。所以是返回值的大小。在第四,這兩個都不知道。 – unwind

+1

在C中,通常返回堆棧和參數堆棧是相同的。參數和返回地址是(通常,這不是必需的)在機器堆棧上。但是C也可以在寄存器中傳遞參數,並且通常也將它們返回寄存器中。這就是爲什麼C不是像Forth這樣基於堆棧的語言。第四,堆棧對語言至關重要。 –

+1

在第四種情況下,返回堆棧通常也用作臨時存儲,例如,從數據堆棧中獲取值,因此更容易訪問它們「下方」的值。它通常在異常處理中發揮作用。它不僅用於記住返回地址。實際上,這樣的返回值並不是強制性的。 –

回答

5

「可移植彙編語言」應該關閉。對於與標準/傳統Forth幾乎相同的語言,這是一種編譯器的概念。對於哪種類型的程序可以編寫有一些限制。大多數情況下,您必須避免堆棧深度無法靜態確定的情況。

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

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

3

前言:我寫的硬件調試器擴展追查一些問題搞砸調用棧,所以我已經看到了實際C棧的一些六角轉儲。

C堆棧由返回地址,局部變量和函數參數混合而成。對於每個函數,你可以找出它在哪裏期望哪個值,但是這個知識停留在函數的範圍內。

您也可以用forth這樣做,但這意味着巨大的開銷:您可以將參數放在堆棧上並調用函數,將返回地址放在同一堆棧的頂部。沒問題:每個命令都知道操作數是第二個並且在堆棧中。但是現在命令想要用這些值調用另一個命令:這使得需要改變堆棧的順序以將值重新放在頂部,因爲被調用的命令無法知道它們被埋在堆棧中的哪個位置,中寫道。

更復雜的forth編譯器可以跟蹤每個命令在每次命令調用之前需要佔用多少個值並對堆棧進行排序。但費用是多少!

當然,C程序也有這個開銷。如果在內聯彙編中看到非內聯函數調用,則總會有一些寄存器交換開銷。但好的forth程序由微小的函數組成,所以你有更多的函數調用和更多的開銷。

沒有任何好處,就像在現代計算機體系結構中一樣,每個寄存器都可以用作堆棧指針,所以你可以有一堆沒有任何問題的堆棧。因此,最後,你的問題的答案是:是的,你可以實現一個堆棧派生forth,但它是沒有收益的痛苦。

相關問題