0

単純な式 Math.max(0,1) が次のバイトコード命令に変換されることに気付いたとき、私は Java バイトコードを勉強していました。

ICONST_0, 
ICONST_1, 
INVOKESTATIC(java/lang/Math.max)

私の質問は、Java が後入れ先出しスタックを使用するかどうかです。つまり、1 がスタックの 0 の前にあることを意味します。つまり、vm は max を呼び出すときにスタック上の項目の順序を逆にする必要があります。 1 の前に 0 を取得する命令。ただし、仕様書には、これについて注意するように記載されていますが、私の仮説は正しいです。

4

2 に答える 2

6

引数スタックは単なる抽象化です。操作が n 個の引数を取る場合、ご覧のとおり、上位 n 個の引数がスタックから取り出され、下から上に使用されます。これは、invokestatic だけでなく、すべてのバイトコード命令に適用されます。

たとえば、次のシーケンス

iconst_0 iconst_1 iconst_2 issub

0、1、および 2 をスタックにプッシュします。isub 命令は、上位 2 つの値 1 と 2 を取り出し、それらを下から上に使用するため、結果は 1-2 = -1 になります。したがって、最終結果は 0、-1 を含むスタックになります。

このような詳細に興味がある場合は、JVM 仕様を読んでみてください。

于 2013-08-25T01:51:49.160 に答える
1

Java が後入れ先出しスタックを使用する場合

別の種類がありますか?

これは、vm が max 命令を呼び出して 1 の前に 0 を取得するときに、スタック上の項目の順序を逆にする必要があることを意味します。

いいえ、そうではありません。ゼロはすでに 1 の「前」にあります。メソッドへの引数は、実際にローカル変数宣言と同様に、ソース テキストに出現する順序でプッシュされます。逆転が必要だと思う理由がわかりません。そうではありません。

于 2013-08-25T01:41:22.590 に答える