Java bytecode

**Java bytecode** é o conxunto de instrucións da máquina virtual de Java (JVM), a linguaxe na que se compila o código fonte de Java e outros códigos compatibles con JVM. Cada instrución é representada por un só byte, por iso o nome bytecode, o que o converte nunha forma compacta de datos.

Debido á natureza do bytecode, un programa de bytecode de Java pódese executar en calquera máquina cunha JVM compatíbel, sen o longo proceso de compilar a partir do código fonte.

Java bytecode é utilizado en tempo de compilación, xa sexa interpretado por unha JVM ou compilado a código máquina mediante compilación *xusto a tempo* (JIT) e executado como unha aplicación nativa.

Como Java bytecode está deseñado para a compatibilidade e seguridade entre plataformas, unha  aplicación de Java bytecode tende a executarse de forma consistente en varias configuracións de hardware e software.

## Relación con Java 
En xeral, un programador de Java non necesita comprender Java bytecode, nin sequera ser consciente del. Con todo, como se suxire na revista IBM developerWorks, "Comprender o bytecode e que bytecode é probable que xere un compilador de Java axuda ao programador de Java do mesmo xeito que o coñecemento de ensamblador axuda ao programador de C ou C++".

## Arquitectura do conxunto de instrucións 
O bytecode comprende varios tipos de instrucións, incluíndo a manipulación de datos, a transferencia de control, a creación e manipulación de obxectos e a invocación de métodoa, todos eles parte integral do modelo de programación orientada a obxectos de Java.:2.6
* Jamaica, unha linguaxe de ensamblaxe de macros  para a máquina virtual Java. A sintaxe de Java úsase para a definición de clases ou de interfaces. Os corpos dos métodos especifícanse usando instrucións de bytecode.
* Krakatau Bytecode Tools, contén actualmente tres ferramentas: un descompilador e desensamblador para ficheiros de clase de Java e un ensamblador para crear ficheiros de clase.
* Lila,  un ensamblador e desensamblador para a máquina virtual Java.

Outros desenvolveron compiladores, para diferentes linguaxes de programación, dirixidos á máquina virtual Java, como:

* ColdFusion
* JRuby e Jython, dúas linguaxes de scripting baseadas en Ruby e Python
* Apache Groovy,  linguaxe de propósito xeral opcionalmente tipada e dinámica, con capacidades de tipado estático e compilación estática
* Scala, unha linguaxe de programación xeral de tipado seguro que admite programación funcional e programación orientada a obxectos
* JGNAT e AppletMagic, compilan da linguaxe Ada a Java bytecode
* Compiladores de C a bytecode Java
* Clojure, unha linguaxe de programación funcional, inmutable e de propósito xeral da familia Lisp cunha forte énfase na concorrencia
* Kawa, unha implementación da linguaxe de programación Scheme, tamén un dialecto de Lisp.
* MIDletPascal
* O código JavaFX Script compílase en bytecode Java
* Kotlin, unha linguaxe de programación de propósito xeral con tipado estático e inferencia de tipos
* O código fonte de Object Pascal compílase en bytecode Java usando o compilador Free Pascal 3.0+.

## Execución 
Hoxe en día existen varias máquinas virtuais Java dispoñibles para executar Java bytecode, tanto produtos gratuítos como comerciais. Se non é desexable executar bytecode nunha máquina virtual, un desenvolvedor tamén pode compilar código fonte ou Java bytecode directamente a código máquina nativo con ferramentas como o GNU Compiler for Java (GCJ). Algúns procesadores poden executar Java bytecode de forma nativa. Estes procesadores denomínanse *procesadores de Java*.

## Compatibilidade con linguaxes dinámicas 
A máquina virtual Java ofrece certa compatibilidade con  linguaxes de tipo dinámico. A maior parte do conxunto de instrucións JVM existente ten tipado estático, no sentido de que as chamadas a métodos teñen as súas sinaturas verificadas no tempo de compilación, sen un mecanismo para adiar esta decisión ao tempo de execución ou para elixir o envío do método mediante un enfoque alternativo.

JSR 292 (*Compatibilidade con linguaxes de tipo dinámico na plataforma Java*) engadiu unha nova instrución `invokedynamic` no nivel de JVM, para permitir a invocación de métodos baseándose na comprobación dinámica de tipo (en lugar da instrución `invokevirtual` existente con tipo verificado estaticamente). A máquina Da Vinci é unha implementación prototipo de máquina virtual que aloxa extensións de JVM destinadas a soportar linguaxes dinámicas. Todas as JVM compatibles con JSE 7 tamén inclúen o código de operación `invokedynamic.`

## Referencias 
## Véxase tamén 
### Ligazóns externas 
* Especificación da máquina virtual Java de Oracle
* Linguaxes de programación para a máquina virtual Java
* Visualizador de bytecode: visor e depurador de bytecode (complemento gratuíto de Eclipse)
* AdaptJ StackTrace: depuración a nivel de bytecode con control total da pila, as variables locais e o fluxo de execución
* Unpacker de clases Java: complemento para Total Commander, permite abrir ficheiros de clase como arquivos comprimidos e ver campos e métodos como ficheiros. O bytecode pódese ver como texto usando F3