NEOVM 就是 NEO& 39;s VM拆開就很清楚了,Neo區(qū)塊鏈系統(tǒng)中使用的虛擬機。虛擬機就是虛擬的電腦,現(xiàn)在我們通常提到的虛擬機有兩種典型的形式
NEOVM 就是 NEO's VM
拆開就很清楚了,Neo區(qū)塊鏈系統(tǒng)中使用的虛擬機。
虛擬機就是虛擬的電腦,現(xiàn)在我們通常提到的虛擬機有兩種典型的形式。
1.1一種是對一臺電腦完整的模擬
比如hyper-V,VMWare
還有街機模擬器
1.2另一種是僅僅作為執(zhí)行環(huán)境
比如JVM 比如dotnet framework 比如V8\lua
對于開發(fā)者來說,面對的執(zhí)行環(huán)境又分為兩大類情況。
1.2.1 公用執(zhí)行環(huán)境
公用執(zhí)行環(huán)境,比如java c# python
1.2.2 一種是嵌入式執(zhí)行環(huán)境
舉個例子,比如lua 就是一種典型的嵌入式腳本。
當然也有通過mono 和 v8,把c# 和 js 作為嵌入式腳本使用的情況。
2 NeoVM是什么
NeoVM的形式就是上文 1.2.2 這種,和Lua相似,是一種嵌入式的執(zhí)行環(huán)境。
NeoVM是一種基于圖靈機模式的虛擬機,通過磁頭在磁帶上的移動改變狀態(tài),以此來實現(xiàn)邏輯運算。
NeoVM 是 不依賴于Neo項目的一個單獨系統(tǒng),NeoVM只提供純粹的邏輯計算能力,采用可擴展的互操作方式,后插入虛擬機可以調(diào)用的功能。
NeoVM的設(shè)計更貼近機器,執(zhí)行的代碼段是一個內(nèi)存塊,執(zhí)行時即時將數(shù)據(jù)解析為指令。
3 NeoVM的執(zhí)行方式
要說明這件事情我們必須得復習一下圖靈機了
忽略我丑陋的字跡
這里就假設(shè)你了解磁帶式音樂播放器的工作原理,要不然head 和 tape 就變成一個晦澀的概念了。
1.在一條磁帶tape上寫上指令。
2.磁頭head負責讀取當前指令
3.指令集是已知的 圖中展示了四條指令
nop 啥也不做 push [n] 將一個數(shù)字推到calcstack 中 add 從calcstack中取兩個值,將他們相加,再放回calcstack中 ret 結(jié)束當前執(zhí)行。
4.寄存器空間來管理狀態(tài),對NeoVM來說寄存器是兩個Stack,CalcStack 和 AltStack。
有磁帶,有磁頭,指令集,狀態(tài)空間,這就是一個圖靈機了。
4 Talk is cheap
讓我們來研究一下代碼吧
代碼在 samples/turing01
不到100行代碼,模擬了那副丑陋的畫里的圖靈機執(zhí)行過程。
首先是準備好寫著代碼的磁帶
NOP
PUSH 1
PUSH 2
ADD
RET
然后滾動磁帶,讓代碼一條條滾到磁頭下面
while(!vm.stop)
{
...
}
這里涉及到圖靈機的停機問題,ret指令就是來通知停機的,要不然我們就會一直滾動下去。當然也可以依賴紙帶的長度來停機,實際上NEOVM是設(shè)計為紙帶用完自動停機的 相信不會有人懷疑這個程序得到的retvalue是3。
讓我們來分析一下發(fā)生了什么。
這只是模擬程序,一次說明一個問題,我們用class Head表示磁頭,用List表示磁帶
滾動磁帶是通過head.pos的累加
狀態(tài)空間 是 stop變量 和 calcstack 棧
執(zhí)行指令的步驟寫在函數(shù)StepOne中
StepOne 的過程是 1.讀取磁帶上位于磁頭處的代碼 2.執(zhí)行代碼 3.滾動磁頭 head.pos++;
執(zhí)行代碼時就是操作狀態(tài)空間
NOP 什么也不干,但NOP依然是最重要的指令之一,你就把他當作空格就好了。
RET 直接導致停機,磁頭也不再滾動, 磁頭位置也是狀態(tài)空間的一部分,指令可以導致磁頭位置變化,這一點很重要,因為流程控制的本質(zhì)就是磁頭位置變化,所有 的 if for while 邏輯,最后落實到vm上都是在改變磁頭位置。
PUSH 往calcstack上推一個值
ADD 從calcstack取兩個值,相加后再放回去
如果你跑起這個程序,斷點,一步步StepOne,觀察calcstack,你會發(fā)現(xiàn):
1.nop 之后,什么也沒有發(fā)生 2.push 1 之后,calcstack里面是 [1] 3.push 2 之后,calcstack里面是 [2,1] 4.add 之后,calcstack 里面是 [3] 5.ret 之后,stop 變成true了,于是循環(huán)就結(jié)束了。
這就是NEOVM的工作原理了。
對NEOVM來說 .avm 就是這條tape了,不同之處在于avm是byte[],不是像我們這里使用的List 這么結(jié)構(gòu)化。
這篇的目的是解釋NEOVM是什么,是怎么工作的,先用這個簡單的程序進行說明。(李劍英)