上一篇区块链研究方案
先整理一下Neo编译器的知识吧。git
框架程序员
你们能够看到Compiler所处的位置github
下面的图主要显示代码的主要流程:算法
基本的流程windows
先看一段智能合约代码框架
这段代码没有什么实际的做用,就是返回a+b,可是main能够接受参数。ide
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的虚拟机也是堆栈虚拟机。
关于基于栈的虚拟机和基于寄存器的虚拟机能够看一下这些文章:
栈式虚拟机和寄存器式虚拟机?
另外还有一篇概念讲解的很详细的文章虚拟机随谈(一):解释器,树遍历解释器,基于栈与基于寄存器,大杂烩区块链
为了感性的认识neo编译器作了什么,咱们能够看一下上面的只能合约被翻译成了什么spa
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/6461b4e18089