El bytecode Java se encuentra dentro del archivo de extensión .class y es el tipo de instrucciones que la máquina virtual Java (JVM) 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.

Estructura

editar

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, 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

mientras que el código comparable en lenguaje ensamblador 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

editar

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 en tiempo de compilación, sin un mecanismo de demorar esta decisión al tiempo 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ón invokedynamic 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 opcode invokedynamic.

Referencias

editar
  1. VM Spec - Reserved Opcodes
  2. Nutter, Charles (3 de enero de 2007). «InvokeDynamic: Actually Useful?». Consultado el 25 de enero de 2008. 
  3. ver JSR 292

📚 Artikel Terkait di Wikipedia

Máquina virtual Java

código binario especial (el bytecode Java), el cual es generado por el compilador del lenguaje Java. El código binario de Java no es un lenguaje de alto

Plataforma Java

aplicaciones desarrolladas usando el lenguaje de programación Java u otros lenguajes que compilen a bytecode y un conjunto de herramientas de desarrollo. En este

Bytecode

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

Java (lenguaje de programación)

ellos. Las aplicaciones de Java son compiladas a bytecode (clase Java), que puede ejecutarse en cualquier máquina virtual Java (JVM) sin importar la arquitectura

Dalvik

como una máquina virtual Java, pero esto no es estrictamente correcto, ya que el bytecode con el que opera no es Java bytecode. Sin embargo, la herramienta

FindBugs

código Java.​​ Utiliza análisis estático​​ para identificar cientos de tipos de errores potenciales​ en programas Java. FindBugs opera en Java bytecode,​ en

Lenguaje compilado

(a bytecode) D CLEO COBOL Cobra Common Lisp Delphi Eiffel Sather Ubercode Factor (las últimas versiones) Forth Fortran Go Haskell Haxe (to bytecode) IBM

Groovy (lenguaje de programación)

existentes en Java. El bytecode generado en el proceso de compilación es totalmente compatible con el generado por el lenguaje Java para la Java Virtual Machine