作爲參考,Burroughs B5000和Inmos Transputer是堆棧機器。 DEC PDP11有這樣靈活的尋址模式,它可以用作堆棧機器。我認爲Niklaus Wirth's Lilith可能是一個堆棧機器(超過20年前,我的腦海正在滑倒:-)
他們真的沒有任何寄存器名稱/編號的指令找到操作數,因爲他們在堆棧上。
指令可以將即時(常量)值加載到堆棧上,或加載/存儲到內存中。
所以他們是沒有add.w r0, r1, r5
或add.w eax, [#fe34]
。有add.w
。
所以一個例子(不是在所有準確,這是更復雜的)的彙編序列的可能是
loadstack 0xfe34 -- got fe34 onto stack
loadstackindirect -- use address on the stack, to load the value at that address
add.w -- assumes we already have the other operand on the stack
-- result back onto the stack
要計算並加載在數組中的值,可以使用堆棧因爲可能有沒有索引尋址模式。
因此,指令很小,大量的工作是隱式地使用堆棧和堆棧指針完成的。 IIRC Transputers實際上只有三個值,編譯器(或開發人員)必須確保維護。
XMOS現在出售一個現代的「等值」,並僱用一些相同的人。
自從我編寫Transputer代碼已經有20多年了,所以很抱歉有點含糊。
UCSD Pascal系統使用軟件定義的虛擬機,它是一個堆棧機器。這個想法是爲了創造一些可以移植到新電腦上的東西,但也易於編寫,易於編譯和合理的性能。它的虛擬機被定義爲它自己的Pascal方言。當它被移植到真正的計算機上時,寄存器將被用來保存堆棧指針,並且可能在處理堆棧頂部(通過寄存器)方面有一些獨創性,以獲得合理的性能。
他們*可以*在軟件中模擬它,老的JVM就是這樣做的。通常儘管堆棧機器代碼被編譯爲本地代碼(無論可能的架構如何)。堆棧機器代碼很好,因爲它具有簡潔的編碼,它很容易從AST生成並且相對容易分析。 – harold 2012-03-21 10:24:51