1
WordTian 2018-03-24 20:47:17 +08:00
等了半天没人回,我说说我的看法吧,如有错误还请指正
引自网上复制的一段话: Java 虚拟机的指令是从操作数栈中而不是从寄存器中取得操作数的,因此它的运行方式是基于栈的而不是基于寄存器的。虽然指令也可以从其他地方取得操作数,比如从字节码流中跟随在操作码(代表指令的字节)之后的字节中或从常量池中,但是主要还是从操作数栈中获得操作数。 我的理解是: 操作数栈类似于寄存器的作用。 操作数也类似于保存在寄存器中的数据,就是 jvm 虚拟机指令要操作的数据。 比如 a = 1 + 2 iload_0 //把 1 存入操作数栈第 0 号位 iload_1 //把 2 存入操作数栈第 1 号位 iadd //算出 1+2 的值 istore_2 //把算出的值存到操作数栈第 2 号位,回头等下面的指令把值赋给变量 a 我觉得,这里的 1,2,和算出来的值 3,应该都算是操作数 |
2
WordTian 2018-03-24 21:00:08 +08:00 1
@WordTian 又细看了下,举例的注释描述的有问题,我改一下
比如 a = 1 + 2 iload_0 //将 1 压入操作数栈 iload_1 //将 2 压入操作数栈 iadd //从操作数栈中弹出 1、2,将算出的值 3 压入操作数栈 istore_2 //把 3 从操作数栈中弹出,保存到本地变量区 结论没变,在操作数栈里的 1、2,和之后的 3,都算是操作数 |
3
misaka19000 2018-03-24 21:10:04 +08:00 1
你想啊,栈是一种用来保存数据的数据结构,而操作数栈里面保存的就是 Java 虚拟机要执行的指令。
首先聊聊基于寄存器的计算机,它的执行方式为 * 从内存中取出一条指令 * 执行该条指令 HotSpot 的执行方式为 * 从操作数栈中取到一条指令 * 执行该条指令 除此之外,因为没有寄存器,所以和基于寄存器的计算机不一样,HotSpot 很多数据是直接保存在 操作数栈 中的。 |
4
misaka19000 2018-03-24 21:12:12 +08:00
另外说一句,按照谷歌翻译的说法,operand 的意思应该是
> the quantity on which an operation is to be done. 也就是数量而不是数据 |
5
mortonnex OP |
6
tedzhou1221 2018-03-25 22:30:44 +08:00 via Android
《揭秘 JVM 虚拟机》了解一下
|