Lisp
1716
30137922
2008-05-30T09:20:54Z
90.54.59.126
/* Généalogie et Variantes */
'''Lisp''' est la plus ancienne famille de [[programmation impérative|langages impératifs]] et [[programmation fonctionnelle|fonctionnels]]. Développé initialement en tant que modèle ''pratique'' pour représenter des programmes (par contraste avec la notion théorique de [[Machine de Turing]]), il est devenu dans les années 70 et 80 le langage de choix pour la recherche en [[intelligence artificielle]]. Les langages Lisp sont aujourd'hui utilisés dans de nombreux domaines, de la programmation [[World Wide Web|Web]] à la [[finance]], et dans les cursus de formation en Informatique.
Le terme '''Lisp''' a été forgé à partir de l'anglais « list processing ». Tous les dialectes de Lisp partagent les mêmes opérateurs de manipulation de listes chaînées simples. Lisp se distingue en outre par une syntaxe simple en [[notation préfixée]], son [[typage dynamique]] des données, le support pour la [[programmation fonctionnelle]], sa gestion automatique de la mémoire et la faculté de manipuler le code source en tant que structure de données.
Les langages Lisp sont reconnaissables immédiatement à leur apparence. Le [[code source]] des programmes est écrit en utilisant la même syntaxe que celle des listes - la syntaxe parenthésée des [[s-expression]]s. Chaque sous-expression d'un programme (ou structure de données) est délimitée par des parenthèses. Cela simplifie grandement l'[[analyse syntaxique]] des programmes Lisp et rend simple la [[métaprogrammation]] -- la création de programmes qui créent d'autres programmes.
Si l'on excepte le langage machine et le langage d'assemblage (ou plus communément « assembleur »), Lisp est le deuxième langage le plus ancien (juste après [[Fortran]]) parmi les langages qui se sont largement diffusés. Lisp a beaucoup évolué depuis le début des [[années 1960]] et a ainsi donné naissance à de nombreux dialectes.
===Histoire===
Le langage Lisp fut inventé par [[John McCarthy]] en [[1958]] alors qu'il était au [[Massachusetts Institute of Technology]] (MIT). Il publia un article intitulé « Recursive Functions of Symbolic Expressions and Their Computation by Machine, Part I » (soit « Fonctions Récursives d'expressions symboliques et leur évaluation par une Machine, partie I ») dans la revue [[CACM]] en [[1960]] ; la partie II ne fut jamais publiée.
Le premier [[interprète (informatique)|interpréteur]] fonctionnait sur un ordinateur [[IBM 704]] et deux instructions de cette machine devinrent les deux opérations primitives de Lisp pour décomposer les listes :
* car (Contents of Address register) : le premier élément de la liste
* cdr (Contents of Decrement register) : le reste de la liste
Dans son article, [[John McCarthy]] introduit deux syntaxes : les [[S-expression]]s (expressions symboliques, parfois appelées « sexp ») et les M-expressions (méta-expressions permettant l´[[homoiconicité]] pour exprimer les fonctions manipulant des S-expressions). Les M-expressions n'ont jamais été très appréciées et la plupart des Lisps de nos jours utilisent des S-expressions pour les programmes comme pour les données. C'est la syntaxe des S-expressions qui fait que certains reprochent à Lisp d'être « plein de parenthèses », mais c'est aussi une des sources de la puissance et de la souplesse du langage. Cette profusion de parenthèses a fait surnommer LISP : ''Lots of Insipid and Stupid Parentheses'' (des tas de parenthèses insipides et stupides ou, en français ''Langage Imbécile Saturé de Parenthèses'').
Probablement en raison de son expressivité et de sa flexibilité, Lisp eut beaucoup de succès dans la communauté de l'[[intelligence artificielle]]. Dans les [[années 1970]], on créa des ordinateurs spécialisés dans l'exécution de programmes Lisp : les [[Machine Lisp|machines Lisp]].
Durant les [[années 1980]] et [[années 1990|1990]], on fit de grands efforts pour unifier les nombreux dialectes de Lisp qui étaient apparus. Le résultat fut appelé [[Common Lisp]] et en [[1994]], l'[[ANSI]] publia « ANSI X3.226-1994 Information Technology Programming Language Common Lisp », standardisant ainsi le langage. À ce moment, Lisp était bien moins florissant qu'à sa grande époque.
Bien qu'éclipsé par des langages proches de la machine (C, C++) et soutenus par des campagnes marketing agressives, Lisp reste un langage très utilisé, en particulier en tant que langage embarqué dans des applications, où il sert de langage d'extension. Le cas le plus connu d'utilisation embarquée de Lisp est l'éditeur de textes [[Emacs]]. On notera par ailleurs que Lisp vient en quatrième position en termes de lignes de codes utilisées pour implémenter les 8 600 paquets sources disponibles dans le système d'exploitation [[Debian]] publié en juin 2005. Les huit premiers langages se distribuent ainsi : C (57%), C++ (16.8%), Shell (9%), LISP (3%), Perl (2.8%), Python (1.8%), Java (1.6%), FORTRAN (1.2%)<ref>[http://www.upgrade-cepis.org/issues/2005/3/up6-3Amor.pdf| UPGRADE (European Journal for the Informatics Professional), juin 2005]</ref>.
=== Syntaxe ===
Les listes sont délimitées par des parenthèses et leurs éléments sont séparés par des espaces : (1 2 "foo"). Un programme Lisp est un [[arbre de syntaxe]] composé avec des listes. Cette utilisation des parenthèses donne lieu à des moqueries sur le nom de LISP : « Lots of Irritating and Silly Parentheses », ou «Lots of Stupid and Insipid Parentheses » (que l'on pourrait traduire respectivement par : « Langage inutilement et stupidement parenthésé » et «Des tas de parenthèses stupides et insipides »).
Lisp est un langage orienté expression : il ne fait pas de distinction entre « expressions » et « statements » (instructions) comme le font de nombreux langage (par exemple [[Langage Pascal|Pascal]]) ; tout est expression et retourne une valeur ou un ensemble de valeurs.
La plupart des expressions Lisp sont des applications de fonction.
Ce que d'autres langages écrivent
<source lang="lisp">f(a,b,c) </source>
Lisp l'écrit
<source lang="lisp">(f a b c) </source>
Ainsi une somme ne se note pas
<source lang="lisp">1+2+3+4 </source>
ni
<source lang="lisp">somme(1,2,3,4)</source>
mais
<source lang="lisp">(+ 1 2 3 4)</source>
On utilise la même notation préfixée pour les « formes spéciales » et les « macros » : le premier élément dans la liste, dans ces cas, détermine comment les éléments suivants seront traités. Une expression peut être une application de fonction, une forme spéciale ou une application de macro suivant la nature du premier élément.
=== Exemples ===
Les programmes suivants ne sont pas typiques des vrais programmes Lisp. Ils sont typiques de la présentation que l'on fait de Lisp dans les cours d'informatique.
La factorielle est un grand classique :
<source lang="lisp">
(defun factorial (n)
« Calcule la factorielle de l'entier n. »
(if (<= n 1)
1
(* n (factorial (- n 1)))))
</source>
On peut aussi écrire plus efficacement (voir [[récursion terminale]]) :
<source lang="lisp">
(defun factorial (n &optional (acc 1))
« Compute the factorial of the integer n. »
(if (<= n 1)
acc
(factorial (- n 1) (* acc n))))
</source>
Un autre exemple typique est cette fonction qui renverse une liste (Lisp a une fonction intégrée <tt>reverse</tt> à cet effet) :
<source lang="lisp">
(defun reverse (l &optional (acc '()))
« renverse la liste l »
(if (null l)
acc
(reverse (cdr l) (cons (car l) acc))))
</source>
=== Lisp et les Objets ===
Divers systèmes à objets ont été construits à partir de Lisp, notamment :
* Flavors, conçu au [[Massachusetts Institute of Technology|MIT]]
* Le Common Lisp Object System ([[CLOS]]), un descendant de Flavors
CLOS offre de l'[[héritage multiple]], la sélection multiple et un puissant système de combinaison de méthodes. [[Common Lisp]] (dont CLOS fait partie) fut le premier langage orienté-objet standardisé.
=== Citation ===
[[Grégory Chaitin]] sur Lisp :
«Malheureusement, alors que les langages de programmation gagnent en sophistication, ils sont de plus en plus le reflet de la complexité de la société humaine et du monde immense des applications logicielles. Ainsi, ils deviennent d'énormes boîtes à outils, comme des garages et des greniers chargés de plus de trente ans d'histoire ! A contrario, LISP est un langage de programmation d'une grande beauté mathématique ; il ressemble plus à un scalpel de chirurgien ou à un diamant affûté qu'à un garage à deux places encombrés de bricolages, où il ne reste plus de place pour une voiture.
LISP a un petit nombre de concepts élémentaires puissants, et tout le reste est construit au-dessus de ça, ce qui correspond à la façon de travailler des mathématiciens ; c'est à ça que ressemblent les théories mathématiques. Ces théories, les bonnes théories, consistent à définir quelques nouveaux concepts clefs, et à partir de là le feu d'artifice commence : elles révèlent de nouvelles allées, elles ouvrent la porte à des mondes radicalement nouveaux. LISP est comme ça aussi ; il est plus proche des maths que la plupart des langages de programmation. Du moins si vous éliminez les parties ''utiles'' qui ont été ajoutées, les ajouts qui ont fait de LISP un outil ''pratique''. Ce qui reste si vous faites cela, c'est le LISP original, le cœur conceptuel de LISP, un cœur qui est un joyau de beauté mathématique et de beauté intellectuelle austère.»
Aujourd'hui, certains diraient que [[Scheme]] est le dérivé de Lisp atteignant à la beauté décrite par [[Chaitin]] ; et il est certain que [[Common Lisp]], le descendant en ligne droite des grandes cuvées des dialectes passés de LISP (Maclisp, Interlisp, Zetalisp) penche plus du côté de la ''boîte à outils géante'', bien qu'ayant conservé intact son cœur conceptuel.
G. Chaitin a utilisé ce Lisp idéalisé pour ses recherches : [http://www.cs.auckland.ac.nz/CDMTCS/chaitin/lisp.html Elegant LISP Programs].
=== Généalogie et Variantes ===
* LISP (la version originale de [[John McCarthy]] lorsqu'il était au [[Massachusetts Institute of Technology|MIT]])
* MACLisp (lié au projet MACSYMA du [[Massachusetts Institute of Technology|MIT]] - et sans lien avec l'Apple [[Macintosh]]), descendant direct de LISP
* ZetaLisp, successeur de MACLisp, il fonctionna sur des [[Machine Lisp|machines LISP]]
* InterLisp, né BBN Lisp, qui servit à développer les premières interfaces utilisateurs graphiques,
* [[VLISP]] développé à l'[[Université_Paris_VIII|Université de Paris VIII - Vincennes]]
* LeLisp (ou Le-Lisp), version française du célèbre langage, développée à l'[[Institut national de recherche en informatique et en automatique|INRIA]], et commercialisé ensuite par [[Ilog]]
* EuLisp, un « Lisp Européen »
* [[Emacs Lisp|ELISP (Emacs Lisp)]], version simplifiée utilisée pour programmer l'éditeur de texte [[Emacs]]
* [[Common Lisp]], descendant du Lisp le plus connu.
* AutoLISP, un LISP utilisé dans [[AutoCAD]] pour la programmation.
* [[Scheme]], un LISP épuré
* Nyquist, un LISP utilisé pour travailler avec des sons.
* [[xLispStat]], un LISP utilisé pour les analyses statistiques de données.
* [[XLisp]], un sous-ensemble du langage Lisp développé par David Michael Betz
* [[QLisp]], une extension de Xlisp4.3 avec une centaine de routines d'analyse d'images
* [[RPL]] (Reverse Polish lisp), un dérivé utilisé sur les calculatrices HP
* [[Paul Graham#Arc|Arc]], dérivé très épuré, créé par [[Paul Graham]]
== Notes et références de l'article ==
<references/>
== Voir aussi ==
* [[Allegro Common Lisp]] by [http://www.franz.com Franz, Inc.]
* [[LispWorks]] by [http://www.lispworks.com/ LispWorks Ltd.]
* [[Macintosh Common Lisp]] by [http://www.digitool.com/ Digitool, Inc.]
* [[Corman Lisp]] by [http://www.cormanlisp.com/ Corman Technologies]
* [[Scieneer Common Lisp]] by [http://www.scieneer.com/index.html Scieneer Pty Ltd.].
=== Articles connexes ===
* [[Lambda calcul]] : langage mathématique dont Lisp, comme d'autres langages informatiques fonctionnels, est inspiré.
* [[Common Lisp]] : Descendant direct du Lisp de McCarthy ; le terme Lisp est aujourd'hui autant employé pour se rapporter au Lisp originel qu'au Common Lisp.
* [[Scheme]] : Autre descendant du Lisp, plus axé sur la [[programmation fonctionnelle]] que sur la programmation de macros.
=== Liens et documents externes ===
* {{en}}[http://www.cliki.net/index CLiki], '''le wiki''' de référence des lispeurs
* {{en}}[http://common-lisp.net/ common-lisp.net], le sourceforge-like des lispeurs
* {{en}}[http://wiki.alu.org/ ALU wiki], un autre wiki de référence
* {{en}}[http://community.computerhistory.org/scc/projects/LISP/ History of Lisp], tous les documents sur tous les dialectes de Lisp ayant vu le jour depuis Lisp 1.5.
* {{fr}}[http://www.algo.be/clr.html Lisp : présentation et ressources], y compris une [http://www.algo.be/logo1/lisp/prog.html Introduction à la programmation en Common Lisp] avec exemples.
* {{fr}}[http://dept-info.labri.fr/~strandh/Teaching/Programmation-Symbolique/Common/Book/HTML/programmation.html Common Lisp : Traité de Programmation]
* {{en}}[http://clisp.cons.org/ CLISP, une implémentation d'ANSI Common Lisp en licence libre GPL]
* {{fr}}[http://mfj.chez-alice.fr/html/index.html Xlisp & Qlisp]
{{Portail|programmation informatique}}
[[Catégorie:Langage fonctionnel]]
[[Catégorie:Intelligence artificielle]]
[[an:Lisp]]
[[ar:ليسب]]
[[bat-smg:Lisp]]
[[bg:Lisp]]
[[bn:লিস্প (প্রোগ্রামিং ভাষা)]]
[[bs:Lisp programski jezik]]
[[ca:Lisp]]
[[cs:Lisp]]
[[cy:Lisp]]
[[da:Lisp]]
[[de:LISP]]
[[el:Lisp]]
[[en:Lisp (programming language)]]
[[eo:LISP (programlingvo)]]
[[es:Lisp]]
[[et:LISP]]
[[eu:Lisp]]
[[fa:لیسپ]]
[[fi:Lisp]]
[[ga:LISP]]
[[gl:Lisp]]
[[he:LISP]]
[[hr:Lisp (programski jezik)]]
[[hu:Lisp]]
[[it:Lisp]]
[[ja:LISP]]
[[ko:리스프]]
[[lt:Lisp]]
[[lv:Lisp]]
[[ms:LISP]]
[[nl:Lisp (programmeertaal)]]
[[no:Lisp]]
[[pl:LISP]]
[[pt:Lisp]]
[[ro:LISP]]
[[ru:Лисп]]
[[simple:LISP]]
[[sk:Lisp]]
[[sl:Lisp (programski jezik)]]
[[sr:Lisp]]
[[sv:Lisp]]
[[tg:Лисп]]
[[th:ภาษาลิสป์]]
[[tr:Lisp]]
[[uk:LISP]]
[[zh:LISP]]