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. ret2dir:Rethinking Kernel Isolation(翻译)

    前一段时间在网上找ret2dir的资料,一直没找到比较系统的介绍,于是干脆把这篇经典的论文翻译了,当然,第一次翻译(而且还这么长),很多词汇不知道到底该怎么翻译,而且最近事情也比较多, 翻译得挺烂的, ...

  2. RPD Volume 172 Issue 1-3 December 2016 评论01

    Evaluation of Imaging Dose From Different Image Guided Systems During Head and Neck Radiotherapy: A ...

  3. [SHOI2009] 交通网络

    简单最短路计数. #include<bits/stdc++.h> #define ll long long using namespace std; #define D double co ...

  4. 【分块】【树状数组】bzoj3787 Gty的文艺妹子序列

    题解懒得自己写了,Orz一发wangxz神犇的: http://bakser.gitcafe.com/2014/12/04/bzoj3787-Gty%E7%9A%84%E6%96%87%E8%89%B ...

  5. 【权值分块】bzoj3685 普通van Emde Boas树

    权值分块,虽然渐进复杂度不忍直视,但其极小的常数使得实际运行起来比平衡树快,大多数情况和递归版权值线段树差不多,有时甚至更快.但是被zkw线段树完虐. #include<cstdio> # ...

  6. iOS中用json接收图片的二进制流

    标题可能说的有点混乱,再好好描述一下我遇到的问题: 我负责做一款App的iOS版本,服务器和Android版本都开发完了.服务器的图片存的不是路径,而是在数据库中的blob流对象,由于要求所有数据都用 ...

  7. centos7.2+zabbix3.2+sedmail邮件告警

    http://blog.csdn.net/xiegh2014/article/details/56277111

  8. 【mybatis】mybatis中update更新原来的值加1

    示例代码: floor的值 = floor原来的值+要更新的差距值 <update id="updateFloor" parameterType="com.pise ...

  9. C#之Hello World(入门 )

    C#是一种简单.现代.面向对象和类型安全的编程语言. C#由C和C++发展而来.C#(英文发音C sharp)牢固地植根于C和C++语言族谱中,是Microsoft专门为使用.NET平台而创建的. • ...

  10. new AppiumDriver<>(new URL(url), capabilities) 报错 java.lang.NoSuchMethodError: com.google.common.base.Throwables.throwIfUnchecked(Ljava/lang/Throwable;)V

    2017-10-11 17:37:02.102 INFO c.u.a.r.PrepareDriver:41 - appium server url : http://127.0.0.1:4723/wd ...