2013-10-02 25 views
2

我正在編寫一個針對JVM的編譯器,它使用ASM庫生成類文件。 JVM類文件有一個版本號字段,我試圖弄清楚我應該放在那裏。要在JVM類文件中放入什麼版本號

一個明顯的可能性是,因爲我恰好在使用Java 1.7,所以將51放在與該版本對應的編號中。然而,就我所知儘管有人不應該能夠使用我的編譯器編寫針對Java 1.6,所以硬編碼版本號會破壞該用例。

是否存在一些最小/基準版本號,例如,您可以說「使用它是安全的,它標記了字節代碼格式或JVM語義中的最後一次實際更改並且之後的所有內容都將支持它」?

相反,也許最好的選擇是採取運行編譯器的JVM的版本號?如果是這樣,運行時可以訪問許多不同的Java版本屬性中的哪一個應該用於此目的?

+0

JVM向下兼容。 1.7也會運行一個版本號小於51的字節碼。你應該問自己你需要的最小字節碼功能集是什麼,並使用相應的版本。 –

回答

2

JVM向後兼容。 Hotspot將接受低至45.0的版本,我相信這可以追溯到Java正式發佈之前。 (Java 1.03是45.3)

對於手動字節碼操作,版本49.0是最有用的,因爲它是支持jsr/ret的最後一個版本,並且不需要StackMapTable。

如果您想使用invokedynamic,那麼您需要使用版本51.0,您將使用更高版本的唯一原因。但這意味着你也必須生成StackMapTables,這是一個很大的煩惱。

1

如果是這樣,那麼應該使用運行時可訪問的許多不同Java版本屬性中的哪一個來達到此目的?

挑選您願意支持的最舊版本。如果您無法修復某個版本的已知問題,我不會允許該版本。

你測試哪個版本?如果它只是Java 7,也許這應該是你應該設置的。

您是否使用任何JVM庫?如果你做哪個版本的最低版本?