7 puntos por GN⁺ 2024-11-19 | 1 comentarios | Compartir por WhatsApp
  • Nova es un motor de JavaScript caracterizado por un diseño orientado a datos, y adopta una estructura ideada para maximizar el rendimiento y la eficiencia de caché
    • Busca al mismo tiempo prevenir vulnerabilidades de memoria y optimizar el rendimiento
  • Características principales:
    • Todos los datos asignados en el heap de JavaScript se almacenan en vectores por tipo (los números en un vector de números, las cadenas en un vector de cadenas, etc.).
    • Las referencias del heap se manejan como índices diferenciados según el tipo, lo que brinda seguridad de memoria y eficiencia en tamaño.
    • Los objetos se dividen por tipo y se almacenan en vectores (objetos normales, arreglos, DataView, etc.).
    • Los objetos no ordinarios están diseñados para referenciar datos de objetos normales solo cuando es necesario.
    • Los objetos se almacenan con una separación agresiva para evitar leer datos que no se usan.
  • Aún está en desarrollo. El motor tiene funcionalidades muy limitadas, por lo que solo pasa alrededor del 47% de la suite de pruebas test262

1 comentarios

 
GN⁺ 2024-11-19
Opiniones en Hacker News
  • La discusión sobre las decisiones arquitectónicas es interesante, pero a la mayoría de la gente le falta contexto comparable. Es difícil entender qué ventajas tiene en comparación con la arquitectura de V8
  • He pensado en proyectos como un intérprete de Lisp y he identificado algunas ventajas clave
    • La asignación uniforme significa que no hay huecos de alineación
    • Ventajas del acceso lineal en el recolector de basura
    • Índices más pequeños que los punteros
    • Los índices diferenciados por tipo pueden ahorrar espacio
  • No hace falta compararlo de inmediato con V8. V8 es un proyecto de miles de millones de dólares
  • Podría ser buena idea revisar el motor de JS de Fabrice Bellard
  • La forma en que V8 asigna los datos
    • Todos los datos se asignan a una de varias partes del heap
    • Las referencias del heap son punteros reales o, si se usa compresión de punteros, desplazamientos desde la base del heap
    • Los objetos de V8 contienen todos los datos necesarios y en su mayoría se almacenan en una sola asignación
  • El diseño orientado a datos está guiado por conocer cómo se accede a los datos. Me pregunto por qué se asume que el acceso de datos común es un acceso lineal a objetos del mismo tipo
  • “Los números van en un vector de números” no es algo general. Los motores de JS suelen usar NaN-boxing o enteros pequeños en línea
  • Me pregunto si han considerado usar NaN-boxing. Me pregunto si los vectores por tipo son compactados por el GC o si mantienen una lista libre
  • Recomiendo leer "Don’t Stop the BIBOP: Flexible and Efficient Storage Management for Dynamically Typed Languages"
  • Me pregunto si este motor de JS es experimental o si intenta implementar toda la especificación de ECMAscript
  • Sigo el proyecto Rust Boa, pero todavía no creo que esté listo para producción
  • El enfoque orientado a datos y los vectores por tipo son bastante distintos de las arquitecturas tradicionales como V8
    • Rendimiento en escenarios reales: me pregunto si hay benchmarks que comparen Nova con V8 o SpiderMonkey en escenarios que incluyan patrones de acceso a datos complejos y no lineales
    • Trade-offs en el recolector de basura: me pregunto si el crecimiento y la compactación de vectores podrían causar fragmentación de memoria o cuellos de botella de rendimiento
  • Me pregunto si tienen en mente un perfil de aplicación específico
    • Podría ser útil para integrar un motor de scripting en juegos
  • Me pregunto qué significa la palabra “kind” en “kind-specific vectors”
    • Me pregunto si function X(a) { this.a = a; } y function Y(b) { this.b = b; } se consideran clases distintas de objeto
    • Me pregunto si al crear objetos con literales, {a: 1} y {b: 2} se consideran clases distintas de objeto