JavaScript n'a jamais été destiné à devenir ce qu'il est aujourd'hui. En 1995, Brendan Eich, chez Netscape, a conçu un prototype en dix jours. Dix jours. C'est à peine assez pour écrire une spécification décente, et encore moins pour concevoir un langage de programmation destiné à alimenter des milliards d'appareils. Le résultat fut un langage parsemé de bizarreries sur lesquelles les développeurs trébuchent encore près de trois décennies plus tard. Pourtant, cette même création précipitée est devenue le runtime le plus largement déployé de l'histoire du logiciel. Il n'a pas gagné parce qu'il était élégant, mais parce qu'il a été intégré au navigateur au moment précis où le web en avait besoin.

Né dans la précipitation

Les guerres des navigateurs du milieu des années quatre-vingt-dix n'étaient pas une compétition amicale. Netscape avait besoin d'un langage de script léger capable de s'exécuter aux côtés de Java dans son navigateur Navigator. Eich avait pour mission de construire quelque chose qui ressemble suffisamment à Java pour apaiser les dirigeants, mais qui soit assez simple pour que des non-programmeurs puissent le copier-coller dans des pages web. L'échéance était absurde. Il produisit Mocha, bientôt renommé LiveScript, puis finalement JavaScript, dans une stratégie marketing visant à profiter de la popularité de Java.

Cette naissance précipitée a laissé des cicatrices permanentes. La coercition de type déroute encore les nouveaux venus lorsque l'opérateur plus concatène des chaînes de caractères et des nombres sans avertissement. typeof null renvoie "object" à cause d'un bug dans l'implémentation originale que personne n'ose corriger de peur de casser le web. L'insertion automatique de points-virgules provoque des échecs silencieux. Les variables déclarées avec var fuient leur portée de manière imprévisible. Il ne s'agit pas de défauts de conception abstraits. Ce sont des frustrations quotidiennes qui remontent directement à un sprint de deux semaines en mai 1995.

Une étrange ascendance

Observez attentivement JavaScript et vous verrez trois lignées distinctes entrelacées. La syntaxe emprunte énormément à Java. Les accolades, les instructions if et les boucles for offrent une forme familière à quiconque vient de langages de style C. Mais sous cette surface, le comportement est totalement différent.

Le véritable cœur computationnel du langage provient de Scheme, un dialecte de Lisp. C'est de là que JavaScript tire ses fonctions de première classe, ce qui signifie que les fonctions peuvent être passées en arguments, retournées par d'autres fonctions et assignées à des variables. Cela nous a également donné les closures, qui permettent à une fonction interne d'accéder à la portée d'une fonction externe, même après que cette dernière a fini de s'exécuter. Si vous avez déjà écrit un callback ou attaché un écouteur d'événements, vous avez utilisé un ADN hérité de Scheme.

Il y a ensuite le modèle d'objet, qui provient de Self. Au lieu d'une héritage classique avec des classes rigides, JavaScript utilise des prototypes. Un objet peut être lié directement à un autre objet et déléguer la recherche de propriétés vers le haut. Vous pouvez créer un objet avec Object.create et construire des chaînes sans jamais définir de classe. Le JavaScript moderne a ajouté le mot-clé class, mais il s'agit principalement de sucre syntaxique par-dessus ce mécanisme de prototypes sous-jacent.

De la décoration de page à l'outil sérieux

Pendant ses premières années, JavaScript ne s'occupait que de petites tâches. Il validait les entrées de formulaires avant qu'une soumission n'atteigne le serveur. Il changeait des images au survol de la souris. C'était un jouet, pas un outil. Les implémentations des navigateurs étaient incohérentes, de sorte que les développeurs écrivaient souvent des chemins de code différents pour Netscape et Internet Explorer.

La standardisation via ECMAScript a changé cette trajectoire. La spécification a donné aux éditeurs de navigateurs une cible commune à implémenter, ce qui a progressivement éliminé les pires incompatibilités. Puis est arrivé Ajax.

Ajax, abréviation de Asynchronous JavaScript and XML, n'était pas une nouvelle technologie unique, mais un modèle combinant des éléments existants. L'ingrédient critique était l'objet XMLHttpRequest, qui permettait au navigateur de demander des données au serveur en arrière-plan sans recharger la page entière. Lorsque Google a lancé Maps en 2005 et Gmail en 2004, les utilisateurs ont soudainement expérimenté une réactivité comparable à celle d'un logiciel de bureau à l'intérieur d'un onglet de navigateur. Les pages web sont devenues des applications. JavaScript n'était plus une simple garniture. C'était le plat principal.

Vitesse et ambition

La performance brute était autrefois la plus grande plaisanterie de JavaScript. Les premiers interprètes étaient lents. Puis Google a publié le moteur V8 en 2008 aux côtés de Chrome, et la plaisanterie a cessé d'être drôle. V8 a introduit la compilation juste-à-temps (JIT), traduisant le JavaScript en code machine lors de l'exécution au lieu de l'interpréter ligne par ligne. Il a introduit les classes cachées et la mise en cache en ligne pour rendre l'accès aux propriétés rapide, même sur des objets dynamiques. Les autres navigateurs ont réagi avec leurs propres moteurs à haute vitesse, et le langage est soudainement devenu assez rapide pour du calcul réel.

Cette vitesse a permis le changement suivant. Ryan Dahl a publié Node.js en 2009, en extrayant V8 du navigateur pour l'envelopper dans un modèle d'entrées-sorties non bloquant et piloté par les événements. Les serveurs web créaient auparavant un nouveau thread pour chaque requête entrante, ce qui entraînait un effondrement en cas de forte concurrence. Node.js gérait des dizaines de milliers de connexions simultanées sur un seul thread en utilisant une boucle d'événements et des callbacks asynchrones. JavaScript s'est étendu du client vers le serveur, dans les outils de build, et finalement dans tout le reste.

Le langage omniprésent

Aujourd'hui, JavaScript s'exécute dans des endroits que son créateur n'aurait jamais imaginés.

Côté frontend, React et Vue façonnent la manière dont les interfaces modernes sont construites. Les composants se mettent à jour en réponse aux changements d'état sans que le navigateur n'ait à effectuer de coûteux rechargements complets de la page. Côté backend, Node.js alimente les API et les services en temps réel, tandis que des environnements d'exécution plus récents comme Bun expérimentent une gestion de paquets plus rapide et un bundling intégré.

React Native traduit le code JavaScript en vues de plateforme natives, permettant aux équipes de déployer des applications mobiles pour iOS et Android sans avoir à maintenir deux bases de code entièrement distinctes en Swift et Kotlin. Electron enveloppe les technologies web dans une coquille Chromium pour créer des logiciels de bureau, ce qui est la méthode utilisée par Slack et Visual Studio Code pour arriver sur votre ordinateur. Le langage se trouve même au sein des fonctions cloud et des workers d'edge computing, exécutant de la logique à quelques millisecondes de l'utilisateur final à travers des réseaux distribués.

Le paradoxe de l'abondance

L'omniprésence a un coût. L'écosystème est énorme, et cette taille engendre de l'anxiété. Un nouvel outil de build apparaît avant même que vous n'ayez fini de configurer le précédent. Les frameworks voient leur popularité fluctuer selon des cycles qui semblent saisonniers. Vous pouvez résoudre presque n'importe quel problème sans quitter l'univers JavaScript, mais vous devez d'abord choisir entre une douzaine de solutions très marquées. Les arbres de dépendances deviennent profonds et fragiles. Un paquet servant à ajouter du remplissage à gauche dans des tableaux peut briser des milliers de projets en aval lorsqu'il disparaît du registre.

Rien de tout cela n'est accidentel. JavaScript est désordonné parce que le web est désordonné. C'est un mille-feuille organique de rétrocompatibilité, de standards précipités et d'intérêts d'implémentation divergents. Pourtant, ce désordre même est la raison pour laquelle le langage est puissant. Le web est partout, et comme JavaScript réside par défaut dans chaque navigateur, c'est ce qui se rapproche le plus d'un runtime universel.

Il a cessé d'être un simple langage de script il y a bien longtemps. JavaScript est désormais une plateforme logicielle mondiale, construite en dix jours, maintenue par le contrat invisible selon lequel le web ne doit pas briser ce qui existait auparavant. Apprenez à connaître ses cicatrices en même temps que ses forces, et vous apprendrez l'histoire même de l'internet moderne.