- O autor criou uma JVM chamada rjvm em Rust como projeto de aprendizado.
- Esta JVM é uma implementação de brinquedo e não oferece suporte a genéricos, threads, reflexão, anotações, I/O ou compilação JIT.
- Esta JVM implementa instruções de fluxo de controle, criação de tipos primitivos e objetos, chamadas de métodos virtuais e estáticos, tratamento de exceções, coleta de lixo e resolução de classes a partir de arquivos jar.
- O autor implementou a suíte de testes usando o
rt.jar real do OpenJDK 7.
- O código é composto por três crates:
reader, vm e vm_cli.
- O crate
reader consegue analisar arquivos .class e modelar seu conteúdo.
- O crate
vm contém a máquina virtual capaz de executar o código.
- O
vm_cli é um lançador simples de linha de comando para a VM.
- O autor está considerando extrair o crate
reader para um repositório separado para que outras pessoas possam usá-lo.
- Carregar arquivos
.class é o primeiro passo para executar código Java.
- Os arquivos de classe incluem metadados sobre a classe, nomes da superclasse e das interfaces, campos e métodos com seus descritores e bytecode.
- A principal API do crate
vm é Vm::invoke, usada para executar métodos.
- O crate
vm oferece suporte tanto a métodos em bytecode Java quanto a métodos nativos implementados em Rust.
- A JVM é baseada em pilha, e as instruções de bytecode operam sobre a pilha de valores e as variáveis locais.
- Valores e objetos são modelados com
enum e struct do Rust.
- A execução de métodos envolve rodar as instruções de bytecode uma a uma, atualizar o contador de programa e manipular a pilha e as variáveis locais.
- A JVM oferece suporte a vários tipos de chamadas de métodos, incluindo resolução virtual e estática.
- As exceções são implementadas com tabelas de exceção e podem interromper o fluxo normal de controle de um método.
- O autor se orgulha da implementação de exceções usando
Result e pattern matching do Rust.
- A JVM inclui um coletor de lixo que usa um algoritmo de cópia semiespacial stop-the-world.
- O coletor de lixo divide a memória em dois semiespaços e copia os objetos vivos de um semiespaço para o outro.
- O autor se divertiu muito e aprendeu bastante ao escrever o rjvm em Rust.
1 comentários
Comentários do Hacker News
Objectdevido ao apagamento de tipos.