于堆栈的(Stack-based ) 和基于寄存器(Register-based) 的虚拟机区别

转载:
虚拟机可分为两种:基于堆栈的(Stack-based ) 和基于寄存器(Register-based) 的虚拟机。基于堆栈的虚拟机也定义了少量的寄存器,基于寄存器的虚拟机也有堆栈,其区别体现在它们提供的指令集体系结构(ISA ,Instruction Set Architecture) 。ISA 是处理器的一部分,对于编译器实现者和程序员是可见的,ISA 是硬件和软件之间的接口。基于堆栈的虚拟机的指令比基于寄存器的指令要小,因为在指令中不需要指定操作数。基于堆栈的虚拟机使用堆栈来保存中间结果、变量等,基于寄存器的虚拟机则支持寄存器的指令操作。基于堆栈的虚拟机需要用Push 、Pop 来传送数据,通常,完成同样的工作,基于寄存器的虚拟机所采用的指令数比基于堆栈的虚拟机采用的指令数目少,可以提高执行效率。例如,将语句 C=A+B转化为中间代码,如图3.3所示。
这里写图片描述
堆栈虚拟机指令很低级,基于寄存器的处理器有更强大的指令功能,而且易于调试。
基于堆栈的处理器在处理函数调用、解决递归问题和切换上下文时简单明快。
采用寄存器架构时,虚拟机需要经常保存和恢复寄存器中的内容,还要考虑对操作数的寻址问题等,因此,基于堆栈的虚拟机实现起来更简单,基于寄存器的虚拟机能提供更强大的指令集。
大多数虚拟机是基于堆栈的,如Pascal’s P-machine 、Java 的JVM和微软的.Net 环境。当前流行的 Lua 脚本语言,5.0之前的版本也是基于堆栈的,5.0之后改为基于寄存器实现。虚拟机实现越复杂,解密者也就越难破解,但是其实现成本也高。
基于寄存器的虚拟机需要用寄存器来保存中间结果、变量等,而基于堆栈的虚拟机使用堆栈即可。例如,针对同一条指令:Add,基于堆栈的处理器的首先从堆栈里Pop两个数,然后将两数相加,再把和Push到堆栈,Add指令只占用1个字节,而基于寄存器的处理器的对应指令为AddR1,R2,113,Add指令至少要占用4个字节。通过以上比较可以看出,基于堆栈的体系架构实现较为简单,但其运行效率不如基于寄存器的,而基于寄存器的体系结构在编译后的代码结构上又不如基于堆栈的简洁。对于同一个程序,为基于堆栈的机器编译出来的版本要比为基于寄存器的机器编译出来的版本小好几倍。
基于堆栈的指令集能够让字节码更紧凑,可以提高Cache的利用率,而且实现起来也比基于寄存器的机器要简单。而基于寄存器的虚拟机虽然代码大小有所增加,但是带来的性能提升更加突出。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值