[虚拟机]运行时数据组织

虚拟机

虚拟机的实现包含三个文件

jerry-vm.c

环境配置, 参数分析和 I/O 设定. main 函数在这个文件中

vm.h

类型定义, 以及全局变量的声明.

vm.c

指令的实现

这些文件编译链接后产生 JerryVM.out 可执行文件. 它的命令行参数之一是 Jerry 字节码. 它将读入指令然后执行它们.

双帧栈

所谓的双帧栈就是只栈内有两个栈段, 一个存放栈内数据, 一个进行算术运算. 这是一种简单, 但是非常浪费空间的处理方式.

正确的做法应该是根据符号表预估栈内变量总大小, 并留足这个空间, 使运算在这个空间之上进行.

 

这两个栈帧在 vm.h 中声明, 此外, 还有两个重要的段指针.

typedef char Segment[MAX_VAR_IN_STACK]; // 段类型定义

extern Segment ds; // 栈内数据段, 存放栈内数据
extern Segment ss; // 栈段, 实际作用仅存放运算栈

extern void* pc; // program counter, 在 main 中读入指令之后初始化
extern void* sp; // 栈顶指针, 在 main 中初始化, 指向 ss

I/O

虚拟机本身的 I/O 当然是转调 C 库的 I/O (我可懒得去关心操作系统 :-), 不过, 虚拟机提供两个参数来重定向 I/O, 它们是 OPTION_INPUT_SPECIFY ("-input") 和 OPTION_OUTPUT_SPECIFY ("-output"), 定义在 jerry-vm.c 中. 这里, 虚拟机对命令行参数的处理与编译器类似 (是的, 一样龌龊的循环-判同捕捉).

另外有两个字符指针, hintInputRealhintInputInt, 它们起先指向两个提示输入的字符串, 当输入被重定向之后, 它们则指向空字符串.

运行

打开 byte-code, 读入指令, 在一切准备妥当之后, 调用 execute() 便开始执行指令了. 在 vm.c 中, 你可以看到更多更混乱的代码.

vm.c

跳过前面若干行代码, 直接看数组 execs, 这是一个跳转表, 每个指令的指令码作为数组索引, 即可得到一个函数入口地址, 当该地址为 NULL 时, 表明这个指令码是程序结束.

至于前前后后的代码, 就是虚拟机指令的实现了. 这里就不多说了.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值