深机笔记 - 17 基于栈的字节码解释解释执行引擎
2017-08-04 18:38
447 查看
《深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)》8.4节
上图中:
下边那条分支,是传统编译原理中程序代码到目标机器代码的生成过程
中间那条分支,是解释执行过程
词法分析、语法分析以至后面的优化器、目标代码生成器选择独立于执行引擎,形成一个完整意义的编译器实现,这类代表是C/C++语言
把其中一部分步骤(如生成抽象语法树之前的步骤)实现为一个半独立编译器,在虚拟机之外进行,而解释器在虚拟机内部,这类代表是Java语言
把这些步骤和执行引擎全部集中封装在一个封闭的黑匣子之中,这类代表是大多数的JavaScript执行器
例,计算“1+1”的指令序列:
iconst_1
iconst_1
iadd
istore_0
两条iconst_1指令连续把两个常量1压入栈
然后iadd指令把栈顶两个值出栈、相加,把结果放回栈顶
最后istore_0把栈顶的值放到局部变量表第0个Slot中
优点:
可移植,寄存器由硬件直接提供,程序不直接依赖硬件寄存器
代码相对更加紧凑(字节码中每个字节就对应一条指令,而多地址指令集中还需要存放参数)
编译器实现更加简单(不需要考虑空间分配的问题,所需空间都在栈上操作)
缺点:
由于指令数量和内存访问的原因,导致栈架构指令集的执行速度会相对较慢
完成相同功能所需的指令数量会比寄存器架构多,因为出栈、入栈操作本身就产生了相当多的指令数量
栈实现在内存中,频繁的栈访问意味着频繁的内存访问,相对于处理器来说,内存始终是执行速度的瓶颈
四则运算对应字节码表示:
四则运算对应字节码执行过程中代码、操作数栈和局部变量表的变化情况:
以下执行过程仅仅是一种概念模型,虚拟机中解析器、即时编译器会对字节码进行优化以提高性能,实际情况会和概念模型描述差距非常大
但从以下执行中可看出栈结构指令集的一般运行过程,中间变量以操作数栈的出栈、入栈为信息交换途径
解释执行
上图中:
下边那条分支,是传统编译原理中程序代码到目标机器代码的生成过程
中间那条分支,是解释执行过程
词法分析、语法分析以至后面的优化器、目标代码生成器选择独立于执行引擎,形成一个完整意义的编译器实现,这类代表是C/C++语言
把其中一部分步骤(如生成抽象语法树之前的步骤)实现为一个半独立编译器,在虚拟机之外进行,而解释器在虚拟机内部,这类代表是Java语言
把这些步骤和执行引擎全部集中封装在一个封闭的黑匣子之中,这类代表是大多数的JavaScript执行器
基于栈的指令集架构(Instruction Set Architecture, ISA)
Java编译器输出的指令流,基本上是一种基于栈的指令集架构,指令流中的指令大部分都是零地址指令,它们依赖操作数栈进行工作例,计算“1+1”的指令序列:
iconst_1
iconst_1
iadd
istore_0
两条iconst_1指令连续把两个常量1压入栈
然后iadd指令把栈顶两个值出栈、相加,把结果放回栈顶
最后istore_0把栈顶的值放到局部变量表第0个Slot中
优点:
可移植,寄存器由硬件直接提供,程序不直接依赖硬件寄存器
代码相对更加紧凑(字节码中每个字节就对应一条指令,而多地址指令集中还需要存放参数)
编译器实现更加简单(不需要考虑空间分配的问题,所需空间都在栈上操作)
缺点:
由于指令数量和内存访问的原因,导致栈架构指令集的执行速度会相对较慢
完成相同功能所需的指令数量会比寄存器架构多,因为出栈、入栈操作本身就产生了相当多的指令数量
栈实现在内存中,频繁的栈访问意味着频繁的内存访问,相对于处理器来说,内存始终是执行速度的瓶颈
基于栈的解释器执行过程
例:/** * 四则运算 */ public int calc() { int a = 100; int b = 200; int c = 300; return (a + b) * c; }
四则运算对应字节码表示:
public int calc(); Code: Stack=2, Locals=4, Args_size=1 0:bipush100 2:istore_1 3:sipush200 6:istore_2 7:sipush300 10:istore_3 11:iload_1 12:iload_2 13:iadd 14:iload_3 15:imul 16:ireturn }
四则运算对应字节码执行过程中代码、操作数栈和局部变量表的变化情况:
以下执行过程仅仅是一种概念模型,虚拟机中解析器、即时编译器会对字节码进行优化以提高性能,实际情况会和概念模型描述差距非常大
但从以下执行中可看出栈结构指令集的一般运行过程,中间变量以操作数栈的出栈、入栈为信息交换途径
相关文章推荐
- Jvm笔记总结(十一):基于栈的字节码解释执行引擎
- 基于栈的字节码解释执行引擎
- [深入理解Java虚拟机]第八章 字节码执行引擎-基于栈的字节码解释执行引擎
- [置顶] 《深入理解Java虚拟机》——方法调用与基于栈的字节码解释执行引擎
- 虚拟机字节码操作引擎-----基于栈的字节码解释引擎
- 字节码解释执行引擎
- Java虚拟机学习笔记(字节码执行引擎)
- JVM高级特性与实践(十一):方法调用 与 字节码解释执行引擎(实例解析)
- JVM高级特性与实践(十一):方法调用 与 字节码解释执行引擎(实例解析)
- JVM学习笔记(7)-字节码执行引擎
- [深入理解Java虚拟机]第九章 字节码执行引擎-类加载及执行子系统的案例与实战
- Java基础知识强化之网络编程笔记17:Android网络通信之 使用Http的Post方式读取网络数据(基于HTTP通信技术)
- Jvm笔记总结(十):虚拟机字节码执行引擎
- Java笔记17:导出可执行jar包
- 【Cocos2d-x游戏引擎开发笔记(17)】实现运动的尾巴效果
- 深入理解Java虚拟机 字节码执行引擎
- 【Cocos2d-x游戏引擎开发笔记(17)】实现运动的尾巴效果
- 【Cocos2d-x游戏引擎开发笔记(17)】实现运动的尾巴效果
- 【JVM】字节码执行引擎
- 【分析】dalvik虚拟机解释执行字节码