注册 |登录

0GiNr技术社区论坛0GiNr 作品发布与交流 › 查看主题

1654

查看

11

回复
返回列表

Rank: 12Rank: 12

金钱
1979 元 
经验
248 点 
威望
7 点 
贡献
3 点 
精华
go

刚写烂尾的一个堆栈机

1
发表于 2010-2-3 13:43 | 只看该作者 | 倒序看帖 | 打印
凡本论坛原创内容,其作者享有著作权,未经许可谢绝转载。
代码在 http://github.com/Fleurer/fsvm

尝试用C写的堆栈机,好像烂尾了 – -!

只是个运行时,无视了语法分析。随便写的东西也没什么规划,编写的时候就郁闷不知道哪部分该归分析器那部分该归vm,也不知道现有的部分能不能真用到解释器上,于是华丽地烂尾~只实现了20来条指令,可以递归可以闭包,不过不能算乘法...囧,很简陋啦~

好像是第一次写C,不会make就先凑合了rake - -! 对C不熟悉,写起来提心吊胆,满地的Segmentation Fault对我们只会用printf调试的菜鸟太残酷了...用了那个保守式的gc库Boehm GC,面对满地的malloc而无free不清楚泄漏起来会怎样...囧

本来是对C++那套OO无爱,想单用struct和函数也可以OO么。然后就后悔了:我不想重新实现hashmap之类的东西,C++那stl多好...T_T。倒也找到了C的一个泛型库khash,不过宏终究不如模板来的好看...现在想来,信息学奥赛acm中用C的那些同学做题的时候都是自己实现一遍各个数据结构么?

拿段伪代码:
  1. def main:
  2.      sum(10)

  3. def sum(i):
  4.      if (i==0) : return 0;
  5.      else: return(i+sum(i-1));
复制代码
放到fsvm下大约是这样:
  1. int test_rec(){
  2.     Op op_main[]={
  3.         OP_PUSH_NUM, 10,
  4.         OP_PUSH_CONST, 0, //"sum"  
  5.         OP_PUSH_VAR,
  6.         OP_CALL, 1,
  7.         OP_RET
  8.     };
  9.     Op op_sum[]={
  10.         OP_PUSH_CONST, 0, //"i"
  11.         OP_PUSH_VAR,
  12.         OP_POP_TMP, 0, //store i
  13.         OP_PUSH_TMP, 0, //push i
  14.         OP_PUSH_NUM, 0,
  15.         OP_EQ,
  16.         OP_NOT, // i!=0?
  17.         OP_BRANCH, 3,
  18.             OP_PUSH_NUM, 0,
  19.             OP_RET,
  20.         //else
  21.             OP_PUSH_TMP, 0,
  22.             OP_PUSH_NUM, 1, //1
  23.             OP_SUB,
  24.             OP_PUSH_CONST, 1, //"sum"
  25.             OP_PUSH_VAR,
  26.             OP_CALL, 1,   //sum(tmp[0]-1)
  27.             OP_PUSH_TMP, 0,
  28.             OP_PRINT_STACK,
  29.             OP_ADD, //tmp[0]+sum(tmp[0]-1)
  30.         OP_RET
  31.     };
  32.     Env *env=fnew_env(NULL);

  33.     Proto *p_main = fnew_proto(op_main, 0);
  34.     fset_const(p_main, 0, fstr("sum"));
  35.     Func* f_main=fnew_func(p_main, env);
  36.     Obj o_main=ffunc(f_main);

  37.     Proto* p_sum=fnew_proto(op_sum, 1);
  38.     fset_const(p_sum, 0, fstr("i"));
  39.     fset_const(p_sum, 1, fstr("sum"));
  40.     Func* f_sum=fnew_func(p_sum, env);
  41.     Obj o_sum=ffunc(f_sum);

  42.     fbind_var(env, "sum", o_sum);

  43.     fio_puts(fcall(0, f_main));
  44.     return 0;
  45. }
复制代码
创建函数的那几个函数我自己也看着别扭…另外整个代码好像0 comment,囧~

ps:原先的博客撞墙了,搬家到http://fleurer-lee.com,有友链的同学麻烦下啦~

TOP

Rank: 12Rank: 12

金钱
1339 元 
经验
376 点 
威望
42 点 
贡献
5 点 
精华
2
发表于 2010-2-3 18:39 | 只看该作者
前来膜拜SF, 顺便链接~~

TOP

0GiNr核心团队

论坛管理员

Rank: 12Rank: 12

金钱
10491 元 
经验
10357 点 
威望
205 点 
贡献
17 点 
精华

技术高手

3
发表于 2010-2-3 20:34 | 只看该作者
啥都不懂 只能膜拜

TOP

Rank: 3

金钱
125 元 
经验
226 点 
威望
20 点 
贡献
0 点 
精华
4
发表于 2010-2-5 09:24 | 只看该作者
膜拜。。。ssword同学,什么时候加个好友啊?

TOP

Rank: 2Rank: 2

金钱
1257 元 
经验
244 点 
威望
12 点 
贡献
0 点 
精华
5
发表于 2010-2-5 11:08 | 只看该作者
同LS几位,膜拜~

TOP

Rank: 12Rank: 12

金钱
1979 元 
经验
248 点 
威望
7 点 
贡献
3 点 
精华
6
发表于 2010-2-5 13:10 | 只看该作者
ls你们开玩笑了,到现在还没写过千行的程序来着

@jerrynpc
qq随便加哈,不过上的可能不多 289529285

TOP

大牛

灌水之王

Rank: 4Rank: 4

金钱
32344 元 
经验
537 点 
威望
47 点 
贡献
1 点 
精华
7
发表于 2010-2-5 19:55 | 只看该作者
有本介绍C的OO的书,很烂,不看为好……貌似以前在你的博客上说过。
内存泄漏?不会吧……经验告诉我,mallooc()后不free()也是可以的……
用广度优先学习更多的算法!用深度优先学习更难的算法!
My blog:hi.baidu.com/klarkzby

TOP

Rank: 12Rank: 12

金钱
1979 元 
经验
248 点 
威望
7 点 
贡献
3 点 
精华
8
发表于 2010-2-5 20:39 | 只看该作者
@wangweinoo1 linux文件系统那套OO就挺漂亮,不过相对有class关键字的语言还是多少繁琐了些。介绍C的OO...什么书呢?
内存泄露也只是猜的哈,可能长时间运行才会比较严重?

TOP

Rank: 2Rank: 2

金钱
1257 元 
经验
244 点 
威望
12 点 
贡献
0 点 
精华
9
发表于 2010-2-5 21:57 | 只看该作者
有本介绍C的OO的书,很烂,不看为好……貌似以前在你的博客上说过。
内存泄漏?不会吧……经验告诉我,mall ...
wangweinoo1 发表于 2010-2-5 19:55


那是在某些特殊情况下吧?

TOP

大牛

灌水之王

Rank: 4Rank: 4

金钱
32344 元 
经验
537 点 
威望
47 点 
贡献
1 点 
精华
10
发表于 2010-2-5 22:07 | 只看该作者
@wangweinoo1 linux文件系统那套OO就挺漂亮,不过相对有class关键字的语言还是多少繁琐了些。介绍C的OO... ...
ssword 发表于 2010-2-5 20:39



这是一本很老的书:

这是最近的一篇文章,不过没什么新意:
http://www.cqvip.com/qk/91365X/200905/31976093.html
附件: 您需要登录才可以下载或查看附件。没有帐号?注册
用广度优先学习更多的算法!用深度优先学习更难的算法!
My blog:hi.baidu.com/klarkzby

TOP

0GiNr安全门户 |联系我们

GMT+8, 2010-9-7 20:33.

Powered by Discuz! X1

© 2001-2010 Comsenz Inc.