- L’auteur a créé une JVM écrite en Rust, nommée rjvm, comme projet d’apprentissage.
- Cette JVM est une implémentation jouet et ne prend pas en charge les génériques, les threads, la réflexion, les annotations, les E/S ni la compilation JIT.
- Cette JVM implémente les instructions de contrôle de flux, les types primitifs et la création d’objets, les appels de méthodes virtuelles et statiques, la gestion des exceptions, le ramasse-miettes et la résolution de classes à partir de fichiers jar.
- L’auteur a mis en place une suite de tests en utilisant le véritable
rt.jar d’OpenJDK 7.
- Le code se compose de trois crates :
reader, vm et vm_cli.
- La crate
reader peut analyser les fichiers .class et modéliser leur contenu.
- La crate
vm contient une machine virtuelle capable d’exécuter le code.
- La crate
vm_cli est un lanceur en ligne de commande simple pour la VM.
- L’auteur envisage d’extraire la crate
reader dans un dépôt séparé pour que d’autres puissent l’utiliser.
- Le chargement des fichiers
.class constitue la première étape de l’exécution du code Java.
- Les fichiers de classe contiennent les métadonnées de la classe, le nom de la superclasse et des interfaces, les champs et méthodes ainsi que leurs descripteurs et leur bytecode.
- L’API principale de la crate
vm est Vm::invoke, utilisée pour exécuter des méthodes.
- La crate
vm prend en charge à la fois les méthodes de bytecode Java et les méthodes natives implémentées en Rust.
- La JVM est basée sur une pile, et les instructions de bytecode opèrent sur la pile de valeurs et les variables locales.
- Les valeurs et les objets sont modélisés à l’aide des
enum et struct de Rust.
- L’exécution d’une méthode consiste à exécuter les instructions de bytecode une par une, à mettre à jour le compteur ordinal et à manipuler la pile et les variables locales.
- La JVM prend en charge différents types d’appels de méthodes, y compris les résolutions virtuelles et statiques.
- Les exceptions sont implémentées à l’aide d’une table d’exceptions et peuvent interrompre le flux de contrôle normal d’une méthode.
- L’auteur se dit particulièrement fier de son implémentation des exceptions avec
Result et le pattern matching de Rust.
- La JVM inclut un ramasse-miettes utilisant un algorithme stop-the-world de copie entre deux demi-espaces.
- Le ramasse-miettes divise la mémoire en deux demi-espaces et copie les objets encore vivants d’un demi-espace à l’autre.
- L’auteur a beaucoup appris et s’est beaucoup amusé en écrivant rjvm en Rust.
1 commentaires
Commentaires sur Hacker News
Objectà cause de l’effacement des types.