El bytecode de Java es un conjunto de instrucciones ejecutadas por la máquina virtual de Java . Cada código de operación de bytecode es un byte; no se utilizan los 256 valores de código de operación posibles, 51 de ellos están reservados para uso futuro.
Para programar en Java u otros lenguajes compatibles con JVM , no es necesario el conocimiento de las características del código de bytes, sin embargo, "comprender el código de bytes y comprender los mecanismos para generarlo por el compilador de Java ayuda al programador de Java de la misma manera que el conocimiento del ensamblado lenguaje ayuda al programador, escribiendo en C o C++ » [1] [2] .
El código CA 16 está reservado para que lo use el depurador y no lo usa el lenguaje, al igual que los códigos FE 16 y FF 16 , que están reservados para que los usen la máquina virtual y los depuradores. Los códigos en el rango CB 16 -FD 16 no se usan en la versión actual de JVM y están reservados para futuras incorporaciones.
Las instrucciones se pueden dividir en varios grupos:
También hay algunas instrucciones que realizan tareas específicas, como generar excepciones, sincronizar, etc.
Muchas instrucciones tienen prefijos o sufijos que coinciden con sus operandos:
prefijo o sufijo | tipo de operando |
---|---|
I | entero |
L | largo |
S | corto |
B | byte |
C | personaje |
F | flotar |
D | doble |
A | referencia |
Por ejemplo, la operación IADD es la suma de dos números enteros, mientras que FADD es la suma de números de coma flotante.
Código en lenguaje Java :
exterior : para ( int i = 2 ; i < 1000 ; i ++ ) { para ( int j = 2 ; j < i ; j ++ ) { si ( i % j == 0 ) continúa exterior ; } Sistema . fuera _ println ( i ); }el compilador puede traducir al siguiente código de bytes:
0: iconst_2 1: istore_1 2: iload_1 3: sipush 1000 6: if_icmpge 44 9: iconst_2 10: istore_2 11: iload_2 12: iload_1 13: if_icmpge 31 16: iload_1 17: iload_2 18: irem 19: ifne 25 22: goto 3 25: iinc 2 , 1 28: ir a 11 31: getstatic #84 ; //Campo java/lang/System.out:Ljava/io/PrintStream; 34: iload_1 35: invocarvirtual #85 ; //Método java/io/PrintStream.println:(I)V 38: iinc 1 , 1 41: ir a 2 44: volverEn la mayoría de los casos, el código de bytes de Java se genera para su ejecución en la máquina virtual de Java a partir del código fuente de Java . El único compilador nativo que convierte código Java en código de bytes Java es Javac , que fue creado por Sun Microsystems . Pero dado que todas las especificaciones de código de bytes de Java están disponibles, existen compiladores de terceros que generan este código de bytes. Ejemplos de tales compiladores:
Para algunos proyectos, existen compiladores que le permiten generar código de bytes para la JVM a partir del código fuente en otro lenguaje de programación, tales proyectos incluyen:
La mayoría de las instrucciones JVM existentes se escriben estáticamente : las firmas de métodos en sus sitios de llamadas se verifican en el momento de la compilación, pero no existe un mecanismo para llevar esta verificación al tiempo de ejecución [3] . Sin embargo, se han implementado una serie de lenguajes tipificados dinámicamente para la JVM .