http://www.7klian.com

NEO-AVM从何而来-模块化和汇编器

{
0x03 RET
实际上他就被分为了两个模块 0x000x06 是 Main模块,0x070x08 是 ADD 模块
这种方法来实现模块化,让代码的差异区域实现差异的成果
假如没有模块化的表达,就是这样的,我们照旧要处理惩罚地点
以歌为单元组织数据,就是模块化。CD可以,磁带不可
    //bbb
}
工程师们一个模块一个模块的思考与编写代码,而不再思量哪个内存块是哪个模块。
    PUSH 1
因为我们的汇编器有模块化和Linker的事情,接下去我们表明编译的进程就酿成两部门。
    PUSH 2
0x04 PUSH 8
    RET
可是软件工程实践中,第一重要的课题,就是模块化。
我们来思量一段AVM代码
思考这样的代码
说过了CALL 指令,再来说一下JMP指令
0x02 PUSH 1
JMP 指令用于函数内部的模块化
if(a)
可能 其它虚拟机中间语言 好比 IL->AVML->byte[]
模块化
思量模块和地点转换干系的事情凡是称为毗连(Link)
0x00 PUSH 1
既然模块化那么重要,那自然需要有一个模块化的帮助东西。
}
高级语言向汇编语言的转换进程,80%的事情就是各类loops 酿成 JMP的进程
你想想以前的磁带机听音乐,你能不能简朴的一键跳到下一首歌。
    0x07    ADD
CALL 指令是用来做函数级此外模块化
    0x08    RET
label1:
此刻是汇编,下一步是高级语言,这个进程都是一样的,必经之路。
好比c++语言就有一个很是明晰独立的毗连进程
    0x00    PUSH 1
    PUSH 8
    RET
参考源码位置 https://github.com/lightszero/neovmbook/tree/master/samples/neovm02

aaa 和 bbb 就是两个函数内部的子模块了
我们知道NEOVM是图灵机的一种实现,但是图灵机就是磁带机,尺度的磁带机但是没有模块化的。
{
    //aaa
JMP指令
}
不消体贴地点了,引入了一个标签作为跳转位置
goto [linenum]
在没有模块化东西帮助的时候,工程师必需本身筹划好模块在内存中如何分别,这是一个很繁琐的事情,有模块化,才有软件工程。
{
此刻我们有一个汇编器项目了
}
在呆板中,有的只是一块指令区,而指令区中的模块化,就是通过内存区域来规定的,假如你进修过最陈腐的Basic语言,只有一个代码文件那种,也没有函数支持,我们就回收
    CALL method1
高级语言虽然是模块化的,函数是最风行的模块化单元,厥后跟着oop的风行,类又发生了。
忽略掉JMP 和 CALL 指令的地点转换事情,这个事情留给Linker,下一篇我们就来接头高级语言如何编译成NEOVM 指令
    RET;
我们的汇编器具有毗连器的成果,它可以自动毗连这两个模块,给他们分派符合的地点段,并让CALL的参数自动指向该指的处所。
}
    PUSH 1//push 1 number
    0x03    CALL +4
可是早在高级语言没有风行之前,软件工程师们,就是模块化事情的。
    JMPIF label1
else
Main()
    0x01    PUSH 2
CALL 指令
    0x06    RET
{
method1()
    RET
    PUSH 1
0x01 JMPIF +3
不再赘述其它编译器如那里理惩罚Linker的事情。
    ADD
毗连器Linker
高级语言->AVML->byte[]
int a=1;
0x05 RET
这个问题放到NEOVM内里来说,我们通过 JMP 指令 和 CALL 指令来实现代码的模块化
假如用我们界说的有模块化的ASML来暗示
{
假如我们用我们界说的ASML语言带模块化的来表达他就是

之前一直在提到汇编器,在流程说明中,我们没有当真的接头这个问题
https://github.com/neo-project/neo-vm/tree/Branch_neoasm/src/neo-asm
编译器的最后事情就是地点转换,它包罗给模块分派地点区域,,和给CALL指令提供正确地点,生成最终的AVM byte[].
在呆板语言中是如何实现模块化的
Main()

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