V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
mortonnex
V2EX  ›  程序员

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

  •  1
     
  •   mortonnex · 2018-03-24 19:05:51 +08:00 · 2505 次点击
    这是一个创建于 2465 天前的主题,其中的信息可能已经有所发展或是发生改变。
    这里的操作数栈 的 "操作数" 是指什么
    6 条回复    2018-03-25 22:30:44 +08:00
    WordTian
        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,应该都算是操作数
    WordTian
        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,都算是操作数
    misaka19000
        3
    misaka19000  
       2018-03-24 21:10:04 +08:00   ❤️ 1
    你想啊,栈是一种用来保存数据的数据结构,而操作数栈里面保存的就是 Java 虚拟机要执行的指令。

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

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

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

    也就是数量而不是数据
    mortonnex
        5
    mortonnex  
    OP
       2018-03-24 21:40:29 +08:00
    tedzhou1221
        6
    tedzhou1221  
       2018-03-25 22:30:44 +08:00 via Android
    《揭秘 JVM 虚拟机》了解一下
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5983 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 37ms · UTC 03:09 · PVG 11:09 · LAX 19:09 · JFK 22:09
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.