Инструкция 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.c.C.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
.