2 puntos por GN⁺ 2024-07-31 | 1 comentarios | Compartir por WhatsApp

Un motor JS AOT experimental desde cero

Porffor es un motor/compilador/runtime de JS único que compila código JS por adelantado a WebAssembly o nativo. Actualmente se usa con fines de investigación y su uso práctico es limitado.

Compilación a Wasm

La salida WebAssembly de Porffor es mucho más rápida y pequeña que la de proyectos existentes de JS -> Wasm. Esto se debe a que Porffor compila JS con AOT.

  • Tamaño de Wasm: 32 veces más pequeño que Javy (~1.3MB -> ~40KB)
  • Rendimiento de Wasm: 18 veces más rápido que Javy (~70m -> ~4m)

Compilación nativa

Como compila JS por adelantado, Porffor puede compilar a binarios nativos reales sin empaquetar un runtime. Esto produce los siguientes resultados:

  • Tamaño del binario: más de 1000 veces más pequeño (~90MB -> <50KB)
  • Uso de memoria: más de 40 veces menor (~50MB -> ~1MB)
  • Rendimiento: hasta 3 veces más rápido

Puntos adicionales

  • Porffor es seguro: compila a Wasm y está escrito en un lenguaje con seguridad de memoria (JS).
  • Porffor fue escrito desde cero pensando en AOT: no se basa en motores JS existentes. Su única dependencia es un parser de JS.
  • Porffor soporta entrada TypeScript: no hace falta una etapa molesta de transpiler. Basta con pasar archivos TS directamente.

Playground

Puedes probar Porffor en línea o localmente. Solo usa el comando npm i -g porffor@latest && porf.

  • Números primos
  • Fibonacci
  • Factorial
  • Suma de dígitos
  • Excepción
  • Lectura de arreglos
  • ArrayPrototype
  • Parser de propuestas matemáticas: acorn, meriyah, hermes-parser, @babel/parser
  • Objetivo: 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

Test262 es la suite oficial de pruebas de conformidad de ECMAScript. Porffor la ejecuta en cada commit para seguir el progreso de conformidad.

Resumen de GN⁺

Porffor es un motor único que compila código JS por adelantado a WebAssembly o nativo. Ofrece tamaños mucho más pequeños y mejor rendimiento que las soluciones existentes. Se usa con fines de investigación y soporta entrada TypeScript. Este proyecto puede ser útil para investigar el rendimiento y la eficiencia de los motores JS. Un proyecto con funciones similares es un compilador JS -> Wasm como Javy.

1 comentarios

 
GN⁺ 2024-07-31
Opiniones de Hacker News
  • Oliver anunció que se dedicará de lleno a Porffor
  • Hay opiniones de que, como las mejoras de rendimiento de JS tienen un límite, lo mejor sería transpilar a llamadas de V8 en C++
    • Compilar TypeScript puede dar una gran mejora de rendimiento
    • TS y V8 son objetivos no estándar que cambian rápido, por lo que se necesita un equipo grande
  • Les parece genial que un runtime de JS esté intentando acceder a Wasm
    • Analizan las similitudes y diferencias entre Static Hermes y Porffor
      • Ambos buscan cumplir con JS test262
      • Porffor soporta salida Native y Wasm, mientras que Static Hermes se enfoca principalmente en salida Native
      • Porffor está self-hosted y escrito en JS puro, mientras que Static Hermes depende de LLVM
      • Porffor no soporta async/promises/await, pero Static Hermes sí lo hace de forma limitada
      • Static Hermes está escrito en C++, y Porffor está escrito principalmente en JS
      • Ambos soportan TypeScript, pero Static Hermes transpila el AST de TS a Flow, mientras que Porffor lo soporta de forma nativa
      • Static Hermes tiene un intérprete de fallback para soportar escenarios difíciles de JS como eval, pero Porffor solo soporta compilación AOT
  • Hay expectativa sobre si este proyecto podrá acelerar los motores de JS
  • En windmill.dev, cuando los usuarios despliegan código, usan builds de Bun para empaquetar el script y todas sus dependencias en un solo archivo js
    • Guardan el bundle en s3 para mejorar el cold start y el uso de memoria
    • Si se pudiera empaquetar todo de forma nativa, sería un cambio de juego
  • Se preguntan por qué "ahead-of-time JS engine" sería una mejor descripción que "JS-to-Wasm compiler"
  • Hay dudas sobre la forma en que Porffor maneja el versionado
    • Si aparecen regresiones en las pruebas de Test262, el número de versión podría ir hacia atrás
  • Porffor significa "morado" en galés
  • Se preguntan cómo compila QuickJS el JS a código nativo en comparación
  • Creen que es una idea similar a cuando Facebook intentó transpilar PHP a C
    • Se llamaba hiphop-php y al final crearon hhvm como un concepto nuevo
  • Quieren saber si hay alguna forma de compilar NodeJS como una librería nativa
    • El proceso que usan actualmente es algo complejo y propenso a errores