atitit.虛擬機器與指令系統的設計 1
. 兩種計算模型
,堆疊機和狀態機
(基於暫存器的虛擬機器1
1.1.1. 堆疊機1
1.1.2. 狀態機2
2. 為什麼狀態機比堆疊機快呢?3
2.1.
stack based vm的指令範例4
3. 參考5
有了上面的基礎只是,我們就知道,堆疊機和狀態機不過是兩種不同的圖靈完整的計算模型而已。
所謂堆疊機,就是計算機的狀態是存在於堆疊之中,通過對堆疊中的元素進行運算和調整,來實現計算功能的計算機。
例如,要進行乙個1+2的加法運算,那麼就:
操作堆疊狀態
初始狀態
將1壓入棧中
1將2壓入棧中
1, 2
呼叫加法運算
3其典型代表就是python的虛擬機器,**如下:
push
1push2
add
作者:: 綽號:
老哇的爪子
(全名::
attilax
akbar al rapanui 阿提拉克斯 阿克巴 阿爾 拉帕努伊 )
漢字名:
艾龍,email:[email protected]
狀態機的基本原理就在於,它可以有有限種狀態,指令能夠讓它在不同的狀態之間進行轉換。
聽起來很抽象?
但其實,我們大部分寫**的時候都是對狀態機程式設計,比如c**:
inta = 1;
intb = 2;
intc = a + b;
其實這個狀態機有2^96種狀態(假設int是32位的),因為變數a有2^32種狀態(-2147483648~2147483647),b、c亦然。
操作a的狀態
b的狀態
c的狀態
初始狀態00
0a=110
0b=212
0c=a+b12
3典型代表就是lua的虛擬機器,應的**就是:
loadk 0 1
loadk 1 2
add 2 0 1
意思就是:
register[0] =
1register[1] =
2register[2] = register[
0] + register[1]
既然他們是圖靈等價的,那大家一定會很疑惑,為何狀態機比堆疊機快呢?
那麼我們要深入到虛擬機器內部,看看這些指令都是怎麼實現的。
為了便於大家理解,我所有的**都不是vm中的實際**,而是偽**。
首先來看看堆疊機:
switch
(op)
我們可以看到,大部分情況下,執行一條指令,除了原始的賦值操作外,還需要調整堆疊的棧頂指標(那些stack_adj巨集定義),再看看狀態機的實現:
switch
(op)
大家可以看到,在執行大部分指令時,狀態機虛擬機會比堆疊機要少一次調整堆疊的操作,這對效能會有很明顯的影響。
當然這也主要適用於interpreting的情況,在jit的情況下,會有很多深度優化,從而使得堆疊機的效能也能和狀態機一樣。
一般都是在當前stack
中獲取和儲存運算元的。比如乙個簡單的加法賦值運算
:a=b+c
,對於stack based vm
,一般會被轉化成如下的指令
:[plain]
view plain
copy
?1.
push b; // 將變數b的值壓入stack
2. push c; // 將變數c的值壓入stack
3. add; // 將stack頂部的兩個值彈出後相加,將結果壓入stack
4. mov a; // 將stack頂部結果放到a中
高效動態語言虛擬機器的設計(二) – 堆疊機vs狀態機 - 推酷.htm
虛擬機器 指令寫出
是的,還有幾個節點的指令生成沒有測試呢,包括流控制語句,io.不過呢,流控制是相對比較容易優化的,進行 生成指令再對比 的測試不太好維護,而 io 指令很簡單 所以要不這樣,把指令寫出來,然後開個虛擬機器執行,如果執行沒問題就算測試通過了.一些常見的語義錯誤處理在之前的之前的內容中都以注釋形式出現,...
微控制器指令系統 1
本篇部落格主要列出了微控制器的主要指令,供開發人員參考。作為乙個微控制器初學者,記住指令特別的痛苦,不過主要還是要理解,多練習指令,寫多了就記住了,這是乙個很自然的過程。目錄 一 定址方式 二 指令分類 1 資料傳送類指令 2 算術運算類指令 定址方式有七種 1.立即定址 如 mov a,3ah 2...
Bochs虛擬機器debug指令
在學習 linux核心完全注釋 時,為了方便,直接使用了趙博提供的linux 0.11 devel 040923.zip來debug,幫助理解 後來又在哈工大的 上發現了他們作業系統課程的實驗,同樣是關於linux 0.11版本的。後來在使用的過程中,我發現趙博使用的是bochs 2.1.1,而哈工...