問題タブ [jvm-bytecode]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
2 に答える
124 参照

java - 実行履歴に応じて、特定の命令でオペランド スタック サイズが異なる可能性はありますか?

たとえば、メソッドの場合

javac次のバイトコードを生成します。

ラベル 4 では、前の命令が 3 か 16 かに関係なく、スタックのサイズは同じ (0) です。

Javaコードから生成されたバイトコードには一般的に当てはまりますか?

0 投票する
1 に答える
1278 参照

java - JVM 仕様における JSR/RET のステータス

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 までの状況を示しているだけで、その後の状況については明確に述べていません。

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

0 投票する
1 に答える
636 参照

java - AOT インストルメンテーションとは何を意味しますか?

バイトコード インストルメンテーションとは何かを知っています。実行時に .class ファイルのバイトコードを変更するだけで、JDK 1.5 以降で利用できるようです。ただし、正確には実行時ではなく、クラスのロード中にあると言われています。

ここで私の質問は、AOT または Ahead of Time インストルメンテーションとは何ですか? 逆の手続きとは?時間の経過とともに計装?

コードの計測
Quasar ファイバーは、バイトコードの計測に依存しています。これは、 を介したクラスロード時Java Agent、または Ant タスクを使用したコンパイル時に実行できます。

インストルメンテーションの実行
Java AgentQuasarの軽量スレッド実装は、バイトコード インストルメンテーションに依存しています。インストルメンテーションは、コンパイル時 (詳細は後述) または実行時に Java エージェントを使用して実行できます。Java エージェントを実行するには、次を java コマンドラインに追加する必要があります (または、任意のビルド ツールを使用して、これを JVM 引数として追加します)。

-javaagent:path-to-quasar-jar.jar

Ahead-of-Time (AOT) インストルメンテーション
Quasar を使用してプログラムをインストルメント化する簡単で好ましい方法は、実行時にコードをインストルメント化する Java エージェントを使用することです。ただし、Java エージェントを実行できない場合もあります。

Quasar は、Ant タスクによる AOT 計測をサポートしています。タスクは co.paralleluniverse.fibers.instrument.InstrumentationTaskにあり quasar-core.jar、計測するクラスのファイルセットを受け入れます。すべてのクラスが実際にインスツルメントされるわけではありません – suspendable methods を持つクラスのみ (以下を参照) – 単純に、プログラム内のすべてのクラス ファイルをタスクに与えます。実際、クエーサー自体は 事前に計測されています。

ソース

0 投票する
1 に答える
397 参照

java - InsnList を基本ブロックに分割する

ASM Tree API には、メソッド内の命令のリストを含む InsnList があります。

これを基本ブロックに分割したいと思います: 最後の命令を除く各命令が正確に 1 つの後続命令を持ち、最初の命令を除く命令がジャンプのターゲットにならないような一連の命令です。

どうすればこれを達成できますか?

0 投票する
1 に答える
199 参照

algorithm - 名前付き引数リストの評価順序と仮パラメータ順序を確保するにはどうすればよいですか?

コンパイラに取り組んでいるときに、名前付き引数リストと評価順序に関連する問題に直面しています。基本的に、言語は次の関数と関数呼び出しに対して次のことを保証します。

出力は次のようになります。

ただし、引数は逆の順序で指定されます。私はJVMに取り組んでいるので、.の署名と一致するようにバイトコードレベルでソートする必要がありますcall. スタックベースの擬似バイトコード:

ご覧のとおりswap、正しい順序で評価され、渡されることを確認するために、ここではバイトコード命令が必要です。これはグラフとして描くことができます:

スタックの上位 2 つの要素を交換できる命令は 1 つしかないswapため、要素が増えると、コンパイラはローカル変数を生成する必要があります。

バイトコード:

もちろん、これは任意の量の実パラメータと形式パラメータに拡張できます。

私が今探しているのは、これらswapまたはローカル変数命令を挿入する必要があるかどうか、およびどこに挿入する必要があるかを決定するアルゴリズムです。コンパイラの実装への参照も役立ちます。


どの実引数がどの仮パラメータに属しているかは、私の問題の一部ではないことに注意してください。それは私のコンパイラによってすでに解決されています。簡単にするために、問題は次のように見ることができます。

同じ要素を異なる順序で含む同じサイズの 2 つの配列が与えられた場合、どの要素を最初の配列からスワップまたはシフトして、2 番目の配列の順序を取得できます。

0 投票する
1 に答える
808 参照

java - ASM で参照を取得するには?

要約: ASM を使用して、特定のバイトコード クラスで、メソッド命令 ( MethodInsnNode ) ごとに、使用されている参照を取得する必要があります。

次のクラスを検討してください。

}

次の生成されたバイトコード命令を考慮してください。

ASM を使用して呼び出されているオブジェクト参照を取得する方法を見つけようとしています。バイトコード レベルでは、INVOKESPECIAL命令が呼び出されるたびに、以前に使用される値がロードされます。例えば:

ですから、そこへの参照があります。しかし、ASM では、への参照はありませんthis。正確なスタックトレースは次のようになります。これは、その変数をロードするために呼び出されたメソッドである「前の」属性を含む実際の命令によって構成されています。

検査要素のサンプル

問題は、所有者属性、名前属性があることですが、そのオブジェクトへの参照を取得できません。次の場合:

ASM の「cemo」オブジェクトへの参照が必要です。

これまでに試したこと: - フレーム オブジェクトを取得しますが、変数「スロット」のみが含まれ、参照は含まれません。MethodInsnNode-前の指示を分析します。

どうすればこれを達成できますか?

0 投票する
1 に答える
511 参照

java - ByteBuddy: java.lang.IllegalArgumentException: 未定義の変数をアタッチできません: V

Google Guava からクラスcom.google.common.collect.ImmutableMultimap$Valuesをリベースすると、ByteBuddy から IllegalArgumentException が発生します。

内部クラスは、com.google.common.collect.ImmutableCollectionメソッドImmutableList<E> createAsList()が問題を引き起こすサブクラスです。

スタックトレース:

ここで問題を引き起こす例を作成しました: https://github.com/erikhakansson/bytebuddytest テストは以前のテストから変更されたため、ゴミが含まれている可能性があります。

テストするには、単に mvn clean install を実行してから、結果の jar を実行します。

ほとんどの場合、私は何か間違ったことをしていますが、何がわからないので、助けてください! :)