He estado trabajando durante algún tiempo en Bytecode (Java), sin embargo, nunca se me había ocurrido preguntar por qué se escriben algunas instrucciones. Entiendo que en una operación ADD, necesitamos distinguir entre una suma entera y una adición FP (es por eso que tenemos IADD y FADD). Sin embargo, ¿por qué tenemos que distinguir entre ISTORE y FSTORE? Ambas implican exactamente la misma operación, que está moviendo 32 bits desde la pila a una posición variable local.Tipos en Bytecode
La única respuesta que puedo pensar es para seguridad de tipo, para evitar esto: (ILOAD, ILOAD, FADD). Sin embargo, creo que la seguridad de tipo ya se aplica en el nivel de lenguaje Java. De acuerdo, el formato de archivo Class no está directamente acoplado con Java, ¿entonces esta es una manera de aplicar seguridad de tipo para lenguajes que no la soportan? ¿Cualquier pensamiento? Gracias.
EDIT: para dar seguimiento a la respuesta de Reedy. Escribí este programa mínimo:
public static void main(String args[])
{
int x = 1;
}
el cual compila para:
iconst_1
istore_1
return
usando un editor de código de bytes, cambié la segunda instrucción:
iconst_1
fstore_1
return
y se volvió un java.lang .VerifyError: esperando encontrar float en la pila.
Me pregunto, si en la pila no hay información sobre el tipo, solo bits, ¿cómo sabía la instrucción FSTORE que se trataba de una int y no de una flotación?
Nota: No he podido encontrar un título mejor para esta pregunta. Siéntase libre de mejorarlo.
Gracias por la respuesta. Entonces, el verificador hace un análisis de flujo de datos antes de ejecutar la clase para detectar este tipo de error. Interesante para aprender :) –