3 pontos por GN⁺ 2023-07-22 | 1 comentários | Compartilhar no WhatsApp
  • 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

 
GN⁺ 2023-07-22
Comentários do Hacker News
  • A implementação de um coletor de lixo escrito em Rust na JVM levanta questões sobre como garantir o enraizamento adequado das referências ao heap.
  • O artigo menciona que executar os testes no repositório clonado gera um erro ao adicionar itens ao classpath.
  • Um comentarista relembra sua experiência anterior trabalhando em um projeto de Java OS e destaca as vantagens de segurança de memória de implementar uma JVM em Rust.
  • Há uma pergunta sobre o suporte a genéricos na JVM, questionando se tudo é tratado como Object devido ao apagamento de tipos.
  • Um comentarista pergunta sobre as limitações do uso de lifetimes em assinaturas de função e o impacto disso no tratamento de erros.
  • O projeto é elogiado por sua realização e pelo aprendizado proporcionado.
  • Uma oferta de emprego é estendida ao criador do projeto.
  • É compartilhado um link para outra implementação de JVM escrita em Go.
  • Um comentarista expressa admiração pelo projeto e pede orientação sobre um guia introdutório de Rust.
  • O projeto é descrito como uma camada fundamental da JVM com mecanismos subjacentes interessantes.
  • Há uma menção bem-humorada a um projeto de sistema operacional de hobby.
  • São compartilhados links para projetos semelhantes.