- 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
Hacker-News-Kommentare
Objectbehandelt wird.