7 pontos por GN⁺ 2024-11-19 | 1 comentários | Compartilhar no WhatsApp
  • Nova é um motor de JavaScript com design orientado a dados, adotando uma arquitetura projetada para maximizar o desempenho e a eficiência de cache
    • Busca ao mesmo tempo prevenir vulnerabilidades de memória e otimizar o desempenho
  • Principais características:
    • Todos os dados alocados no heap JavaScript são armazenados em vetores por tipo (números em vetor de números, strings em vetor de strings etc.).
    • As referências do heap são tratadas como índices separados por tipo, o que oferece segurança de memória e eficiência de tamanho.
    • Os objetos são divididos por tipo e armazenados em vetores (objetos comuns, arrays, DataView etc.).
    • Objetos não comuns são projetados para referenciar dados de objetos comuns apenas quando necessário.
    • Os objetos são armazenados de forma agressivamente separada para evitar a leitura de dados desnecessários.
  • Ainda está em desenvolvimento. O motor tem funcionalidades muito limitadas e passa em apenas cerca de 47% da suíte de testes test262

1 comentários

 
GN⁺ 2024-11-19
Comentários no Hacker News
  • A discussão sobre as escolhas arquiteturais é interessante, mas a maioria das pessoas não tem contexto suficiente para comparar. É difícil entender quais seriam as vantagens em relação à arquitetura do V8
  • Já pensei em projetos como um interpretador Lisp e identifiquei algumas vantagens principais
    • Alocação uniforme significa que não há intervalos de alinhamento
    • Benefícios do acesso linear no coletor de lixo
    • Índices menores que ponteiros
    • Índices separados por tipo podem economizar espaço
  • Não é necessário fazer uma comparação imediata com o V8. O V8 é um projeto de bilhões de dólares
  • Talvez valha a pena consultar o motor JS do Fabrice Bellard
  • O modo como o V8 aloca dados
    • Todos os dados são alocados em uma entre várias partes do heap
    • Referências ao heap são ponteiros reais ou, ao usar compressão de ponteiros, deslocamentos a partir da base do heap
    • Os objetos do V8 contêm todos os dados necessários e, na maioria dos casos, ficam armazenados em uma única alocação
  • Design orientado a dados é guiado pelo conhecimento de como os dados serão acessados. Fico me perguntando por que se assume que o acesso típico aos dados será um acesso linear a objetos do mesmo tipo
  • “Números vão para um vetor de números” não é algo comum. Motores JS normalmente usam NaN-boxing ou pequenos inteiros inline
  • Fico curioso se foi considerado o uso de NaN-boxing. Também queria saber se os vetores por tipo são compactados pelo GC ou se mantêm uma lista livre
  • Recomendo ler "Don’t Stop the BIBOP: Flexible and Efficient Storage Management for Dynamically Typed Languages"
  • Fico curioso se este motor JS é experimental ou se pretende implementar toda a especificação ECMAscript
  • Estou acompanhando o projeto Rust Boa, mas ainda acho que ele não está pronto para produção
  • A abordagem orientada a dados e os vetores por tipo são bem diferentes de arquiteturas tradicionais como a do V8
    • Desempenho em cenários reais: queria saber se há benchmarks comparando o Nova com V8 ou SpiderMonkey em cenários com padrões de acesso a dados complexos e não lineares
    • Trade-offs no coletor de lixo: queria saber se o crescimento e a compactação dos vetores podem causar fragmentação de memória ou gargalos de desempenho
  • Fico curioso se existe algum perfil específico de aplicação em mente
    • Pode ser útil para embutir um motor de script em jogos
  • Fico curioso sobre o significado da palavra "kind" em "kind-specific vectors"
    • function X(a) { this.a = a; } e function Y(b) { this.b = b; } seriam considerados tipos diferentes de objeto?
    • Ao criar objetos com literais, {a: 1} e {b: 2} seriam considerados tipos diferentes de objeto?