热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

确定堆栈帧的操作数堆栈的大小

我目前正在构建一个简单的虚拟机作为辅助项目,最终目标是从头开始实现我自己的编程语言。无论如何,我试图松散地复制在JVM中看到的许多技术。我注意到当在JVM中调用一个函

我目前正在构建一个简单的虚拟机作为辅助项目,最终目标是从头开始实现我自己的编程语言。无论如何,我试图松散地复制在 JVM 中看到的许多技术。

我注意到当在 JVM 中调用一个函数时,一个堆栈帧被推送到包含三个部分的调用堆栈上……局部变量数组、操作数堆栈和帧数据。我的问题是 JVM 如何知道要为操作数堆栈部分分配多少空间。是否有一个简单的规则来确定给定函数调用的操作数堆栈应该有多大?

最后,如果操作数堆栈填满会发生什么?堆栈框架是否应该扩展自身以进行补偿?还是应该抛出错误?

回答



JVM 如何知道要为操作数堆栈部分分配多少空间

“帧的操作数堆栈的最大深度在编译时确定,并与与帧关联的方法的代码一起提供。” JVMS §2.6.2 , §4.7.3。

如果操作数堆栈填满会发生什么?

如上所述,每个单独帧的操作数堆栈的大小是预先知道的。对于特定方法,计算不能使用比类文件中指定的更多的操作数堆栈,否则类验证将失败。

“在执行过程中,操作数堆栈的任何时候都不能增长到比 max_stack 项所暗示的深度更大的深度。” JVMS §4.9.2。



  • §2.5.2 is talking about the call stack (a.k.a. the Java Virtual Machine stack), not the operand stack. The only way that the operand stack could overflow would be if the maximum depth of the operand stack is incorrect, which would mean the bytecode is illegal and will be rejected during the verification stage.


  • @c.abate in case of Java bytecode, you must even track the types that are expected to be on the operand stack, to provide stack map frames for branch merge points. This implies that the same type of items must be at the beginning of the loop as in the next iteration, otherwise, they are unusable. But usually, when you have modelled the elements of your programming language and converted the source code to a tree, this knowledge comes for free.


  • @c.abate Keep track of the stack depth while generating code for a method: Every time you emit an instruction that grows the stack, you increase the stack depth. Every time you emit an instruction that shrinks the stack, you decrease the stack depth. Every time the current depth of stack exceeds the maximum, you set the maximum to the current depth.


  • @c.abate Exactly. When writing a verifier, you'll need to make sure that such a thing can't happen (i.e. that all incoming edges of a basic block come from blocks with the same outgoing stack depth), but when counting the depth in the code generator, you simply know that (barring bugs) this can't happen because you won't generate code that does that.





推荐阅读
  • 重入锁(ReentrantLock)学习及实现原理
    本文介绍了重入锁(ReentrantLock)的学习及实现原理。在学习synchronized的基础上,重入锁提供了更多的灵活性和功能。文章详细介绍了重入锁的特性、使用方法和实现原理,并提供了类图和测试代码供读者参考。重入锁支持重入和公平与非公平两种实现方式,通过对比和分析,读者可以更好地理解和应用重入锁。 ... [详细]
  • Go语言实现堆排序的详细教程
    本文主要介绍了Go语言实现堆排序的详细教程,包括大根堆的定义和完全二叉树的概念。通过图解和算法描述,详细介绍了堆排序的实现过程。堆排序是一种效率很高的排序算法,时间复杂度为O(nlgn)。阅读本文大约需要15分钟。 ... [详细]
  • 本文整理了Java中java.lang.NoSuchMethodError.getMessage()方法的一些代码示例,展示了NoSuchMethodErr ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文讨论了如何使用IF函数从基于有限输入列表的有限输出列表中获取输出,并提出了是否有更快/更有效的执行代码的方法。作者希望了解是否有办法缩短代码,并从自我开发的角度来看是否有更好的方法。提供的代码可以按原样工作,但作者想知道是否有更好的方法来执行这样的任务。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • 使用圣杯布局模式实现网站首页的内容布局
    本文介绍了使用圣杯布局模式实现网站首页的内容布局的方法,包括HTML部分代码和实例。同时还提供了公司新闻、最新产品、关于我们、联系我们等页面的布局示例。商品展示区包括了车里子和农家生态土鸡蛋等产品的价格信息。 ... [详细]
  • Java源代码安全审计(二):使用Fortify-sca工具进行maven项目安全审计
    本文介绍了使用Fortify-sca工具对maven项目进行安全审计的过程。作者通过对Fortify的研究和实践,记录了解决问题的学习过程。文章详细介绍了maven项目的处理流程,包括clean、build、Analyze和Report。在安装mvn后,作者遇到了一些错误,并通过Google和Stack Overflow等资源找到了解决方法。作者分享了将一段代码添加到pom.xml中的经验,并成功进行了mvn install。 ... [详细]
  • 本文介绍了2015年九月八日的js学习总结及相关知识点,包括参考书《javaScript Dom编程的艺术》、js简史、Dom、DHTML、解释型程序设计和编译型程序设计等内容。同时还提到了最佳实践是将标签放到HTML文档的最后,并且对语句和注释的使用进行了说明。 ... [详细]
  • 使用C++编写程序实现增加或删除桌面的右键列表项
    本文介绍了使用C++编写程序实现增加或删除桌面的右键列表项的方法。首先通过操作注册表来实现增加或删除右键列表项的目的,然后使用管理注册表的函数来编写程序。文章详细介绍了使用的五种函数:RegCreateKey、RegSetValueEx、RegOpenKeyEx、RegDeleteKey和RegCloseKey,并给出了增加一项的函数写法。通过本文的方法,可以方便地自定义桌面的右键列表项。 ... [详细]
  • MySQL多表数据库操作方法及子查询详解
    本文详细介绍了MySQL数据库的多表操作方法,包括增删改和单表查询,同时还解释了子查询的概念和用法。文章通过示例和步骤说明了如何进行数据的插入、删除和更新操作,以及如何执行单表查询和使用聚合函数进行统计。对于需要对MySQL数据库进行操作的读者来说,本文是一个非常实用的参考资料。 ... [详细]
  • 本文整理了Java中com.evernote.android.job.JobRequest.getTransientExtras()方法的一些代码示例,展示了 ... [详细]
  • 本文整理了Java中org.apache.solr.common.SolrDocument.setField()方法的一些代码示例,展示了SolrDocum ... [详细]
author-avatar
lylmwt
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有