×
  • 澳门新莆京娱乐网站
  • 问卷调查
  • 问卷调查系统
  • 区块链
  • 大数据
  • 数据中心
  • 创建问卷
问卷调查系统工具软件推荐
区块链

高级语言

    DROP


    STLOC 0


    static void Main()

    const int b=2;

那么这样一条高级语言指令,显然是无法被转换的


    ADD


    RET

之前我们已经接头过地点转换了,那么这一篇就只是关于高级语言如何转换为AVM了

    PUSH 2
    PUSH 0//index

    STLOC 1

    PUSH 1//value

    //cleararray
    FROMALTSTACK
   return a + b;
实际上,我们要编译这段代码,就需要建设一个变量列表 我们先设计两条伪代码,用来操纵我们的变量列表 STLOC 把值放进变量表 LDLOC 从变量表取出值
    //int a=1

    TOALTSTACK

它的代码分为明明的几个部门。 step01 是表明c#源代码为抽象语法树(AST),这里我们可以直接挪用rosyln来办理,无论你规划编译什么高级语言,根基上把它表明为AST这一步都有许多现成的对象可以利用
    //return
    }
    int a=1; //a is values[0]


        int a=1;

int a=0;


    PUSH 0//index

    RET


    PICKITEM

    DUPFROMALTSTACK //getarray


    //int a=1

参考源码位置:    https://github.com/lightszero/neovmbook/tree/master/samples/compiler_csharp01

    //int b=2

    //return a+b


然后我们把变量列表以代码的形式直接写出来 NEWARRAY PICKITEM SETITEM 这些操纵NEOVM 都拥有了,我们在函数启动时在姑且栈里建设一个变量列表,在函数RET时,拿掉这个变量列表,就可以了。


    PUSH 2//value


    DUPFROMALTSTACK //getarray

    //CreateArray size=2


    LDLOC 0

    //get value a


    int b=2; //b is values[1]


用伪代码暗示这段措施就是


}


    ==>


//result 3


    PUSH 1//index


step02 是将AST酿成汇编的部门 这一部门是编译器主要的事情


    //int b=2


    ADD

好比,一个变量列表,我们用变量列表的思路再来看一下这段措施


class Program


{


    const int a=0;


        return a+b;


变量如何编译


    PUSH 2


    //get value b

    //we have a List<int> values;

    PUSH 2


    NEWARRAY

    //values[1] = 2;


    PUSH 1//index


假设我们有一个全局的变量列表


常量的计较用计较栈很容易表达


    //add


    SETITEM


   int b=2;

    RET

你可以在samples/compiler_csharp01下找到这个措施


变量之所以贫苦,在于变量大概会变革,所以变量应该来自于一个位置,而不是一个详细的值


step03 是毗连器的事情,无论你要编译什么对象,从什么编译,这一部门老是一样的。 下一篇我们会接头同样成果的代码从IL编译到AVM,当时你会发明 step03 仍然是一样的代码。


    PICKITEM


    //return values[0]+values[1]


第一个问题就是变量,高级语言内里我们对变量是习觉得常的,而在NEOVM的指令序列内里,显然是没有变量的


    SETITEM


    ADD


   int a=1;


我们要思量一下在NEOVM 我们拥有什么,我们拥有一个计较栈 和 一个姑且栈, 计较栈用来计较一个纯真的求值表达式较量容易,好比”1+2+3+4“,可是一旦呈现了变量,仿佛就较量巨大了。


这是它的输出


    DUPFROMALTSTACK //getarray


然后就是呼叫NEOVM来测试了,毫无疑问,你会获得功效3。


    PUSH 1


    PUSH 0


要害词: NEO  NEOVM  


    {


    return a+b;


    DUPFROMALTSTACK //getarray


    //values[0] = 1;


    return a + b;

    

    LDLOC 1


        int b=2;

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

人已赞赏
区块链

5G时代来临,QLC Chain如何布局通讯行业的未来?

2019-11-6 14:11:38

区块链

除了你,谁还知道你的私钥

2019-11-6 14:12:10

问卷调查系统工具软件推荐
0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
有新消息 消息中心
搜索
XML 地图 | Sitemap 地图