3 Punkte von GN⁺ 2023-07-22 | 1 Kommentare | Auf WhatsApp teilen
  • Der Autor hat als Lernprojekt eine in Rust geschriebene JVM namens rjvm entwickelt.
  • Diese JVM ist eine Spielzeugimplementierung und unterstützt keine Generics, Threads, Reflection, Annotations, I/O oder JIT-Kompilierung.
  • Diese JVM implementiert Kontrollflussanweisungen, Primitive und Objekterzeugung, virtuelle und statische Methodenaufrufe, Exception-Handling, Garbage Collection sowie die Klassenauflösung aus jar-Dateien.
  • Der Autor hat die Testsuite mit der echten rt.jar aus OpenJDK 7 umgesetzt.
  • Der Code besteht aus drei Crates: reader, vm und vm_cli.
  • Das Crate reader kann .class-Dateien parsen und deren Inhalt modellieren.
  • Das Crate vm enthält eine virtuelle Maschine, die Code ausführen kann.
  • Das Crate vm_cli ist ein einfacher Kommandozeilen-Launcher für die VM.
  • Der Autor erwägt, das Crate reader in ein separates Repository auszulagern, damit andere es nutzen können.
  • Das Laden von .class-Dateien ist der erste Schritt zur Ausführung von Java-Code.
  • Klassendateien enthalten Metadaten über die Klasse, Namen von Superklassen und Interfaces, Felder und Methoden sowie deren Deskriptoren und Bytecode.
  • Die wichtigste API des Crates vm ist Vm::invoke, mit der Methoden ausgeführt werden.
  • Das Crate vm unterstützt sowohl Java-Bytecode-Methoden als auch in Rust implementierte native Methoden.
  • Die JVM ist stackbasiert; Bytecode-Befehle arbeiten auf dem Wertestapel und mit lokalen Variablen.
  • Werte und Objekte werden mit enum und struct aus Rust modelliert.
  • Die Methodenausführung umfasst das schrittweise Ausführen von Bytecode-Befehlen, das Aktualisieren des Programmzählers sowie das Manipulieren von Stack und lokalen Variablen.
  • Die JVM unterstützt verschiedene Arten von Methodenaufrufen, einschließlich virtueller und statischer Auflösung.
  • Exceptions werden mithilfe von Exception-Tabellen implementiert und können den normalen Kontrollfluss einer Methode unterbrechen.
  • Der Autor ist besonders stolz auf die Exception-Implementierung mit Rusts Result und Pattern Matching.
  • Die JVM enthält einen Garbage Collector, der einen Stop-the-World-Halbraum-Kopieralgorithmus verwendet.
  • Der Garbage Collector teilt den Speicher in zwei Halbräume und kopiert lebende Objekte von einem Halbraum in den anderen.
  • Der Autor hatte viel Spaß und hat beim Schreiben von rjvm in Rust viel gelernt.

1 Kommentare

 
GN⁺ 2023-07-22
Hacker-News-Kommentare
  • Die Implementierung eines in Rust geschriebenen Garbage Collectors in der JVM wirft die Frage auf, wie sichergestellt wird, dass Referenzen auf den Heap korrekt gerootet werden.
  • Im Artikel wird erwähnt, dass beim Ausführen der Tests im geklonten Repository ein Fehler auftritt, der das Hinzufügen von Einträgen zum Classpath betrifft.
  • Ein Kommentator erinnert sich an seine frühere Arbeit an einem Java-OS-Projekt und betont die Vorteile der Speichersicherheit bei der Implementierung einer JVM in Rust.
  • Es gibt eine Frage zur Unterstützung von Generics in der JVM und dazu, ob wegen Type Erasure alles als Object behandelt wird.
  • Ein Kommentator fragt nach den Einschränkungen bei der Verwendung von Lifetimes in Funktionssignaturen und nach deren Auswirkungen auf die Fehlerbehandlung.
  • Das Projekt wird für seine Leistung und den Lerneffekt gelobt.
  • Dem Gründer des Projekts wird ein Jobangebot gemacht.
  • Ein Link zu einer anderen in Go geschriebenen JVM-Implementierung wird geteilt.
  • Ein Kommentator ist von dem Projekt beeindruckt und bittet um Hinweise für einen Einstieg in Rust.
  • Das Projekt wird als Basisschicht einer JVM mit interessanten zugrunde liegenden Mechanismen beschrieben.
  • Es gibt eine humorvolle Anspielung auf ein Hobby-Betriebssystemprojekt.
  • Ein Link zu einem ähnlichen Projekt wird geteilt.