secd machine是一种比较基础的虚拟机设计。一般是作为函数式语言的底层虚拟机。

secd machine的“secd”四个字母分别指的是这种虚拟机的核心Stack, Environment, Control, Dump,一般也称作寄存器。

secd machine 是一种stack-based虚拟机。

Stack一般是存放运算数据和结果

Environment保存的是环境变量,一般是函数调用里的参数以及局部变量

Control保存的是虚拟机指令

Dump保存的是函数调用时的调用帧数据。

secd machine常用的指令有如下一些。

  

  • nil 将一个nil push入stack
  • s e (NIL.c) d => (nil.s) e c d
  • ldc 将一个常量push入stack,如果区分类型也可以扩展成多个ld指令
  • s e (LDC x.c) d => (x.s) e c d
  • ld 从环境中加载一个变量push入stack,因为env是分层级的,所以一般是ld [1,2] 类似的形式。
  • s e (LD [y x].c) d => (locate([y x], e).s) e c d
  • sel 这个指令是为了实现条件选择,sel有两个参数,执行时会pop出stack的一个值,判断如果是真,则将Control寄存器设置为第一个参数,否则就设置为第二个参数。同时会将当前的C寄存器中的值push到Dump寄存器。
  • (x.s) e (SEL ct cf.c) d => s e c? (c.d)
    where c? is (if (not= x false) ct cf)
  • join 和sel共用的,是在sel一条选择语句执行完时,将sel指令push到D寄存器里的指令pop出来,然后设置C寄存器。
  •   
    s e (JOIN.c) (c'.d) => s e c' d
  • ldf 将其参数当做一个函数加载到stack,创建函数时会加上当前的环境。
  • s e (LDF f.c) => ([f e].s) e c d
  • ap 从stack里pop出一个closure对象和一个函数参数对象,将SEC寄存器push到D寄存器,closure携带的的env会替换E寄存器,函数体替换C寄存器,并将参数列表push到env,
  • ([f e'] v.s) e (AP.c) d => nil (v.e') f (s e c.d)
  • rtn  将返回值从stack之中pop出来,将d寄存器中保存的SEC值pop出来,赋值给SEC寄存器,然后将返回值push到stack里
  •    
    (x.z) e' (RTN.q) (s e c.d) => (x.s) e c d
  • dum push一个空环境到当前环境中
  • s e (DUM.c) d => s (nil.e) c d
  • rap 和ap不同之处,是会将参数替换dum的空环境,dum和rap联合能实现递归。
  • ([f (nil.e)] v.s) (nil.e) (RAP.c) d
    =>
    nil (rplaca((nil.e), v).e) f (s e c.d)

参考了wiki和pysecd和 这份代码

最新文章

  1. 有关于canvas几个新知识点
  2. cocos2dx 3.x (单选,多选,复选checkBox按钮的实现) RadioButton
  3. 行内js函数调用
  4. 机械大楼电梯控制项目软件 -- github团队组建
  5. javascript原型Prototype【转】
  6. hidesBottombarWhenPushed的副作用
  7. java随机生成指定的位数
  8. java提高篇---Vector
  9. Cache选型的一些思考
  10. oracle tkprof 工具详解
  11. 同样是IT培训,为什么人家月薪过万,你才几千,问题在哪?!
  12. Android-引导用户指纹录入
  13. web前端(6)—— 标签的属性,分类,嵌套
  14. Achievements
  15. jQuery和Zepto冲突问题【解决】
  16. [P1373]小a和uim之大逃离 (DP)
  17. Bmob后端云使用步骤
  18. Linux shell命令 cp 加上-f还是提示是否覆盖
  19. Jenkins自动化构建(二)众多问题
  20. bnu 10805 矩形神码的 平面向量的运行

热门文章

  1. DataGridView 导出到Excel
  2. 为 Docker Registry 增加 Nginx 前端
  3. [转]Dynamic SQL & Stored Procedure Usage in T-SQL
  4. mave web常用配置文件参数
  5. mysql分组函数
  6. Windows Linux 之间rsync同步CODE文件
  7. C++设计模式-Prototype原型模式
  8. php-建造者模式(Builder)解析
  9. 字符集和字符编码(Charset & Encoding)
  10. IOS 在不打开电话服务的时候,可以响应服务器的推送消息,从而接收服务器的推送消息