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. Linux命令之fdisk

    fdisk fdisk [选项] <disk>  改变分区表 fdisk [选项] –l <disk>  列出所有分区表 fdisk –s <partition(分区编号 ...

  2. RPD Volume 168 Issue 4 March 2016 评论7-end

    Shielding activation of petawatt laser facilities in Romania: a FLUKA preliminary evaluation   Abstr ...

  3. 设计高效SQL: 一种视觉的方法

    行; 这听起来很直观,但最有效的方法是什么?你可能有如下选择:行,其中有50行你必须剔除行,其中有450行你必须剔除行中剔除50行听起来比从500行中剔除450行更高效,但是请记住:聚簇,或者说,数据 ...

  4. 制作推送证书 and Code=3000 "未找到应用程序的“aps-environment”的权利字符串"

    制作推送证书 step1. 打开苹果开发者网站 step2. 从Member Center进入Certificates, Identifiers & Profiles step3. 选择要制作 ...

  5. Hadoop学习入门

    1.hadoop相关术语 HDFS: Hadoop分布式文件系统(HDFS,Hadoop Distributed Filesystem) MapReduce: NameNode: DataNode: ...

  6. SecureCRT实现跳板机自动登录

    背景: 1.通常运维会开放几个内网的机器能跳转到外网机器进行访问,这样的就是跳板机. 2.比如线上有120.0.0.2这台机器,而内网192.168.1.2这台连接了VPN,能通过SSH登录120.0 ...

  7. ethtool 命令输出的注意点--网卡参数

    http://blog.csdn.net/msdnchina/article/details/70339689

  8. 一个 关于 case when的SQL

    [例]从stud_grade表中查询所有同学考试成绩情况,凡成绩为空者输出“未考”.小于60分输出“不及格”.60分至70分输出“及格”.70分至90分输出“良好”.大于或等于90分时输出“优秀”. ...

  9. 项目打jar包,怎么把第三放jar包一起打入

    <plugin> <artifactId>maven-assembly-plugin</artifactId> <configuration> < ...

  10. Accessing Report Server using Report Server Web Service - Microsoft SQL Server 2008R2

    Today I am going to write about how to access SQL Server Report Server through Report Server Web ser ...