Elbytecode Java se encuentra dentro del archivo de extensión .class y es el tipo de instrucciones que lamáquina virtual Java (JVM) espera recibir para posteriormente ser compiladas alenguaje de máquina mediante un compilador JIT a la hora de su ejecución. Usualmente es el resultado de utilizar uncompilador dellenguaje de programación Java (como javac), pero puede ser generado desde otros compiladores.
Elopcode 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:
También hay algunas pocas instrucciones para operaciones más especializadas, tales comomanejo de excepciones, sincronización, etc.
El estilo del bytecode Java es análogo al de unlenguaje de programación orientado a pila. Por ejemplo, el código ensamblador para sumar dos registros y mover el resultado a un tercero para unCPU de la familiax86 se ve así:
addeax,edxmovecx,eax
mientras que el código comparable enlenguaje ensamblador de Java se vería así:
iload_1iload_2iaddistore_3Los 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.
La máquina virtual Java provee cierto soporte para manejar lenguajes dinámicamente tipados. La mayoría de instrucciones de la JVM es de tipado estático, en el sentido de que las invocaciones de métodos verifican la “signatura” de estos entiempo de compilación, sin un mecanismo de demorar esta decisión altiempo de ejecución ni de elegir el método de “dispatch” según un enfoque alternativo.[2]
JSR 292 (Supporting Dynamically Typed Languages on the Java™ Platform)[3] incluye una nueva instruccióninvokedynamic para permitir la invocació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 con el objetivo de manejar estos lenguajes. Asimismo, la máquina virtual Java oficial, desde su versión 7, también incluye el opcodeinvokedynamic.