Я пытаюсь реализовать подмножество Java для академического обучения. Ну, я на последних этапах (генерация кода), и я написал достаточно простую программу, чтобы увидеть, как обрабатываются аргументы метода:Команда JVM ALOAD_0 в методе «main» указывает на «args» вместо «this»?
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
Я получаю следующее реализации для «основной» методы: (разобранном выхода находится в Jasmin)
.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 не должна даже работать.
Как это работает/почему это работает? Или это ошибка дизассемблера, а фактический байт-код - это что-то еще?
+1. this.foo (x, y) действительно Foo.foo (this, x, y) – grinch
Сохраняется ли это для * all * статических методов? –
@ dohaqatar7 Да. –