2 pontos por GN⁺ 2024-07-31 | 1 comentários | Compartilhar no WhatsApp

Um motor JS AOT experimental desde o início

Porffor é um motor/compilador/runtime de JS único que faz a compilação antecipada de código JS para WebAssembly ou nativo. Atualmente, é usado para fins de pesquisa e tem uso prático limitado.

Compilação para Wasm

A saída WebAssembly do Porffor é muito mais rápida e menor do que a de projetos JS -> Wasm existentes. Isso ocorre porque o Porffor compila JS com AOT.

  • Tamanho do Wasm: 32 vezes menor que o Javy (~1.3MB -> ~40KB)
  • Desempenho do Wasm: 18 vezes mais rápido que o Javy (~70m -> ~4m)

Compilação nativa

Como compila JS antecipadamente, o Porffor pode gerar binários nativos reais sem empacotar um runtime. Isso resulta em:

  • Tamanho do binário: mais de 1000 vezes menor (~90MB -> <50KB)
  • Uso de memória: mais de 40 vezes menor (~50MB -> ~1MB)
  • Desempenho: até 3 vezes mais rápido

Informações adicionais

  • O Porffor é seguro: é compilado para Wasm e escrito em uma linguagem com segurança de memória (JS).
  • O Porffor foi criado com AOT em mente desde o início: não é baseado em motores JS existentes. Sua única dependência é um parser de JS.
  • O Porffor oferece suporte a entrada em TypeScript: não é necessário um passo incômodo de transpiler. Basta fornecer arquivos TS diretamente.

Playground

É possível experimentar o Porffor online ou localmente. Basta usar o comando npm i -g porffor@latest && porf.

  • Prime Numbers
  • Fibonacci
  • Factorial
  • Sum of Digits
  • Exception
  • Array Reading
  • ArrayPrototype
  • Math Proposals Parser: acorn, meriyah, hermes-parser, @babel/parser
  • Target: wasm
const isPrime = number => {
  if (number < 2) return false;
  for (let i = 2; i < number; i++) {
    if (number % i == 0) return false;
  }
  return true;
}

let counter = 0;
while (counter <= 10000) {
  if (isPrime(counter)) Porffor.numberLog(counter);
  counter++;
}

Test262

O Test262 é a suíte oficial de testes de conformidade do ECMAScript. O Porffor a executa a cada commit para acompanhar o progresso de conformidade.

Resumo do GN⁺

Porffor é um motor único que compila antecipadamente código JS para WebAssembly ou nativo. Isso proporciona tamanho muito menor e desempenho mais rápido em comparação com soluções existentes. Ele é usado para fins de pesquisa e oferece suporte a entrada em TypeScript. Este projeto pode ser útil para pesquisar desempenho e eficiência de motores JS. Um projeto com funcionalidade semelhante é o Javy, um compilador de JS -> Wasm.

1 comentários

 
GN⁺ 2024-07-31
Opiniões no Hacker News
  • Foi anunciado que Oliver vai se dedicar ao Porffor
  • Há a opinião de que, como existem limites para melhorar o desempenho de JS, o melhor seria transpilar para chamadas C++ do V8
    • Compilar TypeScript pode trazer um grande ganho de desempenho
    • TS e V8 são alvos não padronizados que mudam rapidamente, então seria necessária uma equipe grande
  • Acham interessante que um runtime de JS esteja tentando adotar acesso a Wasm
    • Analisam semelhanças e diferenças entre Static Hermes e Porffor
      • Ambos têm como objetivo conformidade com os testes JS test262
      • O Porffor oferece suporte a saída Native e Wasm, enquanto o Static Hermes foca principalmente em saída Native
      • O Porffor é self-hosted e escrito em JS puro, enquanto o Static Hermes depende de LLVM
      • O Porffor não oferece suporte a async/promises/await, mas o Static Hermes oferece suporte limitado
      • O Static Hermes foi escrito em C++, e o Porffor foi escrito principalmente em JS
      • Ambos oferecem suporte a TypeScript, mas o Static Hermes transpila a AST de TS para Flow, enquanto o Porffor oferece suporte nativo
      • O Static Hermes tem um interpretador de fallback para dar suporte a cenários difíceis de JS, como eval, mas o Porffor oferece apenas compilação AOT
  • Há expectativa sobre se esse projeto poderá acelerar motores JS
  • No windmill.dev, quando usuários implantam código, usam um build do Bun para empacotar o script e todas as dependências em um único arquivo js
    • Armazenam o bundle no s3 para melhorar cold start e uso de memória
    • Se fosse possível empacotar tudo nativamente, seria um divisor de águas
  • Há curiosidade sobre por que "ahead-of-time JS engine" seria uma descrição melhor do que "JS-to-Wasm compiler"
  • Há dúvidas sobre a forma como o Porffor faz versionamento
    • Se ocorrer regressão nos testes Test262, o número da versão pode regredir
  • Porffor significa "roxo" em galês
  • Há curiosidade sobre como ele compila JS para código nativo em comparação com o quickJS
  • Acham que é a mesma ideia de quando o Facebook tentou transpilar PHP para C
    • Chamava-se hiphop-php e, no fim, criaram o hhvm como um novo conceito
  • Gostariam de saber se existe uma forma de compilar NodeJS como uma biblioteca nativa
    • O processo usado atualmente é um pouco complexo e propenso a erros