打印

VSF脚本系统实现原理

[复制链接]
1528|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
vsfopen|  楼主 | 2018-7-31 09:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 vsfopen 于 2018-7-31 11:39 编辑

VSF的脚本系统核心是虚拟机,虚拟机用来执行编译器编译后的bytecode代码。这里讲一下VSF脚本系统中,虚拟机的实现方法。
VSF的虚拟机只支持2种指令,一种是statement、一种是expression。VSF虚拟机并不支持寄存器,因为是基于堆栈的实现,函数调用的参数、返回值等都是放在堆栈上。当然分成这2种指令,只是因为大部分语言的代码,也就只是由statement和expression构成的。

expression比较简单,就是表达式。任何表达式,处理方式都一样,传入N个参数,传出M个(一般是1)结果。而表达式的计算,就是使用后缀表达式,利用堆栈来实现的。比如:

a+b -->> ab+
计算的时候,先拿到变量a,然后入栈;在拿到变量b,继续入栈;最后拿到+号,从堆栈里拿出2个,计算结果后,放入堆栈。

a+b*c -->> abc*+
计算的时候,先拿到前3个变量,都入栈;后面拿到*号,出栈bc,入栈b*c的结果;最后拿到+,出栈a和之前入栈的结果,计算后,重新入栈。

(a+b)*c -->> ab+c*
计算的时候,先拿到前2个变量,都入栈;后面拿到+号,出栈ab,入栈a+b的结果;之后入栈c;最后拿到*,出栈c和之前入栈的结果,计算后,重新入栈。

a=f(b, c); -->> abcf=
这里,一样先入栈3个变量;拿到f函数的时候,调用f,最终f会消耗掉堆栈上的2个参数,放入一个结果;最后拿到赋值运算符,出栈2个值,执行赋值,入栈赋值的结果。


除了expression外,其他的都是statement。包括var定义变量指令(const定义常量的话,不会在虚拟机里,只在编译器里有作用),if指令,goto指令等等。比如:

var a = b + c;
-->>
statement(var a);
expression(abc=);
第一个statement定义了一个变量,会在堆栈上,增加变量a(虚拟机里只有序号,没有名字)。然后是一个赋值表达式。

if (f(a,b))
{
  c = 0;
}
-->>
statement(var t);    // 定义零时变量,位于堆栈末尾
expression(tabf=);  // t = f(a,b);
statement(if, 2);     // 出栈之前的运算结果(使得堆栈平衡),如果false,PC增加2(跳过if里的代码)
expression(c0=);    // c = 0;

if (a)
{
  c = 0;
}
else
{
  c = 1;
}
-->>
statement(var t);    // 定义零时变量,位于堆栈末尾
expression(ta=);     // t = a;
statement(if, 3);     // 出栈之前的运算结果,如果false,PC增加3(执行else)
expression(c0=);    // c = 0;
statement(goto, 2); // 跳过else
expression(c1=);    // c = 1;

while(f(a,b))
{
  c = c + 1;
}
-->>
statement(var t);     // 定义零时变量,位于堆栈末尾
expression(tabf=);   // t = f(a,b);
statement(if, 3);      // 出栈之前的运算结果,如果false,PC增加3(跳过while中的代码,包括goto)
expression(cc1+=); // c = c + 1;
statement(goto, -4);// 跳到最前面,重新执行条件判断

并没有循环语句的表达都,都只是通过if和goto来实现的。
VSF里,支持的statement也就只有:
 VSFVM_CODE_KEYWORD_var = 0,
        VSFVM_CODE_KEYWORD_goto,
        VSFVM_CODE_KEYWORD_if,
        VSFVM_CODE_KEYWORD_return,
        VSFVM_CODE_KEYWORD_breakpoint,
其中,breakpoint用于调试和实时编译。


基于以上的虚拟机,也就决定了编译器可以很简单,编译操作也只是代码转换的操作。可以认为只是把文本的代码,转换成由statement和expression组成的伪代码,当然,编译器里还可以做一些优化,比如a=4+3;优化为a=7;之类的。







使用特权

评论回复

相关帖子

沙发
liugeng823| | 2020-2-22 19:59 | 只看该作者
你你你你 呵呵~~~~别这样哦.....

使用特权

评论回复
发新帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

90

主题

325

帖子

8

粉丝