CPU架構中的棧和寄存器?

在虛擬機方面看到很多基於棧和基於寄存器的虛擬機。

查詢很多說CPU也分棧和寄存器。

在這裡想問問,基於棧和基於寄存器CPU的優缺點。

基於棧和基於寄存器和CISC和RISC之間的關係

還有以上的和Core2 i5 i7 的關係到底是怎麼回事。


謝邀。這是我以前寫的回答裡面的一個片段

x86一開始並沒有使用太多的通用寄存器,原因之一(注意,只是之一)是當時的編譯器無力進行寄存器分配,讓編譯器自動決定程序中眾多變數哪些應該裝入寄存器哪些應該換出、哪些變數應該映射到同一個寄存器上,並不是一件易事,JVM採用堆棧結構的原因之一就是不信任編譯器的寄存器分配能力,轉而使用堆棧結構,躲開寄存器分配的難題。

到80年代早期,IBM的G. J. Chaitin公開了他們的圖染色寄存器分配演算法之後,編譯器的分配能力獲得長足進步,形成了現在這樣的編譯器主導的寄存器分配格局,這個寄存器分配演算法是IBM內部進行的一個RISC早期試驗項目的一部分,但是我並沒有看到有公開資料表明他們當時已經意識到RISC的寄存器數目將帶來的性能暗示,而在圖著色演算法走向公開、成熟之前,RISC的理念就已經定型了,所以我也不認為RISC構建過程中有非常注重寄存器數目的考量,寄存器數目只是RISC發展中一個有意無意的副產品。當時RISC的主力推手之一,我們這個領域的泰山北斗David Patterson與DEC VAX團隊的兩位架構師Douglas W. Clark and William D. Strecker在《體系結構通訊》(CAN)上刊文論戰時也並未以寄存器數目優勢來說事。(推薦拙作一篇,RISC誕生與發展的縮影)

【2015.03.11修正:我看到G. J. Chaitin在1980年發在Computer Languages上的圖染色寄存器分配論文裡面寫道他們儘力爭取有更多的計算分配到通用寄存器上來,並且和當時其他的編譯器做法不同,他們儘力不去把寄存器交付給專門用途,而是選擇把盡量多的寄存器合併成一個池子,由此推論,我相信他們當時已經非常清醒地意識到了通用寄存器數目的價值。】

操作數分類上 @龔黎明 已經講得很好了,這是一個補充。


其實是指令系統分成堆棧型和寄存器型。不光這兩種,指令系統共有四種分類,堆棧型,累加器型,寄存器-存儲器型和寄存器-寄存器型。分類的依據是操作數的來源。堆棧型默認的操作數都在棧頂,累加器型默認一個操作數是累加器,寄存器-存儲器型的操作數可以是寄存器或者內存,寄存器-寄存器型除了訪存指令,操作數都是寄存器。早期的計算機結構簡單,為了簡化指令,所以經常使用堆棧或者累加器型的指令,如今的CPU早就有足夠的晶體管來支持複雜設計,為了性能著想,大量使用寄存器型的指令,原因在於寄存器離CPU最近,所以延時最短,取指最快,有利於主頻提高。再次,寄存器的相關性容易判斷,有利於實現指令流水,多發射和亂序執行,對提高並發有極大的好處。intel的X86還保留有累加器指令和堆棧型指令,這是為了歷史兼容。很多現今的RISC處理器,除了load和store指令訪存外,只支持對寄存器操作,不支持對堆棧以及內存的直接操作,所以這種體系結構又叫做load-store架構。


棧和寄存器有一個簡單的邏輯關係。寄存器是最頂 stack frame 的隨機訪問方式。

什麼是寄存器 ? 技術奇異點

CPU 的寄存器是對邏輯寄存器的硬體優化。

基於棧的虛擬機就是每條指令只能訪問 top-most 的一到兩個 stack entry。基於寄存器的虛擬機是每條指令可以自由訪問 top-most stack frame 里的任意 stack entry。

把虛擬機的定義放到 CPU 上來說,沒有基於棧的 CPU。因為幾乎所有 CPU 都允許訪問棧的任何一個 entry。只能說 compiler 是否選擇這些指令。不過,如果 CPU 的硬體寄存器比較少,top-most stack frame 都在主存里,習慣上就說是基於棧了。不過這個概念已經和虛擬機的分類法沒什麼關係了。

RISC CPU 一般硬體寄存器比較多。也就是說有更多的 top-most stack frames 可以做硬體優化。CISC 只是更少的硬體優化。


推薦閱讀:

TAG:中央處理器CPU | 計算機科學 | 精簡指令集RISC |