基于栈的字节码解释执行引擎

虚拟机如何执行方法里面的字节码指令的呢?java虚拟机的执行引擎在执行java代码的时候都有解释执行(通过解释器执行)和编译执行(通过即时编译器产生本地代码进行执行)两种执行。

1、解释执行


上图中下面的分支是传统编译原理中程序代码到目标机器代码的生成过程,而中间那条分支自然就是解释执行的过程。

java语言中,javac编译器完成了程序代码经过词法分析、语法分析到抽象语法数、再遍历语法生成线性的字节码指令流的过程,因为这一部分动作是在java虚拟机之外进行的,而解释器在虚拟机的内部,所以java程序的编译就是半独立的实现。

2、基于栈的指令集与基于寄存器的指令集

java编译器输出的指令流,基本上是一种基于栈的指令集架构,指令流里面的指令大部分都是零地址指令,它们依赖操作数栈进行工作,与之相对的另外一套常用的指令集架构是基于寄存器的指令集,最典型的就是x86的二地址指令集,更通俗一些, 就是现在我们驻留pc中直接支持的指令集架构,这些指令依赖寄存器进行工作。那么基于栈的指令集和基于寄存器的指令集在这两者之间又什么不同呢?

例如,分别使用这两种指令集去计算“1+1”的结果,基于栈的指令计算过程:

iconst_1

iconst_1

iadd

istore_0

两个iconst_1指令连续的把两个常量1压入栈后,iadd指令把栈顶的两个值出栈并相加,然后把结果放回栈顶,最后istore_0把栈顶的值放到局部便量表的第0个slot中。

如果是基于寄存器的指令集,程序会是这样的:

mov eax,1

add eax,1

mov指令把EAX寄存器的值设为1,然后add指令再把这个值加1,结果就保存在EAX寄存器中。

两套指令集谁更好一些呢?两套指令集同时并存和发展,各有优势,基于栈的指令集最主要的优点就是可移植性,寄存器由硬件直接提供,程序直接依赖这些硬件寄存器则不可避免的要受到硬件的约束。

栈架构指令集的主要缺点是执行速度相对来说稍慢一些。栈架构指令集的代码虽然紧凑,但是完成相同功能所需的指令数量一般会比寄存器架构多,因为出栈、入栈操作本身就产生了相当多的指令。更重要是栈实现在内存中,频繁的栈访问也就意味着频繁的内存访问,相对于处理器来说,内存始终是执行速度的瓶颈,尽管虚拟机可以采用栈顶缓存的手段,把最常用的操作映射到寄存器中以避免直接内存访问,但这也只是优化措施而不是解决本质问题的方法,因此,由于指令数量和内存访问的原因,导致了栈架构指令集的执行速度相对较慢。



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值