上一篇區塊鏈研究方案
先整理一下Neo編譯器的知識吧。git
框架程序員
你們能夠看到Compiler所處的位置github
下面的圖主要顯示代碼的主要流程:算法
基本的流程windows
先看一段智能合約代碼框架
這段代碼沒有什麼實際的做用,就是返回a+b,可是main能夠接受參數。函數
using Neo.SmartContract.Framework; using Neo.SmartContract.Framework.Services.Neo; public class Sum : SmartContract { public static int Main(int a, int b) { return a + b; } }
main function IL code區塊鏈
IL_0000 Nop IL_0001 Ldarg_0 IL_0002 Ldarg_1 IL_0003 Add IL_0004 Stloc_0 IL_0005 Br_S IL_0007 Ldloc_0 IL_0008 Ret
這段代碼很簡單,就是讀取參數Ldarg_0,Add,返回。能夠看到CLR的虛擬機也是堆棧虛擬機。
關於基於棧的虛擬機和基於寄存器的虛擬機能夠看一下這些文章:
棧式虛擬機和寄存器式虛擬機?
另外還有一篇概念講解的很詳細的文章虛擬機隨談(一):解釋器,樹遍歷解釋器,基於棧與基於寄存器,大雜燴spa
爲了感性的認識neo編譯器作了什麼,咱們能夠看一下上面的只能合約被翻譯成了什麼翻譯
hex:53-C5-6B-6C-76-6B-00-52-7A-C4-6C-76-6B-51-52-7A-C4-61-6C-76-6B-00-C3-6C-76-6B-51-C3-93-6C-76-6B-52-52-7A-C4-62-03-00-6C-76-6B-52-C3-61-6C-75-66
其實是一串數字了,每一個數字對應一個vm的操做碼或者是數值,爲了更好理解,把彙編代碼放出來
PUSH4 PUSH3 RET PUSH3 NEWARRAY TOTALSTACK FROMALSTACK DUP TOALTSTACK PUSH0 PUSH2 ROLL SETITEM FROMALSTACK DUP TOTALSTACK PUSH1 PUSH2 ROLL SETITEM NOP FROMALSTACK DUP TOTALSTACK PUSH0 PICKITEM FROMALSTACK DUP TOTALSTACK PUSH1 PICKITEM ADD FROMALSTACK DUP TOTALSTACK PUSH2 PUSH2 ROLL SETITEM JMP FROMALSTACK DUP TOTALSTACK PUSH2 PICKITEM NOP FROMALSTACK DROP ret
neo彙編的說明,能夠查看這個文檔
咱們能夠發現以下狀況:
代碼閱讀仍是很頭痛的,因此作了兩個腦圖:
對象關係
看完這個文章,並不能瞭解到具體的細節,具體的細節已經在代碼中,這篇文章的主要目的是提供不少資料,提供大的框架,幫助對Neo.Compiler感興趣的程序員加速閱讀代碼的速度。
做者:沈寅
原文連接:https://www.jianshu.com/p/646...