2011-02-24 76 views
3

正常CPU(例如Android設備)是基於寄存器的機器。 Java虛擬機是基於堆棧的機器。但是基於堆棧的機器是否依賴基於寄存器的機器來工作?不能基於堆棧的機器運行孤獨,因爲它不是一個操作系統?除JVM之外是否有任何基於堆棧的機器示例?有些人說1操作數,2操作數;你爲什麼需要這個?基於堆棧的機器取決於基於寄存器的機器?

+0

我認爲這個問題應該屬於程序員.stackexchange.com雖然它非常好,我也對它的答案感興趣。 – 2011-02-24 09:21:45

回答

7

JVM沒有提到任何地方存在寄存器。從它的角度來看,內存只存在於少數幾個地方,例如每線程堆棧,方法區域,運行時常量池等。也就是說,如果您想實際實現遵循JVM的物理設備, d幾乎肯定需要寄存器來保存執行某些字節碼時產生的一些臨時值,或者保持一些額外的暫存信息。例如,請嘗試查找multianewarray指令,並查看是否可以在沒有寄存器的情況下實現它。 :-)

一個並行的你可以在真實的CPU中發現,儘管有些專用的寄存器可供程序員使用,但是大多數CPU都有更多的寄存器用於內部用於各種目的。例如,大多數MIPS芯片都有大量用於流水線的寄存器。它們像前面指令中的控制位一樣。如果x86有任何不同,我會被吹走。

需要記住的是,它不是真正定義基於寄存器的機器與基於堆棧的機器如何工作的寄存器。在大多數體系結構中,您都有O(1)個專用於內部使用的寄存器。即使JVM也有這些 - 每個方法都有一個「局部變量數組」,它最初保存函數的參數,但如果需要的話,也可以用作臨時空間。有關堆棧機器與其他機器區別的更重要的部分是可擴展內存如何工作。在大多數計算機中,內存是隨機訪問的,您可以隨時從任何位置進行讀取。也就是說,有n個存儲位置,您可以隨時讀取O(n)個存儲器。在基於堆棧的機器中,您只能訪問堆棧頂部的幾個位置,因此您一次只能讀取O(1)個內存位置。

理論上,因爲JVM應該代表一個完整的虛擬機,所以你可以讓一臺啓動的計算機在沒有任何操作系統的情況下運行一個JVM(或者說,JVM就是操作系統,而你的「程序「只是Java字節碼和類文件)。

還有一些其他基於堆棧的語言,其中第一個想到的是Forth。我提到Forth是因爲它明確地是一種基於堆棧的語言;你所做的每件事都是操縱操作數堆棧。關於你原來的問題,這很酷,因爲你可以很容易地將它移植到嵌入式設備上,因此Forth曾經在愛好者中非常流行。爲了獲得一個完整的Forth解釋器,你不需要一個真正強大的操作系統 - 你只需要命令解釋器。現在福斯不太流行,但它仍然是一種非常酷的語言。

廣泛使用的另一種基於堆棧的語言是PostScript,它已經失去了許多對PDF的理解,但仍然廣泛用於需要在各種平臺上呈現可縮放圖形的環境。它在技術上是一種圖靈完整的編程語言,儘管很少有人這樣使用它。

+0

所以我們可以運行沒有寄存器的JVM ..我是對嗎? – 2011-02-24 12:29:46

+1

@Mikhail Naimy-理論上,是的,因爲JVM從來沒有在任何地方提到過「註冊」一詞,但實際上沒有。你必須有寄存器來實現JVM正常運行的硬件邏輯。 – templatetypedef 2011-02-24 20:09:21

+0

很好的答案。我把「O(1)」看作「常數」,將「O(n)」看作「全部可用」。是對的嗎? – 2013-02-16 22:38:38

6

我知道你已經選擇了你的答案,但我想解決整個「堆棧機器」的事情。

雖然大多數物理CPU實際上是註冊機器,但是堆棧機器已經作爲物理CPU。例如,Burroughs' B5000- and B6000-series machines,或者用於太空飛行的RTX2000-series芯片(最初由Chuck Moore在門陣列邏輯中實現,後來被商業化)。UCSD Pascalp-Machine在硬件上也是由各種實現者直接實現的。

在計算強度方面,寄存器和堆棧機大致相同。 (當然,這取決於您正在處理的寄存器堆棧機器的精確模型。)堆棧機器具有簡單性,小尺寸和可擴展性的優點。註冊機器往往速度更快。註冊機器可以模擬堆棧機器(這就是BP架構和SP註冊在x86架構中的原因!),並且堆棧機器可以自己模擬註冊機器(如果需要的話)。


編輯追加

我幾乎忘了你指向一個​​是深入討論了堆棧計算機。考夫曼對於堆棧式計算機有點狂熱,他預測他們是「新浪潮」是一個可悲的錯誤,但這是一個有趣的閱讀。

+0

小堆機器正在運行perfeclty沒有寄存器,請問你會回答嗎? – 2011-02-24 12:49:06

+1

註冊機器運行的方式相同,只能使用推送和彈出堆棧的操作碼,並在堆棧的頂部條目/條目上執行操作。閱讀我鏈接到的書。 – 2011-02-24 12:57:45

+0

+1,我已經使用您的文章中的信息來回答我在這裏發佈的問題:http://stackoverflow.com/questions/14603264/virtual-machine-and-none-virtual-machine-stack-and-trace/14608096#14608096。請隨時回答我的問題,以便我可以爲您提供一些功勞。 – w0051977 2013-01-30 15:52:25