7 points par GN⁺ 2024-11-19 | 1 commentaires | Partager sur WhatsApp
  • Nova est un moteur JavaScript caractérisé par une conception orientée données, avec une architecture pensée pour maximiser les performances et l’efficacité du cache
    • Il vise à la fois la prévention des vulnérabilités mémoire et l’optimisation des performances
  • Principales caractéristiques :
    • Toutes les données allouées sur le tas JavaScript sont stockées dans des vecteurs par type (les nombres dans un vecteur de nombres, les chaînes dans un vecteur de chaînes, etc.).
    • Les références du tas sont gérées comme des index distingués selon le type, ce qui offre sûreté mémoire et efficacité en taille.
    • Les objets sont stockés dans des vecteurs séparés par type (objets généraux, tableaux, DataView, etc.).
    • Les objets non généraux sont conçus pour ne référencer les données d’objet général qu’en cas de besoin.
    • Les objets sont stockés de manière fortement découplée afin d’éviter la lecture de données inutilisées.
  • Le projet est encore en cours de développement. Le moteur reste très limité en fonctionnalités et ne réussit qu’environ 47 % de la suite de tests test262

1 commentaires

 
GN⁺ 2024-11-19
Avis Hacker News
  • La discussion sur les choix d’architecture est intéressante, mais la plupart des gens manquent de contexte de comparaison. Il est difficile de comprendre quels sont les avantages par rapport à l’architecture de V8
  • J’ai déjà réfléchi à des projets comme un interpréteur Lisp, et j’y ai identifié quelques avantages clés
    • Une allocation uniforme signifie qu’il n’y a pas d’écarts d’alignement
    • Les avantages d’un accès linéaire dans le garbage collection
    • Des index plus petits que des pointeurs
    • Des index différenciés par type peuvent faire gagner de la place
  • Il n’est pas nécessaire de faire immédiatement la comparaison avec V8. V8 est un projet à plusieurs milliards de dollars
  • Il serait probablement utile de se référer au moteur JS de Fabrice Bellard
  • La manière dont V8 alloue les données
    • Toutes les données sont allouées dans l’une des différentes parties du heap
    • Les références au heap sont soit de vrais pointeurs, soit, si la compression de pointeurs est utilisée, des offsets à partir de la base du heap
    • Les objets de V8 contiennent toutes les données nécessaires et sont, pour la plupart, stockés dans une seule allocation
  • Une conception orientée données est pilotée par la connaissance du mode d’accès aux données. Je me demande pourquoi on suppose que l’accès typique aux données est un accès linéaire à des objets du même type
  • « les nombres vont dans un vecteur de nombres » n’est pas une approche générale. Les moteurs JS utilisent généralement le NaN-boxing ou de petits entiers inline
  • Je me demande si l’usage du NaN-boxing a été envisagé. Je me demande aussi si les vecteurs par type sont compactés par le GC ou s’ils maintiennent une free list
  • Je recommande de lire « Don’t Stop the BIBOP: Flexible and Efficient Storage Management for Dynamically Typed Languages »
  • Je me demande si ce moteur JS est expérimental ou s’il vise à implémenter l’intégralité de la spécification ECMAscript
  • Je suis le projet Rust Boa, mais je pense qu’il n’est pas encore prêt pour la production
  • L’approche orientée données et les vecteurs par type diffèrent fortement des architectures traditionnelles comme V8
    • Performances dans des scénarios réels : je me demande s’il existe des benchmarks comparant Nova à V8 ou SpiderMonkey dans des scénarios incluant des schémas d’accès aux données complexes et non linéaires
    • Compromis côté garbage collection : je me demande si la croissance et la compaction des vecteurs peuvent provoquer de la fragmentation mémoire ou des goulots d’étranglement de performance
  • Je me demande s’il y a un profil d’application particulier visé
    • Cela pourrait être utile pour embarquer un moteur de script dans des jeux
  • Je me demande ce que signifie le mot « kind » dans « kind-specific vectors »
    • Je me demande si function X(a) { this.a = a; } et function Y(b) { this.b = b; } sont considérées comme des objets de types différents
    • Lorsqu’on crée des objets avec des littéraux, je me demande si {a: 1} et {b: 2} sont considérés comme des objets de types différents