Я пытаюсь реализовать подмножество 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
Я получаю следующую реализацию для основного метода: (дизассемблированный вывод находится в 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 даже не должна работать.
Как/почему это работает? Или дизассемблер глючит и реальный байткод какой-то другой?