Инструкция JVM ALOAD_0 в методе 'main' указывает на 'args' вместо 'this'?
Я пытаюсь реализовать подмножество 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
Я получаю следующую реализацию для метода 'main': (дизассемблированный вывод находится в 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
должен помещать 'this' в стек (вот что, похоже, говорит спецификация JVM)
2. arraylength
должен возвращать длину массива, ссылка на который находится на вершине стека
Так что, по моему мнению, комбинация 1 и 2 не должна даже работать.
Как / почему это работает? Или дизассемблер глючит и фактический байт-код - это что-то еще?
1 ответ
aload_0 должен помещать 'this' в стек
Не совсем … aload_0
читает первый ссылочный аргумент (или, в более общем случае, первую локальную ссылочную переменную) метода и помещает его в стек.
В функциях-членах первой локальной переменной является this
ссылка.
Но main
не является функцией-членом, это статическая функция, поэтому нет this
аргумент, и истинный первый аргумент метода args
,