2

我正在编写一个针对 JVM 的编译器,使用 ASM 库生成类文件。JVM 类文件有一个版本号字段,我正在尝试找出我应该放在那里的内容。

一个明显的可能性是,因为我碰巧使用的是 Java 1.7,所以将 51 放入该版本对应的数字。然而,据我所知,没有理由不能使用我的编译器来编写以 Java 1.6 为目标的程序,因此对版本号进行硬编码会破坏该用例。

是否有一些最小/基线版本号,以便您可以说“使用它是安全的,它标志着字节码格式或 JVM 语义的最后一次实际更改,之后的一切都将支持它”?

相反,也许最好的选择是获取编译器正在运行的 JVM 的版本号?如果是这样,在运行时可访问的许多不同 Java 版本属性中的哪一个应该用于此目的?

4

2 回答 2

2

JVM 是向后兼容的。Hotspot 将接受低至 45.0 的版本,我相信这可以追溯到 Java 正式发布之前。(Java 1.03 是 45.3)

对于手动字节码操作,版本 49.0 是最有用的,因为它是支持 jsr/ret 的最后一个版本,也不需要 StackMapTable。

您使用更高版本的唯一原因是如果您想invokedynamic在这种情况下使用,您需要 51.0 版本。但这意味着您还必须生成 StackMapTables,这是一个很大的烦恼。

于 2013-10-02T14:20:34.703 回答
1

如果是这样,在运行时可访问的许多不同 Java 版本属性中的哪一个应该用于此目的?

选择您愿意支持的最旧版本。如果您无法修复的版本存在已知问题,我不会允许该版本。

你测试哪些版本?如果它只是 Java 7,也许这就是你应该设置的。

您使用任何 JVM 库吗?如果您这样做,它们可用的最低版本是哪个?

于 2013-10-02T13:53:43.910 回答