Au milieu des années 1950, les ordinateurs excellent déjà dans le calcul numérique. Ils résolvent des équations, produisent des tables et exécutent des suites d’opérations arithmétiques. John McCarthy veut leur confier une autre catégorie de travail : manipuler des idées représentées par des symboles, construire des raisonnements et traiter des expressions dont la taille n’est pas connue à l’avance.
Le langage Lisp naît de cette ambition. Au lieu de considérer un programme comme une suite d’instructions figées, il représente le code avec les mêmes structures que les données. Un programme peut alors examiner une expression, la transformer et en produire une nouvelle. Cette propriété influencera durablement la programmation fonctionnelle, les systèmes interactifs et la conception de nombreux langages.
McCarthy ne sépare pas cette recherche de la manière dont les ordinateurs sont utilisés. Il défend aussi le temps partagé, qui permet à plusieurs personnes de travailler simultanément avec une machine. Lisp et le temps partagé répondent au même objectif : faire de l’ordinateur un partenaire interactif pour explorer des problèmes, plutôt qu’une machine à laquelle on remet un calcul avant d’attendre son résultat.
Représenter le raisonnement plutôt que le calcul seul
John McCarthy naît en 1927 à Boston et grandit principalement à Los Angeles. Il étudie les mathématiques au California Institute of Technology, puis obtient en 1951 un doctorat à Princeton. Les fondements logiques des mathématiques occupent une place centrale dans sa formation.
Les premiers langages de haut niveau sont alors conçus surtout pour les nombres. FORTRAN, dirigé par John Backus chez IBM, permet aux scientifiques d’exprimer des formules sans programmer directement en langage machine. Cette avancée réduit considérablement le coût de la programmation scientifique, mais elle ne répond pas naturellement aux problèmes où les données sont des mots, des règles logiques, des preuves ou des arbres d’expressions.
McCarthy s’intéresse aux programmes capables de raisonner sur de telles représentations. En 1955, il participe à la proposition du projet d’été de Dartmouth et y introduit l’expression intelligence artificielle pour désigner un domaine de recherche. Le choix des mots porte une hypothèse : certains aspects de l’apprentissage et de l’intelligence peuvent être décrits avec assez de précision pour être simulés par une machine.
Pour tester cette hypothèse, il faut un langage qui traite les symboles aussi directement que FORTRAN traite les nombres.
Pourquoi les listes deviennent la structure centrale de Lisp
Un raisonnement peut être représenté comme une expression composée d’autres expressions. L’addition de deux nombres, par exemple, peut être décrite par une liste contenant l’opération puis ses arguments : (+ 2 3). Une règle logique peut prendre une forme similaire, mais contenir des symboles et des sous-listes plus profondes.
Lisp, dont le nom vient de list processing, fait de la liste sa structure fondamentale. Une liste peut contenir des nombres, des noms ou d’autres listes. Deux opérations simples suffisent à commencer son exploration : obtenir le premier élément et obtenir le reste. En combinant ces opérations, un programme peut parcourir une structure de taille arbitraire.
Cette organisation favorise la récursion. Une fonction traite un élément, puis s’appelle elle-même sur la partie restante jusqu’à atteindre un cas élémentaire. La récursion n’a pas été inventée par Lisp, mais le langage en fait une manière naturelle de décrire des calculs portant sur des structures emboîtées.
McCarthy expose les fondements du langage dans son article de 1960, Recursive Functions of Symbolic Expressions and Their Computation by Machine. Lisp y apparaît moins comme une collection de commandes que comme un petit système de règles capable d’exprimer un calcul général.
La notation parenthésée de Lisp surprend souvent au premier regard. Sa régularité apporte pourtant une propriété décisive : une expression de code est elle-même une liste. Le programme et les données qu’il manipule partagent donc une représentation commune.
Cette propriété, appelée homoiconicité, permet à un programme de recevoir du code comme donnée, de l’analyser et d’en construire une autre version. Les macros Lisp s’appuieront sur ce mécanisme pour étendre le langage sans modifier son compilateur à chaque nouveau besoin.
La frontière entre utilisateur et concepteur du langage devient moins rigide. Une équipe peut créer une notation adaptée à son domaine, puis la traduire vers les formes élémentaires de Lisp. Ce principe influence aujourd’hui les macros, les langages spécialisés et les outils qui transforment automatiquement du code.
Il faut toutefois distinguer l’idée initiale de sa mise en œuvre. McCarthy imagine d’abord une notation plus conventionnelle, fondée sur des « M-expressions ». Lorsque Steve Russell comprend que la fonction d’évaluation décrite par McCarthy peut être programmée, les S-expressions parenthésées deviennent directement exécutables. Une notation intermédiaire conçue pour représenter le langage finit ainsi par devenir sa syntaxe durable.
Automatiser une mémoire devenue dynamique
Les listes de Lisp sont créées et abandonnées pendant l’exécution. Demander au programmeur de libérer manuellement chacune d’elles rendrait le code complexe et fragile. Le système doit déterminer quelles zones de mémoire ne sont plus accessibles et peuvent être réutilisées.
Lisp introduit pour cela un mécanisme de ramasse-miettes, ou garbage collector. L’exécution repère les objets encore atteignables depuis le programme, puis récupère la mémoire occupée par les autres. Le programmeur raisonne sur la durée de vie logique des données sans gérer directement chaque allocation.
Cette automatisation a un coût : le ramasse-miettes consomme du temps et peut interrompre momentanément le programme. Elle échange un contrôle immédiat contre une réduction des erreurs de mémoire et une plus grande liberté dans la construction de structures dynamiques. Java, JavaScript, Python, Go et de nombreux autres langages adopteront ensuite différentes formes de gestion automatique.
L’héritage de Lisp ne tient donc pas à une seule syntaxe. Il réunit plusieurs choix qui se renforcent : structures récursives, fonctions manipulables, représentation du code comme donnée et mémoire automatique.
Un langage conçu par une communauté de chercheurs
Attribuer tout Lisp à McCarthy masquerait le travail collectif qui transforme les idées en système utilisable. Il définit les concepts centraux et la notation, mais Steve Russell programme le premier évaluateur. Daniel Edwards développe une première méthode de récupération automatique de mémoire. Timothy Hart et Michael Levin réalisent un compilateur Lisp précoce. De nombreux chercheurs font ensuite évoluer le langage au MIT et ailleurs.
Cette distinction éclaire le rôle d’un concepteur. McCarthy fournit un modèle suffisamment simple pour que d’autres puissent l’implémenter, le discuter et l’étendre. Lisp devient rapidement une famille plutôt qu’un produit unique : Lisp 1.5, Maclisp, Interlisp, Scheme, Common Lisp, Emacs Lisp et Clojure représentent des objectifs et des époques différents.
La diversité produit aussi de la fragmentation. Les programmes écrits pour un dialecte ne fonctionnent pas nécessairement dans un autre. La normalisation de Common Lisp dans les années 1980 cherche à réunir plusieurs traditions, tandis que Scheme préfère préserver un noyau plus réduit.
Les ordinateurs des années 1950 exécutent souvent des travaux par lots. Les utilisateurs préparent cartes ou bandes, confient leur programme à un opérateur et découvrent le résultat plus tard. Une simple erreur peut imposer un nouveau cycle d’attente.
McCarthy défend dès la fin de la décennie le temps partagé généraliste. La machine alterne rapidement entre plusieurs utilisateurs, donnant à chacun l’impression de disposer d’un ordinateur interactif. Les chercheurs peuvent tester une idée, observer le résultat et corriger immédiatement leur programme.
Cette interaction est particulièrement adaptée à Lisp. Un interpréteur peut lire une expression, l’évaluer et afficher le résultat dans une boucle continue. Cette organisation, souvent résumée par l’acronyme REPL, transforme la programmation en conversation expérimentale avec le système.
McCarthy participe au développement de cette vision au MIT, puis fonde à Stanford le Stanford Artificial Intelligence Laboratory avec l’aide de Lester Earnest. Ces environnements rassemblent langages, terminaux, réseaux et chercheurs. Ils montrent que l’évolution d’un langage dépend autant de son contexte d’usage que de ses règles formelles.
Ce que Lisp transmet aux langages modernes
Lisp n’est plus le langage unique de la recherche en intelligence artificielle. Ses idées ont cependant quitté leur contexte initial. Les fonctions traitées comme des valeurs, les fermetures lexicales, la récursion, la gestion automatique de la mémoire et les environnements interactifs apparaissent dans de nombreux langages contemporains.
John Backus défendra lui aussi une programmation davantage fondée sur la composition de fonctions. Guido van Rossum intégrera à Python plusieurs outils fonctionnels au sein d’un langage multi-paradigme. Brendan Eich puisera dans Scheme pour concevoir certaines fondations de JavaScript, même si sa syntaxe extérieure ressemble au C.
Cette diffusion rend l’influence de Lisp parfois invisible. Un développeur peut utiliser une fonction anonyme, transmettre une fonction à une autre ou travailler dans une console interactive sans connaître leur filiation. Lisp reste pourtant un point de passage majeur entre la logique mathématique, la recherche en intelligence artificielle et les outils ordinaires de programmation.
McCarthy meurt en 2011. Son héritage ne réside pas dans l’idée que les machines auraient déjà atteint une intelligence générale. Il tient à une étape plus précise : montrer qu’un langage pouvait représenter des expressions symboliques avec assez de simplicité pour que programmes, règles et code deviennent manipulables par les mêmes mécanismes.
Chronologie
- 1927 : naissance de John McCarthy à Boston.
- 1948 : diplôme de mathématiques au California Institute of Technology.
- 1951 : doctorat de mathématiques à l’université de Princeton.
- 1955 : participation à la proposition de Dartmouth qui introduit l’expression « intelligence artificielle ».
- 1956 : atelier de Dartmouth consacré à cette nouvelle discipline.
- 1958 : premières formulations de Lisp au Massachusetts Institute of Technology.
- 1959 : publication d’un texte proposant le temps partagé généraliste.
- 1960 : publication de l’article qui formalise les fonctions récursives et le calcul symbolique de Lisp.
- 1962 : arrivée définitive à Stanford.
- 1965 : fondation du Stanford Artificial Intelligence Laboratory avec Lester Earnest.
- 1971 : prix Turing pour ses contributions à l’intelligence artificielle.
- Années 1980 : consolidation de plusieurs traditions Lisp dans Common Lisp, tandis que Scheme développe un noyau plus minimal.
- 2001 : départ à la retraite de Stanford.
- 2011 : décès à Stanford à l’âge de 84 ans.
- Aujourd’hui : les dialectes de Lisp et leurs idées restent présents dans la programmation fonctionnelle, les macros et les environnements interactifs.
Questions fréquentes
John McCarthy a-t-il programmé seul le premier Lisp ?
Non. McCarthy définit les principes et la première description du langage. Steve Russell réalise le premier évaluateur, tandis que Daniel Edwards, Timothy Hart, Michael Levin et d’autres chercheurs contribuent à la mémoire automatique, au compilateur et aux premières implémentations.
Pourquoi Lisp utilise-t-il autant de parenthèses ?
Les parenthèses rendent explicite la structure emboîtée des expressions. Comme le code prend la forme de listes, le lecteur du langage et les programmes Lisp peuvent utiliser une représentation régulière, facile à analyser et à transformer.
Lisp est-il le premier langage fonctionnel ?
Il est l’un des premiers langages à faire des fonctions et de la récursion des outils centraux, et le plus ancien langage fonctionnel encore utilisé sous plusieurs formes. La catégorie « programmation fonctionnelle » s’est toutefois construite progressivement à partir de plusieurs travaux mathématiques et langages.
Quel rapport existe entre Lisp et l’intelligence artificielle ?
Lisp a été conçu pour manipuler les symboles, les règles et les structures nécessaires aux premiers programmes d’intelligence artificielle. Il est devenu leur langage dominant pendant plusieurs décennies, mais l’intelligence artificielle moderne utilise aujourd’hui de nombreux autres langages.
McCarthy a-t-il inventé le ramasse-miettes ?
Le ramasse-miettes apparaît dans les premières implémentations de Lisp afin de récupérer automatiquement les listes devenues inutiles. McCarthy décrit le besoin et le principe ; Daniel Edwards réalise l’un des premiers mécanismes opérationnels. L’innovation appartient donc à l’histoire collective du langage.
Lisp est-il encore utilisé aujourd’hui ?
Oui. Common Lisp, Scheme, Racket, Emacs Lisp et Clojure répondent à des usages différents. Son influence dépasse ces dialectes : fonctions anonymes, fermetures, REPL, macros et gestion automatique de la mémoire font désormais partie de nombreux langages.