Vue lecture

QuickJS version 2025-04-26 et QuickJS-NG version 0.10

Finalement Fabrice Bellard est comme tout le monde, lui aussi numérote ses versions avec des dates, c'est plus simple. Voici donc la version annuelle de QuickJS (licence MIT), son moteur JavaScript incorporable et compact (le binaire Linux 64 bits fait 757 kiB). QuickJS est compatible avec ECMAScript 2023 — sauf pour les appels tails que les auteurs ne trouvent pas indispensables — et passe presque toute la suite de tests ECMAScript (en sélectionnant ES2023).

En 2023, pour revivifier un développement un peu dormant, la fourche QuickJS-NG a été lancée (par un des contributeurs de Jitsi). QuickJS-NG est intéressant pour ceux qui veulent utiliser cmake et compiler le projet sous Windows avec le compilateur C Microsoft. Il intègre aussi le support de quelques fonctionnalités récentes de la norme JavaScript que QuickJS ne supporte pas encore. (Je cite Fabrice Bellard). Les différences ne sont pas énormes. La version 0.10 est toute neuve.

Ci-après, Fabrice Bellard m'a très gentiment expliqué les principaux changements de QuickJS.

Changements les plus importants dans QuickJS 2025-04-26

Les explications viennent de Fabrice Bellard :

  • La suppression d'extensions non standardisées que j'avais ajoutées pour avoir des nombres flottants en précision arbitraire et la surcharge des opérateurs. Précision historique : j'ai créé QuickJS au début afin d'avoir une calculatrice avec une syntaxe compatible JavaScript. L'idée était de pouvoir manipuler des entiers ou des nombres flottants en précision arbitraire, des polynômes ou des matrices tout en utilisant une syntaxe familière. D'où des extensions au langage JavaScript présentes dans QuickJS. Mais ces extensions étaient compliquées et source de bugs, donc j'ai décidé de les supprimer. La calculatrice est maintenant un projet à part.
  • L'implémentation des BigInt se reposait sur la librairie libbf que j'ai supprimée avec les extensions non standardisées. Il y a donc une nouvelle implémentation des BigInt, plus rapide et plus simple.
  • La réimplémentation des "weak references" avec le support de fonctions présentes dans ES2023. QuickJS-NG les supportait déjà mais avec une implémentation qui utilise plus de mémoire, est moins efficace et surtout potentiellement incorrecte en présence de cycles.
  • La concaténation de petites chaînes de caractères est plus rapide grâce à l'utilisation de "ropes". Beaucoup de programmes fabriquent de longues chaînes de caractères en concaténant des petites chaînes de caractères avec une grosse s = ""; for(i=0;i<n;i++) s += "a". C'est une méthode déconseillée car inefficace, mais les moteurs JavaScript comme V8, SpiderMonkey ou JavaScriptCore l'optimisent donc elle est très utilisée.
  • Ajout des numéros de colonne dans les erreurs. QuickJS-NG le faisait déjà mais la méthode ne me convenait pas. Celle utilisée dans QuickJS est plus simple et (normalement) plus précise.
  • Les nombres flottants sont maintenant analysés et convertis en chaînes de caractères sans utiliser la librairie C. Cela est nécessaire pour être complètement compatible avec la norme JavaScript et accroître la portabilité du code.

Principaux changements de QuickJS-NG 0.10

  • Implémentation de Array.fromAsync
  • supporte os.Worker sur Windows
  • ajout du mode de build parserless
  • ajout de os.exePath()
  • ajouts des hooks Promise
  • correction des Promise non gérés
  • nouvelle implémentation de BigInt par Fabrice Bellard (voir ci-dessus)
  • et divers…

Sous-projets

QuickJS héberge des bibliothèque C qu'on peut utiliser pour d'autres projets :

  • libregexp : une bibliothèque Regexp petite et rapide, totalement conforme aux spécifications Javascript ES2023.
  • libunicode : une petite bibliothèque Unicode supportant les conversions de casse, la normalisation unicode, les requêtes unicode scriptées, les requêtes unicode de catégorie générale et toutes les propriétés unicode binaires.
  • dtoa : une petite bibliothèque pour l'impression et l'analyse syntaxique en float64.

Téléchargements

Les binaires sont dispos avec jsvu (JavaScript Version Updater, de Google) ou esvu (ECMAScript Version Updater, projet communautaire), ainsi qu'en téléchargement depuis les sites respectifs. Fabrice Bellard a aussi préparé des binaires QuickJS construits avec la Libc Cosmopolitan pour Linux, Mac, Windows, FreeBSD, OpenBSD, NetBSD tant sur les architectures ARM64 que x86_64.

Commentaires : voir le flux Atom ouvrir dans le navigateur

  •