3 points par GN⁺ 2023-07-22 | 1 commentaires | Partager sur WhatsApp
  • 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

 
GN⁺ 2023-07-22
Commentaires sur Hacker News
  • L’implémentation d’un ramasse-miettes écrit en Rust dans une JVM soulève des questions sur la garantie d’un enracinement correct des références vers le tas.
  • L’article mentionne qu’en exécutant les tests dans le dépôt cloné, une erreur se produit lors de l’ajout d’éléments au classpath.
  • Un commentateur se remémore son expérience passée sur un projet de Java OS et souligne les avantages en matière de sécurité mémoire d’une implémentation de JVM en Rust.
  • Une question est posée sur la prise en charge des génériques dans la JVM, notamment pour savoir si tout est traité comme Object à cause de l’effacement des types.
  • Un commentateur s’interroge sur les limites de l’usage des lifetimes dans les signatures de fonctions et sur leur impact sur la gestion des erreurs.
  • Le projet est salué pour son accomplissement et pour la valeur de l’expérience d’apprentissage qu’il représente.
  • Une offre d’emploi est adressée au créateur du projet.
  • Un lien vers une autre implémentation de JVM écrite en Go est partagé.
  • Un commentateur admire le projet et demande des conseils pour débuter avec Rust.
  • Le projet est décrit comme une couche fondamentale de JVM dotée de mécanismes sous-jacents intéressants.
  • Une allusion humoristique est faite aux projets de systèmes d’exploitation amateurs.
  • Des liens vers des projets similaires sont partagés.