Código de bytes de Java

La versión actual de la página aún no ha sido revisada por colaboradores experimentados y puede diferir significativamente de la versión revisada el 23 de junio de 2021; las comprobaciones requieren 2 ediciones .

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] .

Instrucciones

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.

Ejemplo

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: volver

Generación

En 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:

  • Jikes  : compila el código Java en código de bytes Java (desarrollado por IBM , escrito en C++ ),
  • Espresso: compila el código Java en el código de bytes de Java (para la versión Java 1.0),
  • GCJ (GNU Compiler for Java) - compila código Java a bytecode Java, también es capaz de compilar a código de máquina nativo , es parte de GNU Compiler Collection .

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 .

Notas

  1. Peter Haggar, Comprender el código de bytes te convierte en un mejor programador Archivado el 8 de diciembre de 2008 en Wayback Machine // IBM DeveloperWorks, 01 de julio de 2001
  2. Introducción formal a la compilación de Java, Stephan Diehl, "Software: práctica y experiencia", vol. 28(3), páginas 297-327, marzo de 1998. . Consultado el 25 de abril de 2013. Archivado desde el original el 25 de mayo de 2013.
  3. Nutter, Charles InvokeDynamic: ¿Realmente útil? (3 de enero de 2007). Fecha de acceso: 25 de enero de 2008. Archivado desde el original el 30 de abril de 2013.

Véase también

  • instrucciones de código de bytes de Java

Enlaces