知世金融网专注于股票行情,期货开户,外汇储备等最新相关资讯信息提供投资者参考学习!

当前位置:网站首页 > 区块链 > 正文

编译NEO-AVM-高级语言-变量

原创
文章作者
知世-金融领域资深作者
知名金融领域作者,从事金融超过十余年,在行业内有一定影响力。
金融风险管理师认证证书 常识职业资格认证 特许金融分析师 国际金融理财师认证证书
发布时间:2020-02-16 19:39:24 发布来源:NEL新经济实验室 文章点击:95

之前我们已经讨论过地址转换了,那么这一篇就只是关于高级语言如何转换为AVM了 变量如何编译 第一个问题就是变量,高级语言里面我们对变量是习以为常的,而在NEOVM的指令序列里面...

目录

    本文标题编译NEO-AVM-高级语言-变量,作者:知世,本文有801个文字,大小约为3KB,预计阅读时间3分钟,请您欣赏。知世金融网众多优秀文章,如果想要浏览更多相关文章,请使用网站导航的搜索进行搜索。本站虽然不乏优秀之作,但仅作为投资者学习参考。

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

    变量如何编译

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

    int a=0;

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

    int a=1;
    int b=2;
    return a + b;

    我们要考虑一下在NEOVM 我们拥有什么,我们拥有一个计算栈 和 一个临时栈, 计算栈用来计算一个单纯的求值表达式比较容易,比如”1+2+3+4“,但是一旦出现了变量,好像就比较复杂了。

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

    const int a=0;
    const int b=2;
    return a+b;

    ==>

    PUSH 0
    PUSH 2
    ADD
    RET

    变量之所以麻烦,在于变量可能会变化,所以变量应该来自于一个位置,而不是一个具体的值

    比如,一个变量列表,我们用变量列表的思路再来看一下这段程序

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

    //we have a List<int> values;
    int a=1; //a is values[0]
    //values[0] = 1;
    int b=2; //b is values[1]
    //values[1] = 2;
    return a + b;
    //return values[0]+values[1]

    实际上,我们要编译这段代码,就需要创建一个变量列表 我们先设计两条伪代码,用来操作我们的变量列表 STLOC 把值放进变量表 LDLOC 从变量表取出值

    用伪代码表示这段程序就是

    //int a=1
    PUSH 1
    STLOC 0
    //int b=2
    PUSH 2
    STLOC 1
    //return a+b
    LDLOC 0
    LDLOC 1
    ADD

    RET

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

    //CreateArray size=2
    PUSH 2
    NEWARRAY
    TOALTSTACK

    //int a=1
    DUPFROMALTSTACK //getarray
    PUSH 0//index
    PUSH 1//value
    SETITEM

    //int b=2
    DUPFROMALTSTACK //getarray
    PUSH 1//index
    PUSH 2//value
    SETITEM

    //get value a
    DUPFROMALTSTACK //getarray
    PUSH 0//index
    PICKITEM

    //get value b
    DUPFROMALTSTACK //getarray
    PUSH 1//index
    PICKITEM

    //add
    ADD

    //return
    //cleararray
    FROMALTSTACK
    DROP
    RET

    你可以在samples/compiler_csharp01下找到这个程序

    它的代码分为明显的几个部分。 step01 是解释c#源代码为抽象语法树(AST),这里我们可以直接调用rosyln来解决,无论你打算编译什么高级语言,基本上把它解释为AST这一步都有很多现成的东西可以使用

    step02 是将AST变成汇编的部分 这一部分是编译器主要的工作

    step03 是连接器的工作,无论你要编译什么东西,从什么编译,这一部分总是一样的。 下一篇我们会讨论同样功能的代码从IL编译到AVM,那时你会发现 step03 仍然是一样的代码。

    然后就是召唤NEOVM来测试了,毫无疑问,你会得到结果3。

    class Program
    {
    static void Main()
    {
    int a=1;
    int b=2;
    return a+b;
    }
    }
    //result 3

    这是它的输出

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

    本文相关推荐: jdk环境变量配置

    以上便是知世金融网给大家分享的关于编译NEO-AVM-高级语言-变量/qkl/28147.html的相关信息了,希望能帮助到大家,更多金融相关信息,敬请关注知世金融网!

    网站内容均来自互联网,如侵害您的利益联系客服进行删除!

    关键词:变量
    (0)
    (0)

    上一篇:如何为4万名订阅者编写自动空投脚本

    下一篇:区块链大火,但这一次需要关注的是核心底层技术创新问题

    本文标题:编译NEO-AVM-高级语言-变量

    本文地址:/index.php?s=article&c=search&keyword=%E5%8F%98%E9%87%8F

    金融知名领域

    南方财富网 | 金融界 | 金融界 |

    更多推荐

    • 茅台吃饱,经销商哭倒
      茅台吃饱,经销商哭倒
    • 汇金的五次增持从短期看具有一定的“稳定器“作用,但从市场表现看效果逐次递减
      汇金的五次增持从短期看具有一定的“稳定器“作用,但从市场表现看效果逐次递减
    • 158亿元!比亚迪收购!
      158亿元!比亚迪收购!
    • 9月价格回落近五成 “冷静期”酒店业备战“十一”市场
      9月价格回落近五成 “冷静期”酒店业备战“十一”市场
    • 2023哈马博览会哈尔滨银行展区精彩纷呈
      2023哈马博览会哈尔滨银行展区精彩纷呈
    • 大额解禁撂倒股价 医疗影像龙头跌出千亿俱乐部 葛兰二季度大幅减仓
      大额解禁撂倒股价 医疗影像龙头跌出千亿俱乐部 葛兰二季度大幅减仓
    • A股,又上了热搜!数字要素概念走高多股涨停,锂电池板块走低恩捷股份大举跌停
      A股,又上了热搜!数字要素概念走高多股涨停,锂电池板块走低恩捷股份大举跌停
    • 最新!巨头出手,加仓宁王51%
      最新!巨头出手,加仓宁王51%
    • 600亿巨头暴雷
      600亿巨头暴雷
    • 一天32家!科创板回购潮涌来
      一天32家!科创板回购潮涌来
    • 提振信心实招来了!30余家上市公司密集出手 最高要买10亿
      提振信心实招来了!30余家上市公司密集出手 最高要买10亿
    • 高盛再发50年后预测:2075年印度股市全球市值占比将升4倍 中国升3成
      高盛再发50年后预测:2075年印度股市全球市值占比将升4倍 中国升3成

    新闻资讯栏目

    站长QQ: 2397470084