确定堆栈帧的操作数堆栈的大小
Determining the size of the Operand Stack for a Stack Frame
我目前正在构建一个简单的虚拟机作为辅助项目,最终目标是从头开始实现我自己的编程语言。无论如何,我正在尝试松散地复制 JVM 中看到的许多技术。
我注意到,当在 JVM 中调用一个函数时,一个堆栈帧被压入包含三个部分的调用堆栈...局部变量数组、操作数堆栈和帧数据。我的问题是 JVM 如何知道要为操作数堆栈部分分配多少 space。是否有一个简单的规则来确定给定函数调用的操作数堆栈应该有多大?
最后,如果操作数栈满了怎么办?堆栈框架是否应该扩展自身以进行补偿?还是应该抛出错误?
how does the JVM know how much space to allocate for the operand stack section
“帧的操作数堆栈的最大深度在编译时确定,并随与帧关联的方法的代码一起提供。” JVMS §2.6.2, §4.7.3.
what happens if the operand stack fills up?
如上所述,每个单独帧的操作数堆栈的大小是事先已知的。对于特定方法,计算使用的操作数堆栈不能超过 class 文件中指定的数量,否则 class 验证将失败。
“在执行过程中,操作数堆栈的深度不能超过 max_stack 项所暗示的深度。” JVMS §4.9.2.
我目前正在构建一个简单的虚拟机作为辅助项目,最终目标是从头开始实现我自己的编程语言。无论如何,我正在尝试松散地复制 JVM 中看到的许多技术。
我注意到,当在 JVM 中调用一个函数时,一个堆栈帧被压入包含三个部分的调用堆栈...局部变量数组、操作数堆栈和帧数据。我的问题是 JVM 如何知道要为操作数堆栈部分分配多少 space。是否有一个简单的规则来确定给定函数调用的操作数堆栈应该有多大?
最后,如果操作数栈满了怎么办?堆栈框架是否应该扩展自身以进行补偿?还是应该抛出错误?
how does the JVM know how much space to allocate for the operand stack section
“帧的操作数堆栈的最大深度在编译时确定,并随与帧关联的方法的代码一起提供。” JVMS §2.6.2, §4.7.3.
what happens if the operand stack fills up?
如上所述,每个单独帧的操作数堆栈的大小是事先已知的。对于特定方法,计算使用的操作数堆栈不能超过 class 文件中指定的数量,否则 class 验证将失败。
“在执行过程中,操作数堆栈的深度不能超过 max_stack 项所暗示的深度。” JVMS §4.9.2.