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://blog.csdn.net/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.导出excel报表的设计与实现java .net php 总

    Atitit.导出excel报表的设计与实现java .net php 总结 1. 导出报表 表格的设计要素1 1.1. 支持通用list<Map>转换1 1.2. 对于空列是否输出1 1 ...

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

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

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

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

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

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

  5. Atitit.struts排除url 的设计and 原理 自定义filter 排除特定url

    Atitit.struts排除url 的设计and 原理 自定义filter 排除特定url 1.1. 原理流程1 2. Invoke1 3. StrutsX2 1.1. 原理流程 读取struts配 ...

  6. java 父委托机制优点_Java虚拟机父类委托机制设计的优点

    Java虚拟机父类委托机制设计的优点 昨天朋友的聊天中,讨论起了Java虚拟机的机制,父类委托机制,根加载器.扩展类加载器.应用类加载器.....说了很多,但是朋友(辉哥)的一句话,为什么这样设计呢? ...

  7. 计算机组成原理指令系统的设计,计算机组成原理与系统设计

    计算机组成原理与系统设计 语音 编辑 锁定 讨论 上传视频 <计算机组成原理与系统设计>是机械工业出版社出版的一本书. 中文名 计算机组成原理与系统设计 作    者出版社 出版时间 20 ...

  8. 计算机体系结构 第2章 指令系统的设计(1)

    文章目录 第2章 指令系统的设计 2. 1 指令系统结构的分类 2.1.1 指令系统结构的主要分类 2.1.2 通用寄存器型结构 2.2 寻址方式 2.2.1 寻址方式的定义 2.2.2 立即数寻址方 ...

  9. 计算机组成原理指令系统的设计,计算机组成原理课程设计-指令系统及专用寄存器设计...

    东北大学秦皇岛分校东北大学秦皇岛分校 计算机与通信工程学院计算机与通信工程学院 计算机组成原理计算机组成原理课程设计课程设计 指令系统及专用寄存器设计指令系统及专用寄存器设计 专业名称 计 算 机 科 ...

  10. 基于C++仿真的MIPS32指令系统虚拟计算机设计与实现

    目录 1 项目简介 4 2 功能介绍 4 2.1 概述 4 2.2 功能描述 4 2.2.1 指令控制 4 2.2.2 指令执行 5 2.2.3 内存控制 5 2.2.4 寄存器控制 5 2.2.5 ...

最新文章

  1. 内容可编辑_让PDF像WORD一样自由编辑,好用的PDF编辑工具推荐
  2. 熊猫数据集_对熊猫数据框使用逻辑比较
  3. html键盘制作,HTML手写键盘(一)
  4. Linux(Ubuntu)下设置开机自启shell脚本执行Java程序jar包
  5. 库克:iPhone 12更新换代用户数达到顶峰
  6. Kotlin入门(25)共享参数模板
  7. 风变编程python网址_Python越狠,人生越稳丨风变科技广告片拆解
  8. JellyViewPager
  9. 第6章 访问权限控制
  10. System.ConfigurationManager类用于对配置文件的读取
  11. 2019美赛C题论文解读
  12. 海盗王封WPE的方法
  13. Linux下libaio的一个简单例子
  14. 2.1 px30驱动移植-DRM驱动框架简介
  15. 龙芯3A3000搭建分布式存储服务etcd
  16. mysql chroot debian_在我的终端提示中“${debian_chroot:+($debian_chroot)}”有什么作用?...
  17. 【gcc/g++】1.编译器, 编译过程和基本参数
  18. Ios端直播商城源码开发之实现全屏直播功能
  19. 为什么淘宝京东的首页这么快
  20. VMware之SNAT与DNAT

热门文章

  1. 不同计算机系统数据表示,计算机系统基础--第二章(数据的机器级表示与处理)...
  2. aspose word 删除空行_Word:删除空行
  3. UIScrollView setContentOffset: animated:YES 偶尔卡顿解决方案
  4. 阿里云前端周刊 - 第 18 期
  5. Mysql怎样删除以“#sql-”开头的暂时表
  6. google appid申请
  7. linux工作技能第二发:vi
  8. CopyTo 方法详解
  9. Maven - 配置setting.xml
  10. python -m a.py 和 python a.py区别