Fleurer’s Stack VM
Posted on 二月 3rd, 2010 in 备忘 | 14 Comments »
http://github.com/Fleurer/fsvm
尝试用C写的堆栈机,好像烂尾了 – -!
只是个运行时,无视了语法分析。随便写的东西也没什么规划,编写的时候就郁闷不知道哪部分该归分析器那部分该归vm,也不知道现有的部分能不能真用到解释器上,于是华丽地烂尾~只实现了20来条指令,可以递归可以闭包,不过不能算乘法…囧,很简陋啦~
好像是第一次写C,不会make就先凑合了rake – -! 对C不熟悉,满地的Segmentation Fault对我们只会用printf调试的菜鸟太残酷了…用了那个保守式的gc库Boehm GC,面对满地的malloc而无free不清楚泄漏起来会怎样…囧
本来是对C++那套OO无爱,想单用struct和函数也可以OO么。于是用了C,然后就后悔了:我不想重新实现hashmap之类的东西,C++那stl多好…T_T。倒也找到了个C的泛型库khash,不过宏终究不如模板来的好看…现在想来,信息学奥赛acm中用C的那些同学做题的时候都是自己实现一遍各个数据结构么?
拿段伪代码:
def main: sum(10) def sum(i): if (i==0) : return 0; else: return(i+sum(i-1));
放到fsvm下大约是这样:
int test_rec(){ Op op_main[]={ OP_PUSH_NUM, 10, OP_PUSH_CONST, 0, //"sum" OP_PUSH_VAR, OP_CALL, 1, OP_RET }; Op op_sum[]={ OP_PUSH_CONST, 0, //"i" OP_PUSH_VAR, OP_POP_TMP, 0, //store i OP_PUSH_TMP, 0, //push i OP_PUSH_NUM, 0, OP_EQ, OP_NOT, // i!=0? OP_BRANCH, 3, OP_PUSH_NUM, 0, OP_RET, //else OP_PUSH_TMP, 0, OP_PUSH_NUM, 1, //1 OP_SUB, OP_PUSH_CONST, 1, //"sum" OP_PUSH_VAR, OP_CALL, 1, //sum(tmp[0]-1) OP_PUSH_TMP, 0, OP_PRINT_STACK, OP_ADD, //tmp[0]+sum(tmp[0]-1) OP_RET }; Env *env=fnew_env(NULL); Proto *p_main = fnew_proto(op_main, 0); fset_const(p_main, 0, fstr("sum")); Func* f_main=fnew_func(p_main, env); Obj o_main=ffunc(f_main); Proto* p_sum=fnew_proto(op_sum, 1); fset_const(p_sum, 0, fstr("i")); fset_const(p_sum, 1, fstr("sum")); Func* f_sum=fnew_func(p_sum, env); Obj o_sum=ffunc(f_sum); fbind_var(env, "sum", o_sum); fio_puts(fcall(0, f_main)); return 0; }
创建函数的那几个函数我自己也看着别扭…不过写C还是老实点好 >_<
