Código de bytes de Java


Un programador de Java no necesita conocer o comprender el código de bytes de Java en absoluto. Sin embargo, como se sugiere en la revista IBM developerWorks, "Comprender el código de bytes y qué código de bytes es probable que genere un compilador de Java ayuda al programador de Java de la misma manera que el conocimiento del ensamblado ayuda al programador de C o C++ ". [1]

La JVM es tanto una máquina de pila como una máquina de registro . Cada marco para una llamada de método tiene una "pila de operandos" y una matriz de "variables locales". [2] : 2.6  La pila de operandos se usa para operandos de cálculos y para recibir el valor de retorno de un método llamado, mientras que las variables locales tienen el mismo propósito que los registros y también se usan para pasar argumentos de métodos. El tamaño máximo de la pila de operandos y la matriz de variables locales, calculada por el compilador, es parte de los atributos de cada método. [2] : 4.7.3  Cada uno puede tener un tamaño independiente de 0 a 65535 valores, donde cada valor es de 32 bits. longydoubletipos, que son de 64 bits, toman dos variables locales consecutivas [2] : 2.6.1  (que no necesitan estar alineados en 64 bits en la matriz de variables locales) o un valor en la pila de operandos (pero se cuentan como dos unidades en la profundidad de la pila). [2] : 2.6.2 

Cada código de bytes se compone de un byte que representa el código de operación , junto con cero o más bytes para operandos. [2] : 2.11 

De los 256 posibles códigos de operación de un byte de longitud , a partir de 2015 , 202 están en uso (~79 %), 51 están reservados para uso futuro (~20 %) y 3 instrucciones (~1 %) están reservadas permanentemente para implementaciones de JVM para usar. [2] : 6.2  Dos de estos ( impdep1y impdep2) son para proporcionar trampas para software y hardware específicos de implementación, respectivamente. El tercero se usa para que los depuradores implementen puntos de interrupción.

También hay algunas instrucciones para una serie de tareas más especializadas, como el lanzamiento de excepciones, la sincronización, etc.

Muchas instrucciones tienen prefijos y/o sufijos que se refieren a los tipos de operandos sobre los que operan. [2] : 2.11.1  Son los siguientes: