JVM动态语言支持
所属分类 jvm
浏览量 848
invokedynamic指令
动态类型语言的关键特征是它的类型检查的主体过程是在运行期而不是编译期进行的,
满足这个特征的语言有很多,常用的包括:
Clojure Erlang Groovy JavaScript Lua Python 等
在编译期就进行类型检查过程的语言,譬如C++和Java等就是最常用的静态类型语言
Java虚拟机层面对动态类型语言的支持一直都还有所欠缺,
主要表现在方法调用方面:JDK7以前的字节码指令集中,
4条方法调用指令(invokevirtual、invokespecial、invokestatic、invokeinterface)
的第一个参数都是被调用的方法的符号引用(CONSTANT_Methodref_info或者CONSTANT_InterfaceMethodref_info常量),
方法的符号引用在编译时产生,而动态类型语言只有在运行期才能确定方法的接收者。
java.lang.invoke包是JSR 292的一个重要组成部分,
这个包的主要目的是在之前单纯依靠符号引用来确定调用的目标方法这条路之外,
提供一种新的动态确定目标方法的机制,称为“方法句柄”(Method Handle)
invokedynamic指令与MethodHandle机制的作用是一样的,
都是为了解决原有4条“invoke*”指令方法分派规则完全固化在虚拟机之中的问题,
把如何查找目标方法的决定权从虚拟机转移到具体用户代码之中,让用户有更高的自由度。
基于栈的字节码解释执行引擎
基于栈的指令集与基于寄存器的指令集 区别
1+1计算
基于栈的指令集
使用操作数栈中的数据作为指令的运算输入,指令的运算结果也存储在操作数栈之中。
基于寄存器的指令集
mov指令把EAX寄存器的值设为1,然后add指令再把这个值加1,结果就保存在EAX寄存器里面
基于栈的指令集主要优点是可移植,因为寄存器由硬件直接提供,
程序直接依赖这些硬件寄存器则不可避免地要受到硬件的约束。
栈架构指令集的主要缺点是理论上执行速度相对来说会稍慢一些,
所有主流物理机的指令集都是寄存器架构。
上一篇
下一篇
Mac快速锁屏
JVM虚拟机执行引擎
JVM里的方法调用分派
深入理解java虚拟机笔记
classpath资源读取问题
影响商业的50本书第30到35本