Инструкция JVM Aload_0 в «главном» моменте указывает на «args» вместо «это»?

StackOverflow https://stackoverflow.com/questions/4641416

Вопрос

Я пытаюсь осуществить подмножество 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top