2 points par GN⁺ 2024-07-31 | 1 commentaires | Partager sur WhatsApp

Un moteur JS AOT expérimental dès le départ

Porffor est un moteur/compilateur/runtime JS unique qui précompile le code JS en WebAssembly ou en natif. À l’heure actuelle, il est utilisé à des fins de recherche et son usage réel reste limité.

Compilation Wasm

La sortie WebAssembly de Porffor est bien plus rapide et compacte que celle des projets JS -> Wasm existants. Cela s’explique par le fait que Porffor compile le JS en AOT.

  • Taille du Wasm : 32 fois plus petite que Javy (~1.3MB -> ~40KB)
  • Performances du Wasm : 18 fois plus rapides que Javy (~70m -> ~4m)

Compilation native

Comme il précompile le JS, Porffor peut produire de véritables binaires natifs sans embarquer de runtime. Cela entraîne les résultats suivants :

  • Taille du binaire : plus de 1000 fois plus petite (~90MB -> <50KB)
  • Utilisation mémoire : plus de 40 fois inférieure (~50MB -> ~1MB)
  • Performances : jusqu’à 3 fois plus rapides

Autres points

  • Porffor est sûr : il compile en Wasm et est écrit dans un langage memory-safe (JS).
  • Porffor a été conçu dès le départ pour l’AOT : il ne repose sur aucun moteur JS existant. Sa seule dépendance est un parseur JS.
  • Porffor prend en charge l’entrée TypeScript : aucune étape pénible de transpilation n’est nécessaire. Il suffit de lui donner directement un fichier TS.

Playground

Il est possible d’essayer Porffor en ligne ou en local. Utilisez la commande 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

Test262 est la suite officielle de tests de conformité ECMAScript. Porffor l’exécute à chaque commit afin de suivre l’avancement de sa conformité.

Résumé GN⁺

Porffor est un moteur original qui précompile le code JS en WebAssembly ou en natif. Il offre une taille bien plus réduite et de meilleures performances que les solutions existantes. Il est utilisé à des fins de recherche et prend en charge l’entrée TypeScript. Ce projet peut être utile pour étudier les performances et l’efficacité des moteurs JS. Parmi les projets comparables, on trouve des compilateurs JS -> Wasm comme Javy.

1 commentaires

 
GN⁺ 2024-07-31
Avis Hacker News
  • Oliver a annoncé qu’il allait se consacrer à Porffor
  • Certains estiment qu’il existe une limite aux gains de performance en JS, et que le mieux serait de transpiler vers des appels C++ de V8
    • Compiler du TypeScript peut apporter un gros gain de performance
    • TS et V8 sont des cibles non standard qui évoluent rapidement, ce qui nécessite une grande équipe
  • L’idée qu’un runtime JS tente une approche via Wasm est jugée intéressante
    • Analyse des points communs et des différences entre Static Hermes et Porffor
      • Les deux visent la conformité aux tests JS test262
      • Porffor prend en charge une sortie Native et Wasm, tandis que Static Hermes se concentre surtout sur la sortie Native
      • Porffor est auto-hébergé et écrit en pur JS, tandis que Static Hermes dépend de LLVM
      • Porffor ne prend pas en charge async/promises/await, tandis que Static Hermes les prend en charge de manière limitée
      • Static Hermes est écrit en C++, et Porffor principalement en JS
      • Les deux prennent en charge TypeScript, mais Static Hermes transpile le TS AST vers Flow, tandis que Porffor le prend en charge nativement
      • Static Hermes dispose d’un interpréteur de repli pour prendre en charge des scénarios JS difficiles comme eval, alors que Porffor ne prend en charge que la compilation AOT
  • Certains espèrent que ce projet pourra accélérer les moteurs JS
  • Chez windmill.dev, lors du déploiement de code par les utilisateurs, un build Bun est utilisé pour regrouper le script et toutes ses dépendances dans un seul fichier js
    • Le bundle est stocké sur s3 afin d’améliorer le cold start et l’usage mémoire
    • S’il devient possible de tout bundler en natif, ce serait un game changer
  • Certains se demandent pourquoi « ahead-of-time JS engine » serait une meilleure description que « JS-to-Wasm compiler »
  • Il y a des doutes sur la manière dont Porffor gère son versioning
    • Si une régression survient dans les tests Test262, le numéro de version pourrait reculer
  • Porffor signifie « violet » en gallois
  • Certains se demandent comment il compile le JS en code natif par rapport à quickJS
  • Certains pensent que c’est la même idée que lorsque Facebook avait essayé de transpiler PHP en C
    • Cela s’appelait hiphop-php, et cela a fini par donner hhvm, avec un concept différent
  • Certains aimeraient savoir comment compiler NodeJS en bibliothèque native
    • Le processus qu’ils utilisent actuellement est un peu complexe et sujet aux erreurs