IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Pourquoi je suis sceptique quant à la réécriture des outils JavaScript dans des langages "plus rapides"


Sujet :

JavaScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Inscrit en
    Mars 2025
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mars 2025
    Messages : 1
    Par défaut Pourquoi je suis sceptique quant à la réécriture des outils JavaScript dans des langages "plus rapides"
    Pourquoi je suis sceptique quant à la réécriture des outils JavaScript dans des langages "plus rapides", par Nolan Lawson

    J'ai écrit beaucoup de JavaScript. J'aime JavaScript. Et plus important encore, j'ai acquis un ensemble de compétences en matière de compréhension, d'optimisation et de débogage de JavaScript que je suis réticent à abandonner.

    Il est donc normal que j'éprouve une certaine inquiétude face à la manie actuelle de réécrire tous les outils Node.js dans un langage "plus rapide" comme Rust, Zig, Go, etc. Ne vous méprenez pas, ces langages sont cool ! (J'ai une copie du livre Rust sur mon bureau en ce moment même, et j'ai même contribué un peu à Servo pour le plaisir). Mais en fin de compte, j'ai investi une grande partie de ma carrière dans l'apprentissage des tenants et aboutissants de JavaScript, et c'est de loin le langage avec lequel je suis le plus à l'aise.

    Je reconnais donc mon parti pris (et peut-être mon surinvestissement dans un ensemble de compétences). Mais plus j'y réfléchis, plus j'ai le sentiment que mon scepticisme est également justifié par des préoccupations objectives, que j'aimerais aborder dans ce billet.

    La performance

    L'une des raisons de mon scepticisme est que je ne pense pas que nous ayons épuisé toutes les possibilités de rendre les outils JavaScript plus rapides. Marvin Hagemeister a fait un excellent travail pour le démontrer, en montrant combien il y a de fruits à portée de main dans ESLint, Tailwind, etc.

    Dans le monde des navigateurs, JavaScript a prouvé qu'il était "suffisamment rapide" pour la plupart des charges de travail. Bien sûr, WebAssembly existe, mais je pense qu'il est juste de dire qu'il est principalement utilisé pour des niches, des tâches intensives en CPU plutôt que pour la construction d'un site web entier. Alors pourquoi les outils CLI basés sur JavaScript s'empressent-ils de se débarrasser de JavaScript ?


    La grande réécriture

    Je pense que l'écart de performance est dû à plusieurs facteurs. Pendant longtemps, l'écosystème des outils JavaScript s'est concentré sur la construction de quelque chose qui fonctionne, et non sur quelque chose de rapide. Aujourd'hui, nous avons atteint un point de saturation où la surface de l'API est pratiquement réglée et où tout le monde veut "la même chose, mais plus vite". D'où l'explosion de nouveaux outils qui remplacent presque directement les outils existants : Rolldown pour Rollup, Oxlint pour ESLint, Biome pour Prettier, etc.

    Cependant, ces outils ne sont pas nécessairement plus rapides parce qu'ils utilisent un langage plus rapide. Ils peuvent simplement être plus rapides parce que 1) ils sont écrits en tenant compte des performances, et 2) la surface de l'API est déjà établie, de sorte que les auteurs n'ont pas besoin de passer du temps de développement à peaufiner la conception générale. Vous n'avez même pas besoin d'écrire des tests ! Il suffit d'utiliser la suite de tests existante de l'outil précédent.

    Au cours de ma carrière, j'ai souvent vu une réécriture de A vers B entraînant une augmentation de la vitesse, suivie de l'affirmation triomphante que B est plus rapide que A. Cependant, comme le souligne Ryan Carniato, une réécriture est souvent plus rapide simplement parce qu'il s'agit d'une réécriture - vous en savez plus la deuxième fois, vous accordez plus d'attention aux performances, etc.


    Bytecode et JIT

    La deuxième catégorie d'écarts de performance provient des choses que les navigateurs nous offrent gratuitement et auxquelles nous pensons rarement : le cache du bytecode et le compilateur JIT (Just-In-Time).

    Lorsque vous chargez un site web pour la deuxième ou troisième fois, si le JavaScript est correctement mis en cache, le navigateur n'a plus besoin d'analyser et de compiler le code source en bytecode. Il charge simplement le bytecode directement à partir du disque. C'est le cache de bytecode en action.

    En outre, si une fonction est "chaude" (fréquemment exécutée), elle sera encore optimisée en code machine. C'est le JIT en action.

    Dans le monde des scripts Node.js, nous ne bénéficions pas du tout des avantages du cache bytecode. Chaque fois que vous exécutez un script Node, l'ensemble du script doit être analysé et compilé à partir de zéro. C'est l'une des principales raisons pour lesquelles les outils JavaScript et les outils non-JavaScript gagnent en performance.

    Grâce à l'inimitable Joyee Cheung, Node dispose désormais d'un cache de compilation. Vous pouvez définir une variable d'environnement et obtenir immédiatement des chargements de scripts Node.js plus rapides :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    export NODE_COMPILE_CACHE=~/.cache/nodejs-compile-cache


    Je l'ai mis dans mon ~/.bashrc sur toutes mes machines de développement. J'espère que cela fera un jour partie des paramètres par défaut de Node.

    Quant à JIT, c'est une autre chose dont (malheureusement) la plupart des scripts Node ne peuvent pas vraiment bénéficier. Vous devez exécuter une fonction avant qu'elle ne devienne « chaude », donc du côté serveur, il est plus probable qu'elle soit utilisée pour des serveurs de longue durée que pour des scripts ponctuels.

    Et le JIT peut faire une grande différence ! Dans Pinafore, j'ai envisagé de remplacer la bibliothèque blurhash basée sur JavaScript par une version Rust (Wasm), avant de réaliser que la différence de performance était effacée au moment où nous arrivions à la cinquième itération. C'est la puissance du JIT.

    Peut-être qu'un jour un outil comme Porffor pourrait être utilisé pour faire une compilation AOT (Ahead-Of-Time) des scripts Node. En attendant, le JIT reste un cas où les langages natifs ont une longueur d'avance sur JavaScript.

    Je dois également reconnaître que l'utilisation de Wasm a un impact sur la performance par rapport aux outils purement natifs. Cela pourrait donc être une autre raison pour laquelle les outils natifs prennent d'assaut le monde CLI, mais pas nécessairement le frontend du navigateur.


    Contributions et débogage

    J'y ai fait allusion plus tôt, mais c'est la principale source de mon scepticisme à l'égard du mouvement "tout réécrire en natif".

    JavaScript est, à mon avis, un langage de classe ouvrière. Il pardonne beaucoup les types (c'est l'une des raisons pour lesquelles je ne suis pas un grand fan de TypeScript), il est facile à prendre en main (comparé à quelque chose comme Rust), et comme il est supporté par les navigateurs, il y a un grand nombre de personnes qui le maîtrisent.

    Pendant des années, les auteurs et les utilisateurs de bibliothèques de l'écosystème JavaScript ont largement utilisé JavaScript. Je pense que nous tenons pour acquis ce que cela permet.

    Tout d'abord, le chemin vers la contribution est beaucoup plus facile. Pour citer Matteo Collina :

    La plupart des développeurs ignorent qu'ils ont les compétences nécessaires pour déboguer, corriger et modifier leurs dépendances. Elles ne sont pas maintenues par des demi-dieux inconnus, mais par des collègues développeurs.
    Cela ne fonctionne plus si les auteurs de bibliothèques JavaScript utilisent des langages différents (et plus difficiles !) que JavaScript. Ils pourraient tout aussi bien être des demi-dieux !

    Autre chose : il est facile de modifier localement les dépendances JavaScript. J'ai souvent modifié quelque chose dans mon dossier node_modules local lorsque j'essayais de trouver un bogue ou de travailler sur une fonctionnalité dans une bibliothèque dont je dépendais. En revanche, si la bibliothèque est écrite dans un langage natif, je dois consulter le code source et le compiler moi-même, ce qui constitue une importante barrière à l'entrée.

    (Pour être honnête, cela est déjà devenu un peu difficile grâce à l'utilisation répandue de TypeScript. Mais TypeScript n'est pas très éloigné du code source JavaScript, et vous seriez surpris de voir jusqu'où vous pouvez aller en cliquant sur "pretty print" dans les DevTools. Heureusement, la plupart des bibliothèques Node ne sont pas minifiées non plus).

    Bien sûr, cela nous ramène à la débogabilité. Si je veux déboguer une bibliothèque JavaScript, je peux simplement utiliser les DevTools du navigateur ou un débogueur Node.js que je connais déjà. Je peux définir des points d'arrêt, inspecter des variables et raisonner sur le code comme je le ferais pour mon propre code. Ce n'est pas impossible avec Wasm, mais cela demande des compétences différentes.


    Conclusion

    Je pense qu'il est formidable qu'il y ait une nouvelle génération d'outils pour l'écosystème JavaScript. J'ai hâte de voir où aboutiront des projets comme Oxc et VoidZero. Les titulaires actuels sont en effet excessivement lents et bénéficieraient probablement de la concurrence. (Je suis particulièrement agacé par le cycle typique eslint + prettier + tsc + rollup lint+build).

    Cela dit, je ne pense pas que JavaScript soit intrinsèquement lent, ou que nous ayons épuisé toutes les possibilités de l'améliorer. Parfois, je regarde un JavaScript vraiment axé sur la performance, comme les récentes améliorations apportées aux DevTools de Chromium qui utilisent des techniques époustouflantes telles que l'utilisation de Uint8Arrays comme vecteurs de bits, et j'ai l'impression que nous avons à peine effleuré la surface. (Si vous voulez vraiment un complexe d'infériorité, voyez les autres commits de Seth Brenith. C'est de la folie).

    Je pense également qu'en tant que communauté, nous n'avons pas vraiment réfléchi à ce à quoi ressemblerait le monde si nous reléguions l'outillage JavaScript à une élite de développeurs Rust et Zig. Je peux imaginer que le développeur JavaScript moyen se sente complètement désespéré chaque fois qu'il y a un bug dans l'un de ses outils de construction. Plutôt que de donner à la prochaine génération de développeurs web les moyens d'aller plus loin, nous risquons de les former à une carrière d'impuissance apprise. Imaginez ce que ressentira le développeur junior moyen lorsqu'il sera confronté à un défaut de ségrégation plutôt qu'à une erreur JavaScript familière.

    À ce stade, je suis un senior dans ma carrière, et j'ai donc peu d'excuses pour m'accrocher à ma couverture de sécurité JavaScript. Cela fait partie de mon travail de creuser quelques couches plus profondes et de comprendre comment chaque partie de la pile fonctionne.

    Cependant, je ne peux m'empêcher de penser que nous nous engageons sur une voie inconnue aux conséquences inattendues, alors qu'il existe une autre voie moins périlleuse qui pourrait nous permettre d'obtenir pratiquement les mêmes résultats. Le train de marchandises actuel ne montre aucun signe de ralentissement, alors je suppose que nous le découvrirons quand nous y arriverons.

    Source : Why I’m skeptical of rewriting JavaScript tools in “faster” languages

    Et vous ?

    Pensez-vous que ces affirmations sont crédibles ou pertinentes ?
    Quel est votre avis sur le sujet ?

    Voir aussi :

    Chaîne de prototypes JavaScript : Guide court et simple, par Mensur Durakovic

    « L'utilisation incessante de frameworks JavaScript de pointe a contribué à rendre le Web moins accessible », d'après Easy Laptop Finder, selon lequel ces derniers détruisent les performances des sites Web

    Comment mettre à l'échelle les applications Node.js, par Mensur Durakovic

  2. #2
    Membre éclairé
    Femme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    278
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Italie

    Informations forums :
    Inscription : Juillet 2012
    Messages : 278
    Par défaut
    JS "c'est de loin le langage avec lequel je suis le plus à l'aise"...

  3. #3
    Membre éprouvé
    Homme Profil pro
    Développeur
    Inscrit en
    Août 2003
    Messages
    1 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Août 2003
    Messages : 1 482
    Par défaut
    Pour le web il n'y a pas le choix sauf dans certains cas à utiliser web assembly (gros traitements côté front.

    En langage backend, ça fonctionne, on fait des choses mais je le trouve moins adapté. Je trouve le gestionnaire de paquet npm ultra invasif au niveau systèmes et vu les actualités relativement fréquentes avec des paquets vérolés, je n'ai pas trop confiance (mais si les autres langages peuvent aussi être ciblés).
    Donc, autant faire du Go, Python, RUST, voire JAVA, ...

  4. #4
    Membre extrêmement actif Avatar de air-dex
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 706
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 1 706
    Par défaut
    Le problème de JavaScript est que c'est un langage puissant mais avec peu ou pas de gardes-fous. Comme il est facile à prendre en main, il est mis entre toutes les mains mais toutes les mains ne savent pas le maîtriser.

    JavaScript n'est pas un problème si on sait bien le cornaquer, notamment sur les types et les truthy/falsy. Un développeur consciencieux qui y arrive n'aura pas besoin de TypeScript ou de linters pour produire du code JavaScript de qualité.

    TypeScript a trouvé son public car son compilateur tsc va grogner sur beaucoup d'errements à la transpilation, notamment sur la gestion des types (d'où le nom du langage, enfin j'imagine), le tout en produisant un JS très proche du code TS initial. La force de TS est avant tout de prendre à son compte la charge mentale liée à la gestion des types. Mais ce n'est pas pour autant que la gestion des types est insurmontable en JS pur.

    Les linters ont leurs limites AMHA. Quand je vois un ESLint qui va râler parce que t'as un console.log() dans ton code en cours de dev ou parce que t'as mis 4 indentations au lieu de 2, tout en se fichant royalement de toutes les confusions entre truthy/falsy et true/false ou bien "check sur null ou undefined" qu'il peut y avoir partout ailleurs, je n'ai envie que d'une seule chose : le désactiver tant il ne sert à rien.

    Citation Envoyé par olikaf Voir le message
    Je ne sais pas si un langage qui pardonne beaucoup les types c'est une si bonne chose... :-)
    À l'inverse, l'un des reproches qui est fait à Java est qu'il est beaucoup trop impardonnable, alors qu'en plus c'est un ange à côté de C++ et sa const correctness des enfers (mais là je m'égare ).

    Un bon langage, ou plutôt un bon compilateur, sur ce point est quelque part entre les deux. Il ne te laisse pas mélanger les torchons et les serviettes à la compilation comme en JavaScript. Mais à l'inverse il ne va pas être excessivement strict sur des choses qui n'en valent pas la peine ("je te plante la compilation car tu me fournis un const const T au lieu d'un const T const connard !" ). Certains me parleront de l'inférence de types qui peut être une solution. Mais le défaut de l'inférence de types est que ce n'est pas ce qui se fait de mieux en matière de maintenance et de compréhension de code, surtout pour celui qui n'a pas un IDE ayant la gentillesse de lui indiquer le type implicite.

    Citation Envoyé par smarties Voir le message
    En langage backend, ça fonctionne, on fait des choses mais je le trouve moins adapté. Je trouve le gestionnaire de paquet npm ultra invasif au niveau systèmes et vu les actualités relativement fréquentes avec des paquets vérolés, je n'ai pas trop confiance (mais si les autres langages peuvent aussi être ciblés).
    Donc, autant faire du Go, Python, RUST, voire JAVA, ...
    Non car ici le problème n'est pas lié au langage mais aux outils utilisés par le projet. Le problème n'est pas JS mais le choix d'organiser le projet informatique autour d'un outil de projet avec un manifeste dans lequel t'inscriras des "dépendances", disponibles dans des "repositories" distants et que l'outil téléchargera, ainsi que les dépendances des dépendances, les dépendances des dépendances des dépendances...

    Ce n'est pas parce que tu passeras d'un projet NPM en JS à un projet Maven ou Gradle en Java que le problème disparaîtra. Java ne t'immunise pas des dépendances Maven vérolées ou avec des vulnérabilités critiques. Tout comme rien ne t'empêche de finir avec un tel crate dans ton projet Cargo en Rust. Idem avec PHP et Composer, Python et PIP, et caetera.

  5. #5
    Membre averti
    Inscrit en
    Mars 2008
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 19
    Par défaut
    Je ne sais pas si un langage qui pardonne beaucoup les types c'est une si bonne chose... :-)

Discussions similaires

  1. Réponses: 6
    Dernier message: 15/09/2021, 17h31
  2. Réponses: 2
    Dernier message: 06/09/2018, 14h17
  3. Réponses: 5
    Dernier message: 21/08/2013, 12h50
  4. Permuter des valeurs, le plus rapidement possible?
    Par danje dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 27/09/2005, 21h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo