Bytecode Java
O bytecode Java encontra-se dentro do arquivo com a extensão .class e é o tipo de instruções que a máquina virtual Java (JVM) espera receber para depois ser compilada em linguagem de máquina por meio de um compilador JIT no momento de sua execução. Geralmente é o resultado do uso de um compilador de linguagem de programação Java (como javac), mas pode ser gerado a partir de outros compiladores.
Estrutura
O opcode de cada instrução tem um byte de comprimento, embora alguns exijam parâmetros resultando em instruções multibyte. Nem todos os 256 opcodes possíveis são usados. De fato, a Sun Microsystems , a criadora original da plataforma Java, dividiu três valores para permanecer permanentemente não implementado. [ 1 ]
As instruções se enquadram nas seguintes categorias:
- Mover da memória para os registradores e vice-versa (por exemplo, aload_0, istore)
- Aritmética e lógica (por exemplo, ladd, fcmpl)
- Conversão de tipo (por exemplo, i2b, d2i)
- Criação e manipulação de objetos (por exemplo, new, putfield)
- Manipulação da pilha de operandos (por exemplo, swap, dup2)
- Controle de fluxo (por exemplo, ifeq, goto)
- Invocação de métodos e seu retorno (por exemplo, invokespecial, areturn)
Existem também algumas instruções para operações mais especializadas, como tratamento de exceção , sincronização, etc.
O estilo de bytecode Java é análogo ao de uma linguagem de programação orientada a pilha . Por exemplo, o código assembly para adicionar dois registradores e mover o resultado para um terceiro para uma CPU da família x86 se parece com isso:
adicionar eax , edx
mov ecx , eax
enquanto o código comparável na linguagem assembly Java ficaria assim:
iload_1
iload_2
iadd
istore_3
Os dois valores a serem somados são colocados em uma pilha, da qual serão retirados pela instrução de adição. O resultado da adição é empurrado de volta para a pilha e recuperado pela última instrução, que o move para o registrador.
Manipulação de linguagens dinâmicas
A máquina virtual Java fornece algum suporte para lidar com linguagens tipadas dinamicamente. A maioria das instruções JVM são tipadas estaticamente, no sentido de que as invocações de métodos verificam sua "assinatura" em tempo de compilação , sem um mecanismo para atrasar esta decisão em tempo de execução ou para escolher o método de execução. [ 2 ]
JSR 292 ( Supporting Dynamicly Typed Languages on the Java™ Platform ) [ 3 ] inclui uma nova instrução invokedynamicpara permitir a invocação de métodos baseados em tipagem dinâmica. "Máquina Da Vinci" é um protótipo de implementação de máquina virtual que hospeda as extensões da JVM para lidar com essas linguagens. Da mesma forma, a máquina virtual Java oficial, desde sua versão 7, também inclui o opcode invokedynamic.
Referências
- ↑ Especificação de VM - Opcodes reservados
- ↑ Nutter, Charles (3 de janeiro de 2007). "InvokeDynamic: realmente útil?" . Recuperado em 25-01-2008 .
- ↑ veja JSR 292