c.a*_*ate 0 compiler-construction jvm
我目前正在构建一个简单的虚拟机作为辅助项目,最终目标是从头开始实现我自己的编程语言。无论如何,我试图松散地复制在 JVM 中看到的许多技术。
我注意到当在 JVM 中调用一个函数时,一个堆栈帧被推送到包含三个部分的调用堆栈上……局部变量数组、操作数堆栈和帧数据。我的问题是 JVM 如何知道要为操作数堆栈部分分配多少空间。是否有一个简单的规则来确定给定函数调用的操作数堆栈应该有多大?
最后,如果操作数堆栈填满会发生什么?堆栈框架是否应该扩展自身以进行补偿?还是应该抛出错误?
JVM 如何知道要为操作数堆栈部分分配多少空间
“帧的操作数堆栈的最大深度在编译时确定,并与与帧关联的方法的代码一起提供。” JVMS §2.6.2 , §4.7.3。
如果操作数堆栈填满会发生什么?
如上所述,每个单独帧的操作数堆栈的大小是预先知道的。对于特定方法,计算不能使用比类文件中指定的更多的操作数堆栈,否则类验证将失败。
“在执行过程中,操作数堆栈的任何时候都不能增长到比 max_stack 项所暗示的深度更大的深度。” JVMS §4.9.2。