- El autor creó una JVM escrita en Rust llamada
rjvm como proyecto de aprendizaje.
- Esta JVM es una implementación de juguete y no soporta genéricos, hilos, reflexión, anotaciones, I/O ni compilación JIT.
- Esta JVM implementa sentencias de control de flujo, primitivos y creación de objetos, llamadas a métodos virtuales y estáticos, manejo de excepciones, recolección de basura y resolución de clases desde archivos jar.
- El autor implementó una suite de pruebas usando el
rt.jar real de OpenJDK 7.
- El código está compuesto por tres crates:
reader, vm y vm_cli.
- El crate
reader puede analizar archivos .class y modelar su contenido.
- El crate
vm contiene una máquina virtual capaz de ejecutar código.
vm_cli es un lanzador simple de línea de comandos para la VM.
- El autor está considerando extraer el crate
reader a un repositorio separado para que otras personas puedan usarlo.
- Cargar archivos
.class es el primer paso para ejecutar código Java.
- Los archivos de clase contienen metadatos sobre la clase, nombres de superclases e interfaces, campos y métodos junto con sus descriptores y bytecode.
- La API principal del crate
vm es Vm::invoke, que se usa para ejecutar métodos.
- El crate
vm soporta tanto métodos de bytecode Java como métodos nativos implementados en Rust.
- La JVM está basada en pila, y las instrucciones de bytecode operan sobre la pila de valores y las variables locales.
- Los valores y objetos se modelan usando
enum y struct de Rust.
- La ejecución de métodos implica ejecutar las instrucciones de bytecode una por una, actualizar el contador de programa y manipular la pila y las variables locales.
- La JVM soporta varios tipos de invocación de métodos, incluidas las búsquedas virtuales y estáticas.
- Las excepciones se implementan usando tablas de excepciones y pueden interrumpir el flujo de control normal de un método.
- El autor está orgulloso de su implementación de excepciones usando
Result y pattern matching de Rust.
- La JVM incluye un recolector de basura que usa un algoritmo stop-the-world de copia por semiespacios.
- El recolector de basura divide la memoria en dos semiespacios y copia los objetos vivos de un semiespacio al otro.
- El autor se divirtió mucho y aprendió bastante escribiendo
rjvm en Rust.
1 comentarios
Opiniones de Hacker News
Objectdebido al borrado de tipos.