de instrucciones JVM ALOAD_0 en los 'principales' puntos método para 'args' en lugar de 'esto'?
-
09-10-2019 - |
Pregunta
Estoy tratando de implementar un subconjunto de Java para un estudio académico. Bien, estoy en las últimas etapas (generación de código) y escribí un programa muy simple para ver cómo se manejan argumentos del método:
class Main {
public static void main(String[] args) {
System.out.println(args.length);
}
}
Entonces me lo construyó, y corrió 'Main.class' a través de un desensamblador en línea que encontré en: http://www.cs.cornell.edu/People/egs/kimera /disassembler.html
Me sale el siguiente implementación para el método 'principal': (La salida desmontada 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. aload_0
se supone que empuje 'esto' en la pila (eso es lo que parece a la especificación JVM dicen)
2. arraylength
se supone que devolver la longitud de la matriz cuya referencia está en la parte superior-de-pila
Así que en mi opinión la combinación de 1 y 2 deberían ni siquiera trabajo.
¿Cómo / por qué está funcionando? O es el buggy desensamblador y el código de bytes real es algo más?
Solución
aload_0 se supone que empujar 'esto' en la pila
No del todo ... aload_0
lee el primer argumento de referencia (o, más en general, la primera variable de referencia local) del método y lo empuja en la pila.
En funciones miembro, la primera variable local pasa a ser la referencia this
.
Pero main
no es una función miembro, que es un estática función de lo que no hay argumento this
, y el verdadero primer argumento del método es args
.