要放在JVM类文件中的版本号

时间:2013-10-02 13:21:54

标签: java jvm bytecode

我正在编写一个以JVM为目标的编译器,使用ASM库生成类文件。 JVM类文件有一个版本号字段,我试图弄清楚我应该放在那里。

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

是否有一些最小/基线版本号,你可以说“使用它是安全的,它标志着字节代码格式或JVM语义的最后一次实际变化,之后的所有内容都会支持它”?

相反,也许最好的选择是采用编译器运行的JVM的版本号?如果是这样,那么在运行时可以访问哪些不同的Java版本属性应该用于此目的?

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

  

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

选择您愿意支持的最旧版本。如果您无法解决版本的已知问题,我将不允许该版本。

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

您使用任何JVM库吗?如果您这样做,那么它们是最低版本吗?