「メイン」メソッドのJVM命令ALOAD_0は、「この」ではなく「Args」を指しますか?

StackOverflow https://stackoverflow.com/questions/4641416

質問

私は学術研究のためにJavaのサブセットを実装しようとしています。さて、私は最後の段階(コード生成)にあり、メソッド引数がどのように処理されるかを確認するためにかなり簡単なプログラムを書きました。

class Main {
    public static void main(String[] args) {
        System.out.println(args.length);
    }
}

それから私はそれを構築し、私が見つけたオンライン分解者を通して「main.class」を走らせました:http://www.cs.cornell.edu/people/egs/kimera/disassembler.html

「メイン」方法の次の実装を取得します:(分解された出力はジャスミンにあります)

.method public static main([Ljava/lang/String;)V
    .limit locals 1
    .limit stack 2

    getstatic   java/lang/System/out Ljava/io/PrintStream;
    aload_0
    arraylength
    invokevirtual   java/io/PrintStream.println(I)V
    return
.end method

これに関する私の問題は次のとおりです。
1. aload_0 「これ」をスタックに押し付けることになっています(JVMスペックが言っているようです)
2. arraylength 参照が最上位にあるアレイの長さを返すことになっています

したがって、私によると、1と2の組み合わせは機能するべきではありません。

どのように/なぜそれが機能しているのですか?それとも、分解者のバギーで、実際のバイトコードは別のものですか?

役に立ちましたか?

解決

ALOAD_0は「これ」をスタックに押し付けることになっています

まったく… aload_0 を読みます 最初の参照引数 メソッドの(または、より一般的には、最初のローカル参照変数)。

メンバー関数では、最初のローカル変数はたまたま this 参照。

だが main メンバー関数ではありません 静的 機能しないようにします this 議論、および方法の真の最初の議論は args.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top