10

JSR (Jump SubRoutine)JSR_W (Jump SubRoutine Wide)、およびRET (RETurn from subroutine)の操作は、クラス ファイル バージョン 50.0 (JDK 1.6) までしか使用できないことを示唆する JVM 仕様の一部があります。

3.13 最終的なコンパイル

(このセクションでは、jsr 命令を使用できるように、コンパイラがバージョン番号 50.0 以下のクラス ファイルを生成することを前提としています。§4.10.2.5も参照してください。)

以降:

4.10.2.5. 例外とfinally

try-コンストラクトを実装するために、バージョン番号 50.0 以下のファイルをfinally生成する Java プログラミング言語のコンパイラは、例外処理機能をjsr (「サブルーチンへのジャンプ」) とret (「サブルーチンからの戻り」)classの 2 つの特別な命令と共に使用する場合があります。」)。

一方、オペコードの説明自体は、これらの機能の非推奨については何も述べていません。また、引用されたテキストは、バージョン 50.0 までの状況を示しているだけで、その後の状況については明確に述べていません。

このコメント(この非推奨または削除の背後にある動機について尋ねる質問への) は、同様のレベルの混乱を示しているため、明らかにこれを探しているのは私だけではありません。

4

1 に答える 1

11

質問にリンクを追加しているときに、問題のオペコードが§4.10.1.9: Type Checking Instructionsにないことに気付きました。したがって、これは、新しい strackframe ベースの型検証スキームがそれらを処理できないことを示しており、§4.10: クラス ファイルの検証は次のように記述しています。

classバージョン番号が 50.0 以上のファイルを検証するには、タイプ チェックによる検証を使用する必要があります。

または、 §4.10.1: 型チェックによる検証で詳しく説明します。

classバージョン番号が 50.0 以上 ( §4.1 )のファイルは、このセクションで説明する型チェック規則を使用して検証する必要があります。

classファイルのバージョン番号が 50.0 である場合に限り、型チェックが失敗すると、Java 仮想マシンの実装は型推論 ( §4.10.2 ) による検証を実行することを選択できます

したがって、バージョン 50.0 のクラスにまだjsrretが含まれている可能性がありますが、JVM 実装がそのクラスを検証せず、その結果、ロードに失敗するリスクがあります。

しかし、 §4.9.1: Static Constraintsで、さらに明確なルールを見つけました。

§6.5に記載されている命令のインスタンスのみがcode配列に表示されます。予約済みオペコード ( §6.2 ) またはこの仕様に記載されていないオペコードを使用する命令のインスタンスは、code配列に出現してはなりません。

ファイルのclassバージョン番号が 51.0 以上の場合、jsrオペコードもjsr_wcodeオペコードも配列に表示されない場合があります。

最初の段落はこの質問には関係ありません。なぜなら、命令は §6.5 にリストされており、§6.2 に従って予約されていないからです。しかし、2 番目の段落では、バージョン 51.0 以降では禁止されていることを明示的に示しています。一方、 retオペコードは、jsrまたはjsr_wなしでは役に立ちません。これら 2 つの命令のみが、タイプのスタック要素を作成できるためreturnAddress(および、そのタイプのローカル変数をストアすることによって) retによって使用されるためです。


私は今でも、この趣旨の通知を §6.5 に含める必要があると考えています。残念ながら、 Type: Bug、Category: Java Platform Standard Edition、Subcategory: specificationを選択すると、 Java バグ レポートの Web ページで [続行] ボタンが非表示になります。それは次のように述べています

このサブカテゴリは、Java 言語仕様および JVM 仕様のテキスト内の技術的なエラーおよびあいまいさを報告するためのものです。Java 言語や JVM の新機能を提案する場ではありません。継続的な機能開発はOpenJDKで行われます。Java 言語仕様および JVM 仕様に対する対応する拡張機能は、Java Community Processを通じて管理されます。

しかし、これら 3 つのオペコードの説明に明確なメモを追加するためだけに JCP を調べるのは、やり過ぎのように感じます。したがって、この投稿が、仕様自体で自分で答えを見つけることができない人に役立つことを願っています.

于 2016-05-03T20:27:59.630 に答える