一尘不染

什么是操作数堆栈?

java

我正在阅读有关JVM体系结构的信息。今天,我了解了操作数堆栈的概念。根据一篇文章:

在字节码指令执行期间使用操作数堆栈,其方式与在本机CPU中使用通用寄存器的方式类似。

我不明白:操作数堆栈到底是什么,以及它在jvm中如何工作?


阅读 826

收藏
2020-12-03

共1个答案

一尘不染

这是各种单个字节码操作如何获取其输入以及它们如何提供其输出的方式。

例如,考虑iadd将两个ints相加的运算。要使用它,您将两个值压入堆栈,然后使用它:

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

现在,堆栈上的最高值是将这三个局部变量相加的结果。

让我们更详细地看第二个例子:

我们假设:

  • 开始时栈是空的 (实际上几乎从来都不是真的,但是在开始之前我们并不关心 栈中的内容
  • 局部变量0包含 27
  • 局部变量1包含 10
  • 局部变量2包含 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

它“弹出” 1027离开堆栈,将它们加在一起,然后推入结果(37)。现在我们有:

+------+
| 堆叠
+------+
| 37 |
+------+

第三次时间int

iload_2     # Push the value from local variable 2 onto the stack



+------+
| 堆叠
+------+
| 5 |
| 37 |
+------+

我们做第二件事iadd

iadd        # Pops those off the stack, adds them, and pushes the result

这给了我们:

+------+
| 堆叠
+------+
| 42 |
+------+

(当然,这是
对宇宙和一切生命的终极问题的解答
。)

2020-12-03