Bytecode Java
El bytecode Java es el tipo de instrucciones que la máquina virtual Java ejecuta, su bytecode. Usualmente es el resultado de utilizar un compilador del lenguaje de programación Java (como javac), pero puede ser generado desde otros lenguajes.
Estructura
El opcode de cada instrucción es de un byte de largo, aunque algunas requieren parámetros resultando en instrucciones multibyte. No todos los 256 posibles opcodes son utilizados. De hecho, Sun Microsystems, el creador original de la plataforma Java, separó tres valores para que queden permanentemente sin implementar.[1]
Las instrucciones caen en las siguientes categorías:
- Mover de memoria a registros y viceversa (ej. aload_0,istore)
- Aritmética y lógica (ej. ladd,fcmpl)
- Conversión de tipos (ej. i2b,d2i)
- Creación y manipulación de objetos (ej. new, putfield)
- Manipulación de la pila de operandos (ej. swap, dup2)
- Control de flujo (ej. ifeq, goto)
- Invocación de métodos y retorno de los mismos (ej. invokespecial, areturn)
También hay algunas pocas instrucciones para operaciones más especializadas, tales como manejo de excepciones, sincronización, etc.
El estilo del bytecode Java es análogo al de un lenguaje de programación orientado a pila. Por ejemplo, mientras que el código ensamblador para sumar dos registros y mover el resultado a un tercero para un CPU de la familia x86 se ve así...
add eax, edx
mov ecx, eax
... el código comparable en assembler de Java se vería así...
iload_1
iload_2
iadd
istore_3
Los dos valores a ser sumados son colocados en una pila, de la que serán tomados por la instrucción de suma. El resultado de la suma es vuelto a poner en la pila y recuperado por la última instrucción, que lo mueve al registro.
Manejo de lenguajes dinámicos
La máquina virtual Java provee alguna capacidad de manejar lenguajes dinámicamente tipados. La mayoría del juego de instrucciones existente es de tipado estático, en el sentido de que las invocaciones de métodos tienen verifican la “signatura” de estos en tiempo de compilación, sin un mecanismo de demorar esta decisión al tiempo de ejecución, o de elegir el método de “dispatch” según un método alternativo.[2]
El JSR 292 (Supporting Dynamically Typed Languages on the Java™ Platform)[3] añadió una nueva instrucción invokedynamic
para permitir la invoación de métodos basada en tipado dinámico. “Da Vinci machine” es un prototipo de implementación de máquina virtual que aloja las extensiones de la JVM que apuntan a manejar estos lenguajes. Asimismo, la máquina virtual Java oficial, desde su versión 7, también incluye el opcode invokedynamic
.
Referencias
- ↑ VM Spec - Reserved Opcodes
- ↑ Nutter, Charles (3 de enero de 2007). «InvokeDynamic: Actually Useful?». Consultado el 25 de enero de 2008.
- ↑ ver JSR 292