SECD machine简介
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)
SECD machine简介的更多相关文章
- SECD machine
SECD machine 对程序语言理论的理解 程序语言理论主要研究语法.语义及语言的实现.编程语言有语法,各种数学逻辑.结构化数据都有语法.乔姆斯基的语言体系及巴科斯范式是语法分析的基础,语法分析将 ...
- Docker Machine 简介
Docker Machine 是什么? Docker Machine 是 Docker 官方提供的一个工具,它可以帮助我们在远程的机器上安装 Docker,或者在虚拟机 host 上直接安装虚拟机并在 ...
- Docker Machine 详解
笔者在<Docker Machine 简介>一文中简单介绍了 Docker Machine 及其基本用法,但是忽略的细节实在是太多了.比如 Docker 与 Docker Machine ...
- 用 Docker Machine 创建 Azure 虚拟主机
搭建环境向来是一个重复造轮子的过程,Docker Machine 则把用户搭建 Docker 环境的各种方案汇集在了一起.笔者在<Docker Machine 简介>一文中演示了使用 Do ...
- Docker Machine的使用
前面两篇文章(<Asp.Net Core 发布到 Docker(Linux Centos 虚拟机,使用Dockerfile)> <Docker Compose的使用>),简单介 ...
- Docker学习—Machine
前言 前面<Docker学习-Compose>文中介绍了Compose的使用方式:接下来继续了解docker三剑客之一的 Machine: 一.Docker Machine简介 1.什么是 ...
- [第十四篇]——Docker Machine之Spring Cloud直播商城 b2b2c电子商务技术总结
Docker Machine 简介 Docker Machine 是一种可以让您在虚拟主机上安装 Docker 的工具,并可以使用 docker-machine 命令来管理主机. Docker Mac ...
- Microsoft 机器学习产品体系对比和介绍
Microsoft 提供多种多样的产品选项用于生成.部署和管理机器学习模型. 本文将比较这些产品,并帮助你选择所需的产品,以便最有效地开发机器学习解决方案. 机器学习产品 描述 作用 Azure云端服 ...
- Continuation-passing style
Continuation-passing style 参考书籍: EOPL ( Essentials of Programming Languages, 3rd Edition ) 作者:知乎用户链 ...
随机推荐
- 那些年蹚过的坑(c++)
1 main中的参数 尽量用英文双引号括起来,否则可能会出现字符串截断的情况(linux gcc 4.4 不加英文引号的话,遇到英文;会丢弃;后面的部分) 2 包含ipv6地址结构体(in6_addr ...
- 查看MS SQL SERVER 错误日志
查看目的: 错误日志的查看是确保过程已成功完成(例如,备份和恢复操作,批处理命令,或其他脚本和过程).这可以帮助检测任何当前或潜在的问题,包括自动恢复信息(尤其是如果SQL Server实例已停止并重 ...
- WCF配置
服务端 <system.serviceModel> <services> <service name="WCF.Homedo.Service.Cache.Ser ...
- 尚学堂Spring视频教程(四):使用Annotation
之前我们的bean都配置在XML里,并且通过bean的property标签来指定依赖关系,如果项目很大,那岂不是要配置很多这样的property标签?Spring提供了注解的方式来解决这个问题 @Au ...
- Mono自定义图片按钮
首先,我们编写一个MyImageButton类,继承自LinearLayout public class MyPhoneImageButton:LinearLayout { private Image ...
- Metro Win8风格的按钮(Filp翻转)
原地址->http://www.cnblogs.com/yk250/p/5661093.html 介绍:简约而不简单....颜色可随意调制,最好用Blend工具. 效果图如下:话说这个图会不会太 ...
- android 程序代码执行adb
Runtime.getRuntime().exec("adb pull /dev/graphics/fb0 C:/fb1"); Runtime. getRuntime().exec ...
- MongoDB常用操作
(备注: 对于 window, 不需要sudo) 验证成功与否: * 启动服务器: $sudo mongod --dbpath C:\data\db (需要 指明数据库存放的目录) * 打开shell ...
- 学习FFmpeg API
ffmpeg是编解码的利器,用了很久,以前看过dranger 的教程,非常精彩,受益颇多,是学习ffmpeg api很好的材料.可惜的是其针对的ffmpeg版本已经比较老了,而ffmpeg的更新又很快 ...
- angularJS全选功能实现
最近在做的一个项目要增加全选和反选功能,之前只做过JQ版的全选和反选. 实现效果: 1.点击全选checkbox可以切换全选和全部清空 2.点击列表中的checkbox,当全部选中时全选选中 3.在全 ...