JVM 规范中 JSR/RET 的状态

2024-01-07

JVM 规范的某些部分建议操作JSR(跳转子例程) http://docs.oracle.com/javase/specs/jvms/se8/html/jvms-6.html#jvms-6.5.jsr, JSR_W(跳转子例程范围) http://docs.oracle.com/javase/specs/jvms/se8/html/jvms-6.html#jvms-6.5.jsr_w and RET(从子程序返回) http://docs.oracle.com/javase/specs/jvms/se8/html/jvms-6.html#jvms-6.5.ret只能在类文件版本 50.0 (JDK 1.6) 之前使用:

3.13 最终编译 http://docs.oracle.com/javase/specs/jvms/se8/html/jvms-3.html#jvms-3.13

(本节假设编译器生成版本号为 50.0 或以下的类文件,以便可以使用 jsr 指令。另请参阅§4.10.2.5 http://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.10.2.5.)

然后:

4.10.2.5。例外情况和finally http://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.10.2.5

为实施try-finally构造,Java 编程语言的编译器,生成class版本号为 50.0 或更低的文件可以使用异常处理工具以及两个特殊指令:jsr(“跳转到子程序”)和ret(“从子程序返回”)。

另一方面,操作码描述本身并没有提及这些功能的弃用。引用的文本只说明了 50.0 版本之前的情况,但没有明确说明此后的情况。

这条评论 https://stackoverflow.com/questions/5871190/why-are-jsr-ret-deprecated-java-bytecode#comment48074067_5871190(对于询问这种弃用或删除背后动机的问题)表明了类似程度的混乱,所以显然我不是唯一一个在寻找这一点的人。


在添加我的问题的链接时,我注意到有问题的操作码不存在§4.10.1.9:类型检查说明 http://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.10.1.9。所以这表明新的基于 strackframe 的类型验证方案无法处理它们,并且§4.10:类文件的验证 http://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.10 writes:

必须使用类型检查验证来验证class版本号大于或等于 50.0 的文件。

或者更详细地在§4.10.1:通过类型检查进行验证 http://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.10.1:

A class版本号为50.0或以上的文件(§4.1 http://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.1)必须使用本节中给出的类型检查规则进行验证。

当且仅当,一个class文件的版本号等于 50.0,那么如果类型检查失败,Java 虚拟机实现可能会选择尝试通过类型推断来执行验证(§4.10.2 http://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.10.2).

所以我会说版本 50.0 类may仍含有jsr and ret,但存在 JVM 实现不会验证所述类并因此加载失败的风险。

但后来我发现了一个更明确的规则,§4.9.1:静态约束 http://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.9.1:

仅记录的说明的实例§6.5 http://docs.oracle.com/javase/specs/jvms/se8/html/jvms-6.html#jvms-6.5可能会出现在code大批。使用保留操作码的指令实例(§6.2 http://docs.oracle.com/javase/specs/jvms/se8/html/jvms-6.html#jvms-6.2)或本规范中未记录的任何操作码不得出现在code array.

If the class文件版本号为 51.0 或以上,则jsr操作码或jsr_w操作码可能出现在code array.

第一段与此问题无关,因为说明已在第 6.5 节中列出,并且根据第 6.2 节不予保留。但第二段明确将它们标记为在 51.0 及更高版本中禁止的。这ret另一方面,如果没有操作码,则毫无用处jsr or jsr_w,因为只有这两条指令可以创建类型为的堆栈元素returnAddress(并通过一些astore该类型的局部变量)被使用ret.


我仍然认为第 6.5 节中应该包含一些关于此效果的通知。不幸的是,Java 错误报告网页 http://bugreport.java.com/隐藏Continue按钮,如果选择类型:Bug, 类别:Java平台标准版, 子类别:规格。它指出

该子类别用于报告 Java 语言规范和 JVM 规范文本中的技术错误和歧义。它不是提出 Java 语言或 JVM 新功能的场所。持续的功能开发是在OpenJDK http://openjdk.java.net/jeps/; Java 语言规范和 JVM 规范的相应增强是通过Java 社区进程 http://www.jcp.org/.

但是,仅仅为了在这三个操作码的描述中添加一些澄清说明而浏览 JCP 感觉就有点矫枉过正了。因此,我希望这篇文章可以帮助那些无法在规范本身中找到答案的人。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JVM 规范中 JSR/RET 的状态 的相关文章

  • 如何在日期选择器中设置不在当前月份的单元格的样式

    我目前正在为我的 JavaFX 应用程序制作注册表 问题是 当日期选择器中的单元格不在页面的月份上时 我想让该单元格变灰 让我们看看我当前的日期选择器 我的日期选择器 正如您所看到的 我希望下个月的日期 27 日 28 日 30 日以及 1
  • Java 中的 XPath 节点集

    我在 eclipse 中有这段代码 NodeSet nodes NodeSet xPath evaluate expression inputSource XPathConstants NODESET 它给我 NodeSet 上的编译时错误
  • 如何使用 FileChannel 将一个文件的内容附加到另一个文件的末尾?

    File a txt好像 ABC File d txt好像 DEF 我正在尝试将 DEF 附加到 ABC 所以a txt好像 ABC DEF 我尝试过的方法总是完全覆盖第一个条目 所以我总是最终得到 DEF 这是我尝试过的两种方法 File
  • 如何在一行中将字符串数组转换为双精度数组

    我有一个字符串数组 String guaranteedOutput Arrays copyOf values values length String class 所有字符串值都是数字 数据应转换为Double QuestionJava 中
  • 在Windows上安装Java 11 OpenJDK(系统路径问题)

    Java 11 最近发布了 众所周知 这个版本没有安装文件 当然 要在没有安装程序的情况下安装 Java 我将系统设置 PATH 和 JAVA HOME 设置为解压缩 Java 11 的文件夹的地址 根据对类似问题的已接受回复建议 唯一的事
  • 线程自动利用多个CPU核心?

    假设我的应用程序运行 2 个线程 例如渲染线程和游戏更新线程 如果它在具有多核 CPU 当今典型 的移动设备上运行 我是否可以期望线程在可能的情况下自动分配给不同的核心 我知道底层操作系统内核 Android linux内核 决定调度 我的
  • Android Studio 在编译时未检测到支持库

    由于 Android Studio 将成为 Android 开发的默认 IDE 因此我决定将现有项目迁移到 Android studio 中 项目结构似乎不同 我的项目中的文件夹层次结构如下 Complete Project gt idea
  • ExceptionConverter:java.io.IOException:文档没有页面。我正在使用 iText

    当我执行下面的代码时 File f new File c sample pdf PdfWriter getInstance document new FileOutputStream f document open System out p
  • Java8无符号算术

    据广泛报道 Java 8 具有对无符号整数的库支持 然而 似乎没有文章解释如何使用它以及有多少可能 有些函数 例如 Integer CompareUnsigned 很容易找到 并且似乎可以实现人们所期望的功能 但是 我什至无法编写一个简单的
  • Prim 的迷宫生成算法:获取相邻单元格

    我基于 Prim 算法编写了一个迷宫生成器程序 该算法是 Prim 算法的随机版本 从充满墙壁的网格开始 选择一个单元格 将其标记为迷宫的一部分 将单元格的墙壁添加到墙壁列表中 While there are walls in the li
  • 请求位置更新参数

    这就是 requestLocationUpdates 的样子 我使用它的方式 requestLocationUpdates String provider long minTime float minDistance LocationLis
  • 反思 Groovy 脚本中声明的函数

    有没有一种方法可以获取 Groovy 脚本中声明的函数的反射数据 该脚本已通过GroovyShell目的 具体来说 我想枚举脚本中的函数并访问附加到它们的注释 Put this到 Groovy 脚本的最后一行 它将作为脚本的返回值 a la
  • 归并排序中的递归:两次递归调用

    private void mergesort int low int high line 1 if low lt high line 2 int middle low high 2 line 3 mergesort low middle l
  • 将 Long 转换为 DateTime 从 C# 日期到 Java 日期

    我一直尝试用Java读取二进制文件 而二进制文件是用C 编写的 其中一些数据包含日期时间数据 当 DateTime 数据写入文件 以二进制形式 时 它使用DateTime ToBinary on C 为了读取 DateTime 数据 它将首
  • 将多模块 Maven 项目导入 Eclipse 时出现问题 (STS 2.5.2)

    我刚刚花了最后一个小时查看 Stackoverflow com 上的线程 尝试将 Maven 项目导入到 Spring ToolSuite 2 5 2 中 Maven 项目有多个模块 当我使用 STS 中的 Import 向导导入项目时 所
  • Java中未绑定通配符泛型的用途和要点是什么?

    我不明白未绑定通配符泛型有什么用 具有上限的绑定通配符泛型 stuff for Object item stuff System out println item Since PrintStream println 可以处理所有引用类型 通
  • 将 JSON 参数从 java 发布到 sinatra 服务

    我有一个 Android 应用程序发布到我的 sinatra 服务 早些时候 我无法读取 sinatra 服务上的参数 但是 在我将内容类型设置为 x www form urlencoded 之后 我能够看到参数 但不完全是我想要的 我在
  • 查看Jasper报告执行的SQL

    运行 Jasper 报表 其中 SQL 嵌入到报表文件 jrxml 中 时 是否可以看到执行的 SQL 理想情况下 我还想查看替换每个 P 占位符的值 Cheers Don JasperReports 使用 Jakarta Commons
  • 中断连接套接字

    我有一个 GUI 其中包含要连接的服务器列表 如果用户单击服务器 则会连接到该服务器 如果用户单击第二个服务器 它将断开第一个服务器的连接并连接到第二个服务器 每个新连接都在一个新线程中运行 以便程序可以执行其他任务 但是 如果用户在第一个
  • Swagger/Openapi-Annotations:如何使用 $ref 生成 allOf?

    我正在生成 Rest 端点 包括添加OpenAPI Swagger对生成的代码进行注释 虽然它对于基本类型运行得很好 但我在自定义类方面遇到了一些问题 现在我有很多自定义类的重复架构条目 使用 Schema 实现 MyClass class

随机推荐