
今天通过学习来尝试自己去写一个虚拟机,我们一切先从简单开始。做事总是需要找一个原因,也就是为什么做这个件事,做这件事的意义,发明蒸汽机为了人类从繁重的劳动中解放出来更多思考,发明计算机为了辅助人类从重复计算和繁重计算中解放出来去享受生活吗?结果带来负效应996。


虚拟机实际上对物理计算机进行抽象和虚拟化,所以要写一个虚拟机,首先需要对计算机内部简单结构进行了解。我们开发应该是理论先行。
栈
还要一个主要方法
内存数据内存(datamemory)指令内存(codememory)
这两个部分都是用于存储数据和源码内存
字节码相比于机器码是更高级以及更有有规律可寻
字节码作为工作的最小单元
fetch:fetch不断循环地执行读取datamemory和codememory获取源码
decode:负责将字节码进行解码为指令供execute执行
寄存器(registers)中保存了sp栈指针、fp栈帧指针和ip程序指针
通过ip指针的自增一行一行读取字节码然后由decode将字节码翻译成指令来执行
栈虚拟机操作数栈持有操作数操作数可以入栈或出栈进行操作栈的大小是由每一个方法显式确定的
publicclassHelloWorld{publicstaticvoidmain(String[]args){("helloworld");}}定义字节码
vm_
表中列出应该是助记符应该理解为字节码的别名,字节码应该是以字节为单位的16进制的数值,为了便于阅读这些字节码将字节码对应别名。
例如iadd为表示对inter型进行加法

vm_
这张图要说起来还是比较复杂的,应该说相当复杂了,大家需要理解一下什么是栈帧。动画也好电影也好都是由一帧一帧图所组成的。这样按一定循序不断切换的图片最终形成了我们看到的精彩的电影。
栈帧也是我们程序的组成部分,很少有像我这样了解CG的程序员吧,所以我们的程序也是一个一个画面来组成的,程序运行也是一个个按一定顺序,顺序不是固定的,根据用户的交互而定。所以栈帧里存放是一个一个的代码块,栈帧入栈时候会记录下调用这个栈帧的栈帧的信息,也就是当这个栈帧结束后他会返回到上一个栈帧。就是这样连续的或者说一层套一层的栈帧组成我们应用。
能够写出自己语言和虚拟机不是每一个程序员的梦想吗?
朝着这个梦想不断努力,哪怕自己仅仅迈出一小步都会感到欣慰,因为今天的一小步就是明天的一大步。

无论指针、数据都是int类型这里统一使用int32进行保存。defineSTACK_VM_
我们先写头文件,其实无论指针还是我们内存都设计成为32位int类型所有
typedefint32_ti32;
定义pc也就是程序指针,初始值设置100也就是vector列表100以后的索引分配给用于存放程序,100作为数据内存,也可以简单理解为栈内存来使用。
定义sp为栈指针
通过列表来虚拟memory
dat和typ分别为数据和类型
typ中0表示正整型1表示指令2表示负整型3表示未定义
running用于控制虚拟机运行的标识
fetch模拟遍历读取到内存中的字节码
decode模拟将字节码解码(翻译)为机器指令
execute模拟执行指令
include""intmain(){StackVMvm;std::vectori32prog{3,4,0x40000001,0x40000000};(prog);();return0;}
makecpp
CFLAGS=-std=c++11all:stack-vmstack-vm:$(CXX)$(CFLAGS):$(CXX)$(CFLAGS)-:$(CXX)$(CFLAGS)-:rm-f*.ostack-vm
免责声明:本文章如果文章侵权,请联系我们处理,本站仅提供信息存储空间服务如因作品内容、版权和其他问题请于本站联系