sirve - que es main en java
La instrucción JVM ALOAD_0 en el método ''main'' apunta a ''args'' en lugar de ''this''? (1)
se supone que aload_0 empuja "esto" a la pila
No del todo ... aload_0
lee el primer argumento de referencia (o, más generalmente, la primera variable de referencia local) del método y lo coloca en la pila.
En las funciones miembro, la primera variable local pasa a ser this
referencia.
Pero main
no es una función miembro, es una función estática , por lo que no existe this
argumento, y el primer argumento verdadero del método es args
.
Estoy tratando de implementar un subconjunto de Java para un estudio académico. Bueno, estoy en las últimas etapas (generación de código) y escribí un programa bastante simple para ver cómo se manejan los argumentos de los métodos:
class Main {
public static void main(String[] args) {
System.out.println(args.length);
}
}
Luego lo construí y corrí ''Main.class'' a través de un desensamblador en línea que encontré en: http://www.cs.cornell.edu/People/egs/kimera/disassembler.html
Obtengo la siguiente implementación para el método ''principal'': (la salida desensamblada está en 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
Mi problema con esto es:
1. se supone que aload_0
''this'' en la pila (eso es lo que parece decir la especificación de JVM)
2. se supone que arraylength
devuelve la longitud de la matriz cuya referencia se encuentra en la parte superior de la pila
Así que de acuerdo a mí, la combinación de 1 y 2 no debería funcionar.
¿Cómo / por qué funciona? ¿O es que el desensamblador tiene errores y el código de bytes real es otra cosa?