基於寄存器與基於棧__java

來源:互聯網
上載者:User

對於我們而言,基於寄存器都比較熟悉,我們熟悉的x86和arm指令大多如此。那麼基於棧是什麼。實際上基於棧對於一些資源稀缺型的裝置(機頂盒、嵌入式)使用比較多。而JVM採用基於棧的原因是因為Java的設計想法就是既能運行於伺服器,又能運行於嵌入式裝置(Java ME),因為基於棧的通用性比較好所以JVM採用它。 基於棧的本質

基於棧本質是利用了操作棧儲存了運算元,替代了運算元放在指令中的方式(基於寄存器)。

以下引自: 基於棧的虛擬機器 VS 基於寄存器的虛擬機器
例如執行”a = b + c”,在基於棧的虛擬機器上位元組碼指令如下所示:

I1: LOAD C
I2: LOAD B
I3: ADD
I4: STORE A

由於運算元都是隱式地,所以指令可以做的很短,一般都是一個或者兩個位元組。但是顯而易見就是指令條數會顯著增加。而基於寄存器虛擬機器執行該操作只有一條指令:

I1: add a, b, c

其中a,b,c都是虛擬寄存器。運算元棧上的變化如下圖所示:

首先從符號表上讀取資料壓入運算元棧,

然後從棧中彈出運算元執行加法運算,這步操作有物理機器執行,如下圖所示:

兩者代碼比較

以下引自:Android Dalvik虛擬機器初識
我們從下面的截圖可以明了的看到與同一段Java代碼對應的Java bytecode 與Dalvid bytecode的比較。

【說明】

0x04 iconst_1 將int型1推送至棧頂(操作棧)
0x05 iconst_2 將int型2推送至棧頂
0x1a iload_0 將第一個int型本地變數(從局部變數表)推送至棧頂
0x1b iload_1 將第二個int型本地變數推送至棧頂

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.