我正在阅读有关JVM体系结构的信息。今天,我了解了操作数堆栈的概念。根据一篇文章:
在字节码指令执行期间使用操作数堆栈,其方式与在本机CPU中使用通用寄存器的方式类似。
我不明白:操作数堆栈到底是什么,以及它在jvm中如何工作?
这是各种单个字节码操作如何获取其输入以及它们如何提供其输出的方式。
例如,考虑iadd将两个ints相加的运算。要使用它,您将两个值压入堆栈,然后使用它:
iadd
int
iload_0 # Push the value from local variable 0 onto the stack iload_1 # Push the value from local variable 1 onto the stack iadd # Pops those off the stack, adds them, and pushes the result
现在,堆栈上的最高值是这两个局部变量的总和。下一个操作可能会使用该顶部堆栈的值并将其存储在某个位置,或者我们可能会将另一个值压入堆栈以执行其他操作。
假设您要将三个值加在一起。堆栈使操作变得简单:
iload_0 # Push the value from local variable 0 onto the stack iload_1 # Push the value from local variable 1 onto the stack iadd # Pops those off the stack, adds them, and pushes the result iload_2 # Push the value from local variable 2 onto the stack iadd # Pops those off the stack, adds them, and pushes the result
现在,堆栈上的最高值是将这三个局部变量相加的结果。
让我们更详细地看第二个例子:
我们假设:
27
10
5
所以最初:
+------+ | 堆叠 +------+ +------+
那我们做
iload_0 # Push the value from local variable 0 onto the stack
现在我们有
+------+ | 堆叠 +------+ | 27 | +------+
下一个
iload_1 # Push the value from local variable 1 onto the stack +------+ | 堆叠 +------+ | 10 | | 27 | +------+
现在我们进行添加:
iadd # Pops those off the stack, adds them, and pushes the result
它“弹出” 10和27离开堆栈,将它们加在一起,然后推入结果(37)。现在我们有:
37
+------+ | 堆叠 +------+ | 37 | +------+
第三次时间int:
iload_2 # Push the value from local variable 2 onto the stack +------+ | 堆叠 +------+ | 5 | | 37 | +------+
我们做第二件事iadd:
这给了我们:
+------+ | 堆叠 +------+ | 42 | +------+
(当然,这是 对宇宙和一切生命的终极问题的解答。)