3 puntos por GN⁺ 2023-07-22 | 1 comentarios | Compartir por WhatsApp
  • 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

 
GN⁺ 2023-07-22
Opiniones de Hacker News
  • La implementación de un recolector de basura escrito en Rust para la JVM plantea preguntas sobre cómo garantizar el enraizamiento adecuado de las referencias al heap.
  • El artículo menciona que al ejecutar las pruebas en el repositorio clonado se produce un error al agregar entradas al classpath.
  • Un comentarista recuerda su experiencia trabajando en un proyecto de Java OS en el pasado y destaca las ventajas de seguridad de memoria de implementar una JVM en Rust.
  • Hay una pregunta sobre el soporte de genéricos en la JVM, y si todo termina tratándose como Object debido al borrado de tipos.
  • Un comentarista pregunta por las limitaciones del uso de lifetimes en las firmas de funciones y su impacto en el manejo de errores.
  • El proyecto es elogiado por su logro y por el aprendizaje que implicó.
  • Se extiende una oferta de trabajo al creador del proyecto.
  • Se comparte un enlace a otra implementación de JVM escrita en Go.
  • Un comentarista expresa admiración por el proyecto y pide orientación sobre una guía para empezar con Rust.
  • El proyecto se describe como una capa fundacional de una JVM con mecanismos base interesantes.
  • Hay una referencia humorística a un proyecto de sistema operativo como hobby.
  • Se comparte un enlace a proyectos similares.