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

Posté par  . Édité par palm123, Benoît Sibaud et cli345. Modéré par Benoît Sibaud. Licence CC By‑SA.
12
16
mai
2025
JavaScript

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.

Aller plus loin

  • # la calculatrice est NumCalc

    Posté par  . Évalué à 2 (+0/-0).

    Suite à une question, Fabrice Bellard m'envoie une précision que je voulais ajouter à la dépêche : il a enlevé la calculatrice, et pour l'instant son projet NumCalc n'est pas encore indépendant de QuickJS. Mais c'est le but. Pour l'instant la nouvelle calculatrice (bfcalc) n'est disponible qu'en ligne de commande.

  • # Dépêche top pour projet top !

    Posté par  . Évalué à 2 (+0/-0).

    Je n'avais pas suivi quickjs(ng), ses libs proposées, ni cosmopolitan libc, merci beaucoup pour ce coup de projecteur !

    Me venait une interrogation sur les performances, je vois qu'il y a un benchmark => en moyenne, c'est le meilleur de tous les moteurs JS testés, hors V8+JIT… qui pour le coup booste d'un facteur 36 !

    Mais ça date de 2019, du neuf ?

  • # Les défauts de JS (en fait IEEE754)

    Posté par  . Évalué à 2 (+0/-0).

    Sur http://numcalc.com :

      > 2-1.1
      0.8999999999999999999999999999999999
      > 2.0-1.1
      0.8999999999999999999999999999999999
      > 2-11/10
      9/10
    

    Oui, donc, ça fait les fractions, mais les décimaux non. Allez, c'est pas mal :)

Envoyer un commentaire

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.