1. 程式人生 > >java 虛擬機器如何翻譯位元組碼 基於棧和基於暫存器的區別

java 虛擬機器如何翻譯位元組碼 基於棧和基於暫存器的區別

java 編譯 解釋執行

javac 編譯器 完成了程式程式碼經過詞法分析, 語法分析, 到抽象語法樹, 在遍歷語法樹生成線性的位元組碼指令流的過程
javac 最後是生成了.class 的位元組碼
最後位元組碼需要翻譯成機器語言才能執行

基於棧和基於虛擬機器的指令集

基於棧執行 1 + 1, 是如下的指令集

iconst_1
iconst_1
iadd
istore_0

兩臺 iconst_1 連續把兩個常量 1 壓入棧後, iadd 指令把棧頂的兩個值出棧並想家, 然後再把結果放回棧頂, 最後 istore_0 把棧頂的值放到區域性變量表的第0個 Slot 中

基於暫存器的指令集如下

mov eax,1
add eax,1

mov 指令把 EAX 暫存器的值設為1, 然後 add 指令再把這個值加1, 結果就儲存在 EAX暫存器中

基於棧和基於暫存器的區別

棧架構指令集的主要缺點是執行速度相對來說稍微慢一些

基於堆疊的機器需要更多指令,而基於暫存器的機器指令更長。

Android 是基於暫存器的Dalvik虛擬機器

Dalvik虛擬機器通過一個叫做dx的轉換工具,可以將傳統的JVM虛擬機器中的位元組碼(.class格式檔案)轉換為在Dalvik虛擬機器中執行的位元組碼(dex格式)

Dalvik 經過優化,每個 App 開啟一個虛擬機器示例,這樣保證一個 App 的崩潰不會導致整個虛擬機器崩潰。

它允許在有限的記憶體中同時執行多個虛擬機器的例項,並且每一個Dalvik 應用作為一個獨立的Linux 程序執行。獨立的程序可以防止在虛擬機器崩潰的時候所有程式都被關閉。

參考文章