Atitit.虚拟机与指令系统的设计
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.虚拟机与指令系统的设计相关推荐
- Atitit.导出excel报表的设计与实现java .net php 总
Atitit.导出excel报表的设计与实现java .net php 总结 1. 导出报表 表格的设计要素1 1.1. 支持通用list<Map>转换1 1.2. 对于空列是否输出1 1 ...
- Atitit.数据操作dsl 的设计 ---linq 方案
Atitit.数据操作dsl 的设计 ---linq 方案 1.1. sql与api方式1 1.2. Linq方案与stream方案的选择,1 1.3. 前缀表达式 vs 中缀表达式1 1.4. 要不 ...
- Atitit截屏功能的设计解决方案
Atitit截屏功能的设计解决方案 自己实现.... 使用快捷键.. 弹出自己的win,,背景是屏幕快照 点击鼠标光标变成十字状态 出现截屏窗口 调整截屏窗口位置与大小 释放鼠标,三个btn,, 复 ...
- Atitit 插件机制原理与设计微内核 c# java 的实现attilax总结
Atitit 插件机制原理与设计微内核 c# java 的实现attilax总结 1. 微内核与插件的优点1 2. 插件的注册与使用2 2.1. Ioc容器中注册插件2 2.2. 启动器微内核启动3 ...
- Atitit.struts排除url 的设计and 原理 自定义filter 排除特定url
Atitit.struts排除url 的设计and 原理 自定义filter 排除特定url 1.1. 原理流程1 2. Invoke1 3. StrutsX2 1.1. 原理流程 读取struts配 ...
- java 父委托机制优点_Java虚拟机父类委托机制设计的优点
Java虚拟机父类委托机制设计的优点 昨天朋友的聊天中,讨论起了Java虚拟机的机制,父类委托机制,根加载器.扩展类加载器.应用类加载器.....说了很多,但是朋友(辉哥)的一句话,为什么这样设计呢? ...
- 计算机组成原理指令系统的设计,计算机组成原理与系统设计
计算机组成原理与系统设计 语音 编辑 锁定 讨论 上传视频 <计算机组成原理与系统设计>是机械工业出版社出版的一本书. 中文名 计算机组成原理与系统设计 作 者出版社 出版时间 20 ...
- 计算机体系结构 第2章 指令系统的设计(1)
文章目录 第2章 指令系统的设计 2. 1 指令系统结构的分类 2.1.1 指令系统结构的主要分类 2.1.2 通用寄存器型结构 2.2 寻址方式 2.2.1 寻址方式的定义 2.2.2 立即数寻址方 ...
- 计算机组成原理指令系统的设计,计算机组成原理课程设计-指令系统及专用寄存器设计...
东北大学秦皇岛分校东北大学秦皇岛分校 计算机与通信工程学院计算机与通信工程学院 计算机组成原理计算机组成原理课程设计课程设计 指令系统及专用寄存器设计指令系统及专用寄存器设计 专业名称 计 算 机 科 ...
- 基于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 ...
最新文章
- 内容可编辑_让PDF像WORD一样自由编辑,好用的PDF编辑工具推荐
- 熊猫数据集_对熊猫数据框使用逻辑比较
- html键盘制作,HTML手写键盘(一)
- Linux(Ubuntu)下设置开机自启shell脚本执行Java程序jar包
- 库克:iPhone 12更新换代用户数达到顶峰
- Kotlin入门(25)共享参数模板
- 风变编程python网址_Python越狠,人生越稳丨风变科技广告片拆解
- JellyViewPager
- 第6章 访问权限控制
- System.ConfigurationManager类用于对配置文件的读取
- 2019美赛C题论文解读
- 海盗王封WPE的方法
- Linux下libaio的一个简单例子
- 2.1 px30驱动移植-DRM驱动框架简介
- 龙芯3A3000搭建分布式存储服务etcd
- mysql chroot debian_在我的终端提示中“${debian_chroot:+($debian_chroot)}”有什么作用?...
- 【gcc/g++】1.编译器, 编译过程和基本参数
- Ios端直播商城源码开发之实现全屏直播功能
- 为什么淘宝京东的首页这么快
- VMware之SNAT与DNAT
热门文章
- 不同计算机系统数据表示,计算机系统基础--第二章(数据的机器级表示与处理)...
- aspose word 删除空行_Word:删除空行
- UIScrollView setContentOffset: animated:YES 偶尔卡顿解决方案
- 阿里云前端周刊 - 第 18 期
- Mysql怎样删除以“#sql-”开头的暂时表
- google appid申请
- linux工作技能第二发:vi
- CopyTo 方法详解
- Maven - 配置setting.xml
- python -m a.py 和 python a.py区别