2

ASM ライブラリを使用してクラス ファイルを生成し、JVM を対象とするコンパイラを作成しています。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 でした)

手動のバイトコード操作の場合、jsr/ret をサポートする最後のバージョンであり、StackMapTable も必要としないため、バージョン 49.0 が最も便利です。

invokedynamic新しいバージョンを使用する唯一の理由は、バージョン 51.0 が必要な場合に使用する場合です。しかし、それは StackMapTables も生成する必要があることを意味し、これは非常に面倒です。

于 2013-10-02T14:20:34.703 に答える
1

もしそうなら、実行時にアクセスできる多くの異なる Java バージョン プロパティのどれをこの目的に使用する必要がありますか?

サポートする最も古いバージョンを選択してください。修正できないバージョンに既知の問題がある場合、そのバージョンは許可しません。

どのバージョンをテストしますか? Java 7 のみの場合は、おそらくこれを設定する必要があります。

JVM ライブラリを使用していますか? もしそうなら、それらが利用可能な最小バージョンはどれですか?

于 2013-10-02T13:53:43.910 に答える