Aller au contenu

Langages informatiques : histoire, inventeurs et usages

Langages informatiques : histoire, inventeurs et usages

Section intitulée « Langages informatiques : histoire, inventeurs et usages »

Un ordinateur ne comprend qu’une suite de nombres. Un langage de programmation est une convention qui permet à un humain d’exprimer ce qu’il veut en mots et en symboles, qu’un programme traduit ensuite en instructions pour la machine. On en compte plusieurs milliers ; quelques dizaines font tourner l’essentiel du monde numérique, et plusieurs d’entre eux ont été conçus avant la naissance de la plupart de ceux qui les maintiennent aujourd’hui. Cette page en retrace l’histoire, présente leurs inventeurs et indique à quoi chacun sert encore, avec un détour par ce que le choix d’un langage change pour la sécurité.

→ Lire l’explication complète de la marmotte

Avant les langages. En 1843, Ada Lovelace publie, dans ses notes sur la machine analytique de Charles Babbage, une méthode pas à pas pour calculer les nombres de Bernoulli, souvent présentée comme le premier programme. Un siècle plus tard, les premiers ordinateurs électroniques se programment en langage machine, directement en nombres, puis en assembleur, où chaque instruction reçoit un nom court. C’est rapide pour la machine et pénible pour tout le monde.

Les premiers langages de haut niveau (années 1950). L’idée qu’un programme, le compilateur, puisse traduire une écriture proche des mathématiques ou de l’anglais en langage machine s’impose avec Fortran (1957) pour le calcul scientifique et COBOL (1959) pour la gestion. Grace Hopper, qui avait réalisé l’un des premiers compilateurs, défend alors l’idée scandaleuse qu’un programme puisse s’écrire avec des mots plutôt qu’avec des codes.

La structuration (années 1960 et 1970). ALGOL, Pascal puis C introduisent les blocs, les fonctions et les structures de contrôle qui organisent le code lisiblement. C, conçu pour écrire le système Unix, devient le langage des systèmes d’exploitation, ce qu’il est toujours.

Les objets (années 1980 et 1990). Smalltalk, C++ puis Java organisent les programmes autour d’objets qui regroupent données et comportements. Le Web naissant fait exploser les langages de script, plus souples et interprétés à la volée : Perl, Python, PHP, JavaScript, Ruby.

La sûreté et la productivité (années 2000 à aujourd’hui). Les nouveaux langages, Go, Rust, Kotlin, Swift, TypeScript, cherchent à éviter des classes entières d’erreurs dès l’écriture, à commencer par les erreurs de gestion de la mémoire, tout en restant agréables à utiliser.

AnnéeLangageInventeursUsage aujourd’hui
1957FortranJohn Backus et son équipe (IBM)Calcul scientifique, météorologie, simulation physique
1958LispJohn McCarthy (MIT)Recherche, extension d’éditeurs (Emacs), dialectes comme Clojure
1959COBOLComité CODASYL (Conference on Data Systems Languages), sur les idées de Grace HopperBanques, assurances, administrations, systèmes centraux (mainframes)
1960ALGOL 60Comité international (dont John Backus et Peter Naur)Plus guère utilisé, mais ancêtre de Pascal, C et de la plupart des langages modernes
1964BASIC (Beginner’s All-purpose Symbolic Instruction Code)John Kemeny et Thomas Kurtz (Dartmouth College)Enseignement historique ; descendants comme Visual Basic pour l’automatisation bureautique
1970PascalNiklaus Wirth (ETH, École polytechnique fédérale de Zurich)Enseignement ; descendant Delphi pour certaines applications de gestion
1972CDennis Ritchie (Bell Labs)Systèmes d’exploitation, noyaux, embarqué, bibliothèques de base
1972SmalltalkAlan Kay et l’équipe du Xerox PARC (Palo Alto Research Center)Recherche, enseignement ; a inspiré la programmation objet et les interfaces graphiques
1972PrologAlain Colmerauer et Philippe Roussel (Marseille)Logique, systèmes experts, recherche en intelligence artificielle symbolique
1974SQLDonald Chamberlin et Raymond Boyce (IBM)Interrogation de toutes les bases de données relationnelles
1979Shell BourneStephen Bourne (Bell Labs)Scripts d’administration Unix ; son successeur Bash (Brian Fox, 1989) est partout
1983AdaJean Ichbiah et son équipe (CII Honeywell Bull, ex-Compagnie internationale pour l’informatique)Aéronautique, ferroviaire, défense, logiciels critiques
1985C++Bjarne Stroustrup (Bell Labs)Jeux vidéo, navigateurs, finance, logiciels exigeant des performances
1987PerlLarry WallTraitement de texte, scripts d’administration, en recul
1990HaskellComité de chercheursProgrammation fonctionnelle, recherche, finance, compilateurs
1991PythonGuido van RossumScience des données, intelligence artificielle, automatisation, Web, scripts de sécurité
1993LuaRoberto Ierusalimschy, Luiz Henrique de Figueiredo, Waldemar Celes (PUC-Rio)Scripts embarqués dans les jeux et les applications
1995JavaJames Gosling (Sun Microsystems)Applications d’entreprise, serveurs, historiquement Android
1995JavaScriptBrendan Eich (Netscape)Tout le Web côté navigateur, serveurs avec Node.js
1995PHPRasmus LerdorfSites Web, WordPress et la plupart des gestionnaires de contenu
1995RubyYukihiro MatsumotoApplications Web avec le cadriciel Ruby on Rails
1996OCamlXavier Leroy et l’équipe de l’InriaCompilateurs, outils de preuve, finance
2000C#Anders Hejlsberg (Microsoft)Applications Windows et .NET, jeux vidéo avec Unity
2009GoRobert Griesemer, Rob Pike, Ken Thompson (Google)Services réseau, outils d’infrastructure (Docker, Kubernetes)
2011KotlinJetBrainsApplications Android, serveurs
2012TypeScriptMicrosoft (Anders Hejlsberg)Applications Web de grande taille, JavaScript typé
2014SwiftChris Lattner et l’équipe d’AppleApplications iPhone, iPad et Mac
2015Rust (version 1.0)Graydon Hoare, puis Mozilla et la communautéLogiciels système sûrs, navigateurs, outils, morceaux de noyaux

Quelques précisions de dates s’imposent, l’histoire des langages étant fertile en querelles d’anniversaire. C++ est commencé en 1979 sous le nom de « C with Classes » et commercialisé en 1985. Rust naît en 2006 comme projet personnel avant sa version stable de 2015. JavaScript est écrit en une dizaine de jours en 1995, ce qui explique certaines choses et en excuse peu.

Un langage naît presque toujours d’une frustration précise. John Backus voulait éviter aux scientifiques d’IBM de programmer en assembleur. Grace Hopper voulait que les programmes de gestion se lisent comme des phrases. Dennis Ritchie et Ken Thompson avaient besoin d’un langage pour réécrire Unix, et Ken Thompson récidive quarante ans plus tard avec Go. Niklaus Wirth voulait un langage pour enseigner proprement. Bjarne Stroustrup voulait les objets de Simula avec la vitesse de C. Guido van Rossum voulait un langage de script lisible, et l’a commencé pendant les vacances de Noël 1989. Brendan Eich devait livrer un langage pour le navigateur de Netscape dans un délai absurde. Graydon Hoare voulait un langage système qui ne plante pas à cause de la mémoire, motivé, selon le récit qu’il en fait, par un ascenseur en panne.

La France tient une place honorable dans cette histoire : Alain Colmerauer crée Prolog à Marseille, Jean Ichbiah dirige la conception d’Ada, retenu par le département de la Défense américain, et l’Inria développe Caml puis OCaml, ainsi que l’assistant de preuve Coq, aujourd’hui Rocq.

Il n’existe pas de meilleur langage, seulement des langages adaptés à un contexte :

  • Systèmes, noyaux, embarqué : C, C++, de plus en plus Rust. La performance et le contrôle de la mémoire priment.
  • Logiciels critiques (avions, trains, centrales) : Ada, C contraint par des règles strictes comme MISRA C (règles de la Motor Industry Software Reliability Association), et des outils de preuve formelle.
  • Web côté navigateur : JavaScript, ou TypeScript qui s’y traduit. Il n’y a pas vraiment d’alternative, sauf WebAssembly pour certains calculs.
  • Web côté serveur : PHP, Python, JavaScript, Java, C#, Go, Ruby, selon l’équipe et l’existant.
  • Données et intelligence artificielle : Python, très largement, avec des bibliothèques écrites en C, C++ ou Rust pour la vitesse.
  • Applications mobiles : Kotlin pour Android, Swift pour iOS.
  • Gestion et finance historiques : COBOL sur les systèmes centraux, Java dans les systèmes plus récents.
  • Bases de données : SQL, depuis cinquante ans, sans concurrent sérieux.
  • Administration et automatisation : Bash, PowerShell, Python.
  • Sécurité offensive et défensive : Python pour l’outillage et l’automatisation, C et l’assembleur pour comprendre les exploits, Go et Rust pour des outils rapides et faciles à distribuer.

Le choix d’un langage n’est pas neutre pour la sécurité. C et C++ laissent au programmeur la gestion de la mémoire : un oubli suffit à créer un débordement de tampon, une utilisation après libération ou une double libération, autant de failles exploitables pour exécuter du code. Microsoft a indiqué en 2019 qu’environ 70 % des vulnérabilités corrigées dans ses produits relevaient de la sûreté mémoire, et l’équipe de Chromium donne un ordre de grandeur comparable pour ses failles graves. Le fonctionnement de ces erreurs est détaillé dans Comment un buffer overflow écrase la pile.

Les langages sûrs pour la mémoire (Rust, Go, Java, C#, Python, Swift…) éliminent la plupart de ces erreurs par construction. Les agences de sécurité ont pris position : la NSA a recommandé en 2022 de privilégier ces langages, et la CISA a appelé en 2023 les éditeurs à publier une feuille de route de migration. Le noyau Linux accepte du code Rust depuis la version 6.1 (2022), et Google a constaté sur Android une forte baisse de la part des vulnérabilités mémoire à mesure que le nouveau code était écrit dans des langages sûrs.

Aucun langage ne protège pour autant des erreurs de logique, des injections ou d’une mauvaise gestion des secrets : une injection SQL s’écrit aussi bien en Rust qu’en PHP. Le langage réduit la surface d’erreur ; il ne remplace ni la revue de code ni les tests, abordés dans Comment revoir le code de sécurité au-delà du linter.

Choisir un langage par habitude, sans tenir compte de ses propriétés de sécurité, conduit à écrire en C ou en C++ des composants exposés à Internet qui n’avaient aucun besoin de gérer la mémoire à la main, et à hériter des classes de failles qui vont avec. À l’inverse, ignorer l’âge et l’inventaire des langages déjà en service laisse des applications COBOL, des scripts Perl ou des bibliothèques C non maintenues au cœur des systèmes critiques, sans personne pour les relire. Les compétences disparaissent avant le code, et la première faille découverte dans un composant que plus personne ne sait compiler se corrige alors dans l’urgence, si elle se corrige.

Un ordinateur ne comprend que des nombres. Pour lui donner des ordres sans écrire des pages de chiffres, on a inventé des langages de programmation : des façons d’écrire des instructions avec des mots et des symboles, qu’un logiciel traduit ensuite pour la machine. Le premier grand langage, Fortran, date de 1957. Depuis, des milliers d’autres ont été créés, chacun par une personne ou une petite équipe qui avait un problème précis à résoudre.

Chaque langage a sa spécialité : SQL pour interroger les bases de données, JavaScript pour faire fonctionner les pages Web, Python pour l’intelligence artificielle et les calculs, Swift et Kotlin pour les applications de téléphone, C pour les systèmes d’exploitation. Beaucoup de vieux langages servent encore, par exemple COBOL dans les banques, parce que les programmes écrits il y a cinquante ans fonctionnent toujours.

Certains langages anciens laissent le programmeur gérer lui-même la mémoire de l’ordinateur, et une petite erreur peut alors devenir une faille de sécurité. Les langages plus récents comme Rust évitent automatiquement une grande partie de ces erreurs, ce qui explique pourquoi les spécialistes de la sécurité recommandent de les utiliser pour les nouveaux logiciels.

À lire aussi

Pages voisines

: les deux pages se citent l’une l’autre.