堆棧機(jī)
堆棧機(jī),全稱為“堆棧結(jié)構(gòu)機(jī)器”,即英文的 “Stack Machine”。基于堆棧機(jī)模型實(shí)現(xiàn)的計(jì)算機(jī),無論是虛擬機(jī)還是實(shí)體計(jì)算機(jī),都會使用“棧”這種結(jié)構(gòu)來實(shí)現(xiàn)數(shù)據(jù)的存儲和交換。棧是一種“后進(jìn)先出(LIFO)”的數(shù)據(jù)結(jié)構(gòu),即最后被放入棧容器的數(shù)據(jù)會被最先取出。
堆棧機(jī)的指令集中包含了零地址指令(“0-operand” instruction set),硬件在運(yùn)行運(yùn)算時(shí),使用兩種基本操作進(jìn)行運(yùn)算:
- 推入:將數(shù)據(jù)放入堆棧的頂端(數(shù)組形式或串列形式),堆棧頂端 top 指針加一。
- 彈出:將頂端數(shù)據(jù)輸出(回傳),堆棧頂端數(shù)據(jù)減一。
累加器機(jī)
累加器機(jī),英文為“Accumulator Machine”,是一種寄存器,用來存儲計(jì)算產(chǎn)生的中間結(jié)果。累加器機(jī)模型是一種古老的計(jì)算模型,僅能夠支持單一值的累加寄存器單元,因此,基于累加器機(jī)模型設(shè)計(jì)的指令都只支持一個(gè)操作數(shù)。
寄存器機(jī)
寄存器機(jī),英文為 Register Machine,也譯為暫存器機(jī),這種計(jì)算模型的機(jī)器,使用特定的 CPU 寄存器組,來作為指令執(zhí)行過程中數(shù)據(jù)存儲和交換的容器。
在寄存器中,由于每一條參與到數(shù)據(jù)交換和處理的指令,都需要顯示地標(biāo)記操作數(shù)所在的寄存器,相較于堆棧機(jī)和累加器機(jī),指令更長,但也更加靈活。
三種計(jì)算模型的比較
- 堆棧機(jī)使用棧結(jié)構(gòu)作為數(shù)據(jù)存儲與交換的容器,由于其“先進(jìn)后出”的特性,無法直接操作位于棧底的數(shù)據(jù),因此,在特殊情況下,機(jī)器會使用額外的指令來進(jìn)行棧數(shù)據(jù)的交換過程,從而損失一定的執(zhí)行效率。但另一方面,堆棧機(jī)模型實(shí)現(xiàn)簡單,指令代碼長度適中。
- 累加器機(jī)由于只有一個(gè)累加器寄存器可用于存儲數(shù)據(jù),因此在指令的執(zhí)行過程中,可能會頻繁請求機(jī)器的線形內(nèi)存,從而導(dǎo)致一定的性能損耗。但另一方面,該模型最多只能有一個(gè)操作數(shù),因此對應(yīng)的指令代碼較為精簡。
- 寄存器機(jī)內(nèi)大多數(shù)與數(shù)據(jù)操作相關(guān)的指令,都需要在執(zhí)行時(shí)指定目標(biāo)寄存器,因此,指令代碼的長度較長。寄存器機(jī)擁有更多的數(shù)據(jù)暫存容器,一方面,靈活的數(shù)據(jù)操作導(dǎo)致寄存器的分配和使用規(guī)則變得復(fù)雜,另一方面,在使用得當(dāng)?shù)那闆r下,同樣的計(jì)算邏輯,基于寄存器機(jī)模型,可以生成更為高效的指令執(zhí)行結(jié)構(gòu)。
最后
我的個(gè)人主頁 里也同步進(jìn)行了更新,歡迎來逛逛。