jvm 的虚拟机栈里面的操作数栈的问题

2018-03-24 19:05:51 +08:00
 mortonnex
这里的操作数栈 的 "操作数" 是指什么
2474 次点击
所在节点    程序员
6 条回复
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,应该都算是操作数
WordTian
2018-03-24 21:00:08 +08:00
@WordTian 又细看了下,举例的注释描述的有问题,我改一下

比如 a = 1 + 2
iload_0 //将 1 压入操作数栈
iload_1 //将 2 压入操作数栈
iadd //从操作数栈中弹出 1、2,将算出的值 3 压入操作数栈
istore_2 //把 3 从操作数栈中弹出,保存到本地变量区

结论没变,在操作数栈里的 1、2,和之后的 3,都算是操作数
misaka19000
2018-03-24 21:10:04 +08:00
你想啊,栈是一种用来保存数据的数据结构,而操作数栈里面保存的就是 Java 虚拟机要执行的指令。

首先聊聊基于寄存器的计算机,它的执行方式为
* 从内存中取出一条指令
* 执行该条指令

HotSpot 的执行方式为
* 从操作数栈中取到一条指令
* 执行该条指令

除此之外,因为没有寄存器,所以和基于寄存器的计算机不一样,HotSpot 很多数据是直接保存在 操作数栈 中的。
misaka19000
2018-03-24 21:12:12 +08:00
另外说一句,按照谷歌翻译的说法,operand 的意思应该是
> the quantity on which an operation is to be done.

也就是数量而不是数据
mortonnex
2018-03-24 21:40:29 +08:00
tedzhou1221
2018-03-25 22:30:44 +08:00
《揭秘 JVM 虚拟机》了解一下

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/441076

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX