Domanda

Sto cercando di implementare un sottoinsieme di Java per uno studio accademico. Beh, sono nelle ultime fasi (la generazione di codice) e ho scritto un programma piuttosto semplice per vedere come metodo argomenti vengono trattati:

class Main {
    public static void main(String[] args) {
        System.out.println(args.length);
    }
}

Poi ho costruito, e corse 'Main.class' attraverso un disassembler on-line ho trovato su: http://www.cs.cornell.edu/People/egs/kimera /disassembler.html

ottengo il seguente implementazione per il metodo 'main': (L'uscita smontato è 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

Il mio problema è:
1. aload_0 dovrebbe spingere 'questo' al catasta (questo è ciò che la JVM spec sembra dire)
2. arraylength deve restituire la lunghezza della matrice cui riferimento è sulla parte superiore dello stack

Quindi, secondo me la combinazione di 1 e 2 non dovrebbe nemmeno lavoro.

come / perché sta funzionando? O è il passeggino disassemblatore e il bytecode reale è un'altra cosa?

È stato utile?

Soluzione

  

aload_0 è supposto per spingere 'questo' al catasta

Non proprio ... aload_0 legge il Il primo argomento di riferimento (o, più in generale, la prima variabile di riferimento locale) del metodo e lo spinge nello stack.

In funzioni membro, la prima variabile locale sembra essere il riferimento this.

Ma main non è una funzione membro, si tratta di un static funzione in modo non v'è alcun argomento this, e il vero primo argomento del metodo è args.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top