Atitit.虚拟机与指令系统的设计

1. 两种计算模型  ,堆栈机和状态机(基于寄存器的虚拟机1

1.1.1. 堆栈机1

1.1.2. 状态机2

2. 为什么状态机比堆栈机快呢?3

2.1. Stack based vm的指令 范例4

3. 参考5

1. 两种计算模型  ,堆栈机和状态机(基于寄存器的虚拟机

有了上面的基础只是,我们就知道,堆栈机和状态机不过是两种不同的图灵完整的计算模型而已。

1.1.1. 堆栈机

所谓堆栈机,就是计算机的状态是存在于堆栈之中,通过对堆栈中的元素进行运算和调整,来实现计算功能的计算机。 
例如,要进行一个1+2的加法运算,那么就:

操作

堆栈状态

初始状态

将1压入栈中

1

将2压入栈中

1, 2

调用加法运算

3

其典型代表就是Python的虚拟机,代码如下:

push 1push 2

Add

作者:: 绰号:老哇的爪子 ( 全名::Attilax Akbar Al Rapanui 阿提拉克斯 阿克巴 阿尔 拉帕努伊 ) 汉字名:艾龙,  EMAIL:1466519819@qq.com

转载请注明来源: http://www.cnblogs.com/attilax/

1.1.2. 状态机

状态机的基本原理就在于,它可以有有限种状态,指令能够让它在不同的状态之间进行转换。 
听起来很抽象? 
但其实,我们大部分写代码的时候都是对状态机编程,比如c代码:

int a = 1;int b = 2;int c = a + b;

其实这个状态机有2^96种状态(假设int是32位的),因为变量a有2^32种状态(-2147483648~2147483647),b、c亦然。

操作

a的状态

b的状态

c的状态

初始状态

0

0

0

a=1

1

0

0

b=2

1

2

0

c=a+b

1

2

3

典型代表就是Lua的虚拟机,应的代码就是:

loadk 0 1

loadk 1 2

add 2 0 1

意思就是:

register[0] = 1register[1] = 2register[2] = register[0] + register[1]

2. 为什么状态机比堆栈机快呢?

既然他们是图灵等价的,那大家一定会很疑惑,为何状态机比堆栈机快呢? 
那么我们要深入到虚拟机内部,看看这些指令都是怎么实现的。 
为了便于大家理解,我所有的代码都不是vm中的实际代码,而是伪代码。 
首先来看看堆栈机:

switch(op) {case PUSH:

STACK_ADJ(1);

STACK_TOP = oprand;

break;case ADD:

STACK_SECOND = STACK_TOP + STACK_SECOND;

STACK_ADJ(-1);

break;

}

我们可以看到,大部分情况下,执行一条指令,除了原始的赋值操作外,还需要调整堆栈的栈顶指针(那些STACK_ADJ宏定义),再看看状态机的实现:

switch(op) {case LOADK:

REGISTER[oprand0] = oprand1;

break;case ADD:

REGISTER[oprand0] = REGISTER[oprand1] + REGISTER[oprand2];

break;

}

大家可以看到,在执行大部分指令时,状态机虚拟机会比堆栈机要少一次调整堆栈的操作,这对性能会有很明显的影响。 
当然这也主要适用于Interpreting的情况,在Jit的情况下,会有很多深度优化,从而使得堆栈机的性能也能和状态机一样。

2.1. Stack based vm的指令 范例

一般都是在当前stack中获取和保存操作数的。比如一个简单的加法赋值运算:a=b+c,对于stack based vm,一般会被转化成如下的指令:

[plain] view plain copy print?

1. push b; // 将变量b的值压入stack

2. push c; // 将变量c的值压入stack

3. add;    // 将stack顶部的两个值弹出后相加,将结果压入stack

4. mov a;  // 将stack顶部结果放到a中

3. 参考

高效动态语言虚拟机的设计(二) – 堆栈机vs状态机 - 推酷.htm

Atitit.虚拟机与指令系统的设计的更多相关文章

  1. Atitit截屏功能的设计解决方案

    Atitit截屏功能的设计解决方案 自己实现.... 使用快捷键.. 弹出自己的win,,背景是屏幕快照 点击鼠标光标变成十字状态 出现截屏窗口调整截屏窗口位置与大小 释放鼠标,三个btn,,  复制 ...

  2. Atitit.在线充值功能的设计

    Atitit.在线充值功能的设计 1. 流程1 2. Js sdk api   增加订单1 3. Java api 返回servlet处理1 3.1. 返回网址的本地host测试2 1. 流程 本地增 ...

  3. Atitit.导出excel功能的设计 与解决方案

    Atitit.导出excel功能的设计 与解决方案 1.1. 项目起源于背景1 1.2. Js  jquery方案(推荐)jquery.table2excel1 1.3. 服务器方案2 1.4. 详细 ...

  4. Atitit.数据操作dsl 的设计 ---linq 方案

    Atitit.数据操作dsl 的设计 ---linq 方案 1.1. sql与api方式1 1.2. Linq方案与stream方案的选择,1 1.3. 前缀表达式 vs 中缀表达式1 1.4. 要不 ...

  5. Atitit.request http乱码的设计防止 检测与解决最近实践p825 attilax总结.doc

    Atitit.request http乱码的设计防止 检测与解决最近实践p825 attilax总结.doc 1 浏览器判断一个页面的编码有俩个途径, 一种是通过HTTP响应头, 一个是通过meta: ...

  6. Atitit 插件机制原理与设计微内核 c# java 的实现attilax总结

    Atitit 插件机制原理与设计微内核 c# java 的实现attilax总结 1. 微内核与插件的优点1 2. 插件的注册与使用2 2.1. Ioc容器中注册插件2 2.2. 启动器微内核启动3 ...

  7. atitit.系统架构图 的设计 与工具 attilax总结

    atitit.系统架构图 的设计 与工具 attilax总结 1. 架构图的4个版式(标准,(左右)悬挂1 2. 架构图的层次结构(下属,同事,助手)1 3. wps ppt1 4. 使用EDraw画 ...

  8. atitit.session的原理以及设计 java php实现的异同

    atitit.session的原理以及设计 java php实现的异同 1. session的保存:java在内存中,php脚本因为不能常驻内存,所以在文件中 1 2. php的session机制 1 ...

  9. Atitit  文件上传  架构设计 实现机制 解决方案  实践java php c#.net js javascript  c++ python

    Atitit  文件上传  架构设计 实现机制 解决方案  实践java php c#.net js javascript  c++ python 1. 上传的几点要求2 1.1. 本地预览2 1.2 ...

随机推荐

  1. autossh反向隧道

    实验目标 有两台主机: hostA: 阿里云公网主机 hostB: 本地内网主机 需求实现: 在hostB上使用autossh将hostB的80的端口映射到hostA的8080,使得其他机器访问hos ...

  2. ( 转 ) 优化 Group By -- MYSQL一次千万级连表查询优化

    概述: 交代一下背景,这算是一次项目经验吧,属于公司一个已上线平台的功能,这算是离职人员挖下的坑,随着数据越来越多,原本的SQL查询变得越来越慢,用户体验特别差,因此SQL优化任务交到了我手上. 这个 ...

  3. conversion function to_char to_number

    SELECT )||']', ,'9,999.999')||']', ,'99,999.999')||']', ,'fm99,999.999')||']', '['|| to_char(0.25)|| ...

  4. 数据库的语言——SQL

    DBMS 是一种系统软件,我们要与它交互的时候就必须使用某种语言,在数据库发展初期每一种DBMS 都有自己的特有的语言,不过逐渐的SQL 成为了所有DBMS 都支持的主流语言.SQL 是专为数据库而建 ...

  5. Web应用程序指纹识别工具BlindElephant

    Web应用程序指纹识别工具BlindElephant   BlindElephant是一款Web应用程序指纹识别工具.该工具可以读取目标网站的特定静态文件,计算其对应的哈希值,然后和预先计算出的哈希值 ...

  6. 【字符串哈希】bzoj3916 [Baltic2014]friends

    枚举断点,哈希判断. #include<cstdio> using namespace std; typedef unsigned long long ull; ull hs,hs1,hs ...

  7. 【暴力】vijos P1897 学姐吃牛排

    判断堆:递归判断每个节点的孩子是否都比其父亲大(小). 判断BST:中序遍历是否有序. #include<cstdio> using namespace std; #define lc ( ...

  8. 手动编译含package的java源程序(包含外部包中定义的类)

    1)定义一个GSM类,如下: 包名是“SRC.GSM”,并且此程序引用了外部jar包.使用javac命令对GSM.java进行编译: GSM.java所在的文件夹如下所示: 切换到这个目录为当前工作目 ...

  9. jQuery的deferred对象详解(转)

    jQuery的开发速度很快,几乎每半年一个大版本,每两个月一个小版本. 每个版本都会引入一些新功能.今天我想介绍的,就是从jQuery 1.5.0版本开始引入的一个新功能----deferred对象. ...

  10. c# datatable.select() 支持group by

    不支持group by ,支持order by.如果要使用group by的话,可以使用linq,这是C#3.0的内容.给你个示例static void Main(string[] args){ Da ...