Atitit.虚拟机与指令系统的设计
Atitit.虚拟机与指令系统的设计
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.虚拟机与指令系统的设计的更多相关文章
- Atitit截屏功能的设计解决方案
Atitit截屏功能的设计解决方案 自己实现.... 使用快捷键.. 弹出自己的win,,背景是屏幕快照 点击鼠标光标变成十字状态 出现截屏窗口调整截屏窗口位置与大小 释放鼠标,三个btn,, 复制 ...
- Atitit.在线充值功能的设计
Atitit.在线充值功能的设计 1. 流程1 2. Js sdk api 增加订单1 3. Java api 返回servlet处理1 3.1. 返回网址的本地host测试2 1. 流程 本地增 ...
- Atitit.导出excel功能的设计 与解决方案
Atitit.导出excel功能的设计 与解决方案 1.1. 项目起源于背景1 1.2. Js jquery方案(推荐)jquery.table2excel1 1.3. 服务器方案2 1.4. 详细 ...
- Atitit.数据操作dsl 的设计 ---linq 方案
Atitit.数据操作dsl 的设计 ---linq 方案 1.1. sql与api方式1 1.2. Linq方案与stream方案的选择,1 1.3. 前缀表达式 vs 中缀表达式1 1.4. 要不 ...
- Atitit.request http乱码的设计防止 检测与解决最近实践p825 attilax总结.doc
Atitit.request http乱码的设计防止 检测与解决最近实践p825 attilax总结.doc 1 浏览器判断一个页面的编码有俩个途径, 一种是通过HTTP响应头, 一个是通过meta: ...
- Atitit 插件机制原理与设计微内核 c# java 的实现attilax总结
Atitit 插件机制原理与设计微内核 c# java 的实现attilax总结 1. 微内核与插件的优点1 2. 插件的注册与使用2 2.1. Ioc容器中注册插件2 2.2. 启动器微内核启动3 ...
- atitit.系统架构图 的设计 与工具 attilax总结
atitit.系统架构图 的设计 与工具 attilax总结 1. 架构图的4个版式(标准,(左右)悬挂1 2. 架构图的层次结构(下属,同事,助手)1 3. wps ppt1 4. 使用EDraw画 ...
- atitit.session的原理以及设计 java php实现的异同
atitit.session的原理以及设计 java php实现的异同 1. session的保存:java在内存中,php脚本因为不能常驻内存,所以在文件中 1 2. php的session机制 1 ...
- 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 ...
随机推荐
- [LOJ#2540][PKUWC2018]随机算法(概率DP)
场上数据很水,比较暴力的做法都可以过90分以上,下面说几个做法. 1. 暴力枚举所有最大独立集,对每个独立集分别DP.复杂度玄学,但是由于最大独立集并不多,所以可以拿90. 2. dp[S][k]表示 ...
- [Codeforces 8E] Beads
Brief Intro: 将所有n位二进制串中满足字典序不大于其逆序串,取反串,逆序取反串中按字典序排序的第m个输出 n<=50 Algorithm: 首次接触数位DP的题目 根据数据范围,我们 ...
- 【拓扑排序】【堆】CH Round #57 - Story of the OI Class 查错
拓扑排序,要让字典序最小,所以把栈改成堆. #include<cstdio> #include<queue> #include<algorithm> using n ...
- SciPy中两个模块:io 和misc
读写.mat文件 如果你有一些数据,或者在网上下载到一些有趣的数据集,这些数据以Matlab的.mat 文件格式存储,那么可以使用scipy.io 模块进行读取. data = scipy.io.lo ...
- Java下List<Long>转List<String>或者List<Long>转List<Integer>
说明:很遗憾,没有快速方法,只能遍历然后循环增加进去. 方法: for(String str : list) { int i = Integer.paseInt(str); intList.add(i ...
- 两道Java面试题!
body { font-family: 微软雅黑; font-size: 14px; line-height: 2; } html, body { color: inherit; background ...
- Nginx 编译参数详解/大全
Nginx参数: –prefix= 指向安装目录 –sbin-path 指向(执行)程序文件(nginx) –conf-path= 指向配置文件(nginx.conf) –error-log-path ...
- Java - Struts框架教程 Hibernate框架教程 Spring框架入门教程(新版) sping mvc spring boot spring cloud Mybatis
https://www.zhihu.com/question/21142149 http://how2j.cn/k/hibernate/hibernate-tutorial/31.html?tid=6 ...
- Visual Studio 控制台应用程序 同时使用OpenCV和matlab mat文件操作
matalb具有灵活的图像处理,代码编写起来简洁而高效.而OpenCV具有很多成熟的计算机视觉算法,能够处理很多实时的识别处理等问题,而且代码运行起来效率很高.所以如何结合两者之间的优点,是让很多学术 ...
- 位图(BitMap)索引
前段时间听同事分享,偶尔讲起Oracle数据库的位图索引,顿时大感兴趣.说来惭愧,在这之前对位图索引一无所知,因此趁此机会写篇博文介绍下位图索引. 1. 案例 有张表名为table的表,由三列组成,分 ...