El bytecode Java es el tipo de instrucciones que la máquina
virtual Java espera recibir, para posteriormente ser compiladas a lenguaje de
máquina, mediante un compilador JIT a la hora de su ejecución. Usualmente es el
resultado de utilizar un compilador del lenguaje de programación Java (como
javac), pero puede ser generado desde otros compiladores.
El bytecode un código intermedio más abstracto que el código
máquina. Habitualmente es tratado como un archivo binario que contiene un
programa ejecutable similar a un módulo objeto, que es un archivo binario
producido por el compilador cuyo contenido es el código objeto o código
máquina.
El bytecode recibe su nombre porque usualmente cada código de
operación tiene una longitud de un byte, si bien la longitud del código de las
instrucciones varía. Cada instrucción tiene un código de operación entre 0 y
255 seguido de parámetros tales como los registros o las direcciones de
memoria. Esta sería la descripción de un caso típico, si bien la especificación
del bytecode depende ampliamente del lenguaje.
FUNCIONAMIENTO.
Como código intermedio, se trata de una forma de salida
utilizada por los implementadores de lenguajes para reducir la dependencia
respecto del hardware específico y facilitar la interpretación. Menos
frecuentemente se utiliza el bytecode como código intermedio en un compilador.
Algunos sistemas, llamados traductores dinámicos o compiladores just-in-time
traducen el bytecode a código máquina inmediatamente antes de su ejecución para
mejorar la velocidad de ejecución.
Los
programas en bytecode suelen ser interpretados por un intérprete de bytecode (en
general llamado máquina
virtual, dado que es análogo a un ordenador). Su
ventaja es su portabilidad: el mismo código binario puede ser ejecutado en
diferentes plataformas y arquitecturas. Es la misma ventaja que presentan los
lenguajes interpretados. Sin embargo, como el bytecode es en general menos
abstracto, más compacto y más orientado a la máquina que un programa pensado
para su modificación por humanos, su rendimiento suele ser mejor que el de los
lenguajes interpretados. A causa de esa mejora en el rendimiento, muchos
lenguajes interpretados, de hecho, se compilan para convertirlos en bytecode y
después son ejecutados por un intérprete de bytecode. Entre esos lenguajes se
encuentran Perl, Gambas, PHP y Python. En el caso de Java se suele trasmitir como
bytecode a la máquina receptora, que utiliza un compilador just-in-time para
compilar el bytecode en código máquina nativo antes de su ejecución, ahorrando
así procesos de interpretación.