「メイン」メソッドのJVM命令ALOAD_0は、「この」ではなく「Args」を指しますか?
-
09-10-2019 - |
質問
私は学術研究のために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
.
所属していません StackOverflow