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和 这份代码

SECD machine简介的更多相关文章

  1. SECD machine

    SECD machine 对程序语言理论的理解 程序语言理论主要研究语法.语义及语言的实现.编程语言有语法,各种数学逻辑.结构化数据都有语法.乔姆斯基的语言体系及巴科斯范式是语法分析的基础,语法分析将 ...

  2. Docker Machine 简介

    Docker Machine 是什么? Docker Machine 是 Docker 官方提供的一个工具,它可以帮助我们在远程的机器上安装 Docker,或者在虚拟机 host 上直接安装虚拟机并在 ...

  3. Docker Machine 详解

    笔者在<Docker Machine 简介>一文中简单介绍了 Docker Machine 及其基本用法,但是忽略的细节实在是太多了.比如 Docker 与 Docker Machine ...

  4. 用 Docker Machine 创建 Azure 虚拟主机

    搭建环境向来是一个重复造轮子的过程,Docker Machine 则把用户搭建 Docker 环境的各种方案汇集在了一起.笔者在<Docker Machine 简介>一文中演示了使用 Do ...

  5. Docker Machine的使用

    前面两篇文章(<Asp.Net Core 发布到 Docker(Linux Centos 虚拟机,使用Dockerfile)> <Docker Compose的使用>),简单介 ...

  6. Docker学习—Machine

    前言 前面<Docker学习-Compose>文中介绍了Compose的使用方式:接下来继续了解docker三剑客之一的 Machine: 一.Docker Machine简介 1.什么是 ...

  7. [第十四篇]——Docker Machine之Spring Cloud直播商城 b2b2c电子商务技术总结

    Docker Machine 简介 Docker Machine 是一种可以让您在虚拟主机上安装 Docker 的工具,并可以使用 docker-machine 命令来管理主机. Docker Mac ...

  8. Microsoft 机器学习产品体系对比和介绍

    Microsoft 提供多种多样的产品选项用于生成.部署和管理机器学习模型. 本文将比较这些产品,并帮助你选择所需的产品,以便最有效地开发机器学习解决方案. 机器学习产品 描述 作用 Azure云端服 ...

  9. Continuation-passing style

    Continuation-passing style 参考书籍: EOPL (  Essentials of Programming Languages, 3rd Edition ) 作者:知乎用户链 ...

随机推荐

  1. 关于URLEnCode,URLDeCode,Base64,公钥私钥

    1.Base64非常适合http.mime协议,所以在一些类似webservice中可以用Base64. 用法如下:传出去之前先 Convert.ToBase64String(encryptedByt ...

  2. gpio高阻态

    配置gpio为高阻态:将gpio设为GPIO_INPUT,GPIO_NO_PULL即可

  3. [转载]《民航科技》2012年4月专家论坛:程延松《关于中国民航SWIM框架及技术实现探讨》

    专家介绍:程延松,现任成都民航空管发展有限公司总经理,理学博士,高级工程师,长期从事空管技术研究和产品研发工作,作为课题负责人,参与了国家863计划.国家科技支撑计划.国家空管委重点课题.民航局重点课 ...

  4. c++容器

    1.vector:实质是动态堆数组,连续存储的内存区域,支持快速的随机访问. 2.list:实质是双向循环链表,支持在中间进行快速的插入删除,但是不能支持快速的随机访问.非连续的内存区域. 3.deq ...

  5. MacOS changed System Integrity Protection status

    禁止 System Integrity Protection 按住 command + R 重启系统 进入单用户模式 启动bash工具: 输入: csrutil disable 输入:reboot 启 ...

  6. 欧冠杯:葡萄牙VS法国——葡萄牙首次夺冠!

    北京时间7月11日凌晨3点,2016欧洲杯决赛,葡萄牙在法兰西大球场1-0击败东道主法国,历史上首次夺冠.C罗伤退落泪,替补出场的埃德尔在加时赛第109分钟完成绝杀. 昨晚上本来准备熬夜看球赛的!而且 ...

  7. 安卓基于WifiScanner的签到APP

    没图说个JB?首先上图:      友情提醒:后台数据库使用的是Bmob后端云 主要设计思路:首先选一个附近的wifi,输入签到码,进行签到. 签到之后会启动一个后台线程每隔一段时间扫描附近wifi, ...

  8. bashrc

    # ~/.bashrc: executed by bash(1) for non-login shells.# see /usr/share/doc/bash/examples/startup-fil ...

  9. MacBook下如何安装mysql-python

    解决方法: 先把之前装的卸载干净:pip uninstall mysql-pythonbrew uninstall mysql-connector-c 现在设置下mysql_config路径:首先修改 ...

  10. Objective - C 值对象 NSNumber和NSValue

    在进行数据处理的时候,因为对象类型的不同, 并不能进行相应的数据处理,所以必须要进行数据类型的转换,这也就是NSNumber,NSValue这两类值对象出现的原因. 简而言之,NSNumber就是实现 ...