[english version]

Qu'est ce que Lisp ?

Lisp est un langage, ou plutôt une famille de langages de programmation, fonctionnel, de haut niveau (pour une bonne définition de « haut niveau », disons que l'on ne manipule pas explicitement de pointeurs, par exemple) généraliste (des dialectes de Lisp ont été utilisés pour des problèmes d'intelligence artificielle, des systèmes d'exploitation, des logiciels de calcul formel, des éditeurs, des interfaces graphiques, des compilateurs autres que Lisp, et à peu près pour toute utilisation d'un langage de programmation). Il possède un certain nombre de particularités, notamment le fait que le code Lisp et les données d'un programme admettent la même représentation; c'est à dire, toute expression Lisp syntaxiquement correcte est un programme Lisp que l'on peut éxécuter, et tout programme Lisp syntaxiquement correct est une expression Lisp sur laquelle on peut opérer, au moyen de macros (qui sont somme toute des fonctions dont les arguments sont du code). Tout dialecte de Lisp possède les deux primitives read et eval qui, respectivement, parsent et évaluent une expression Lisp.

Historique de Lisp

Lisp fut concu entre 1956 et 1958 par John McCarthy, mathématicien et professeur au MIT. Celui-ci cherchait un langage adapté aux problèmes symboliques et formels. À l'origine, Lisp ne devait pas être implémenté, il s'agissait d'un langage théorique. Toutefois, Steve Russell, un de ses étudiants, remarqua qu'il suffisait d'implémenter eval pour avoir un interpréteur Lisp, ce qu'il fit sur le mainframe IBM 704 à disposition du laboratoire, en 1959.
Ainsi commença l'histoire de Lisp. Particulièrement bien adapté aux problèmes complexes, Lisp se développa rapidement, et fut le principal langage utilisé par les hackers du AI Lab avec l'assembleur.
Toutefois, le peu de mémoire et la lenteur des machines de l'époque rendait difficile l'utilisation de Lisp pour toutes les tâches (la nécéssité de la garbage-collection, entre autres, était assez rhédibitoire pour son utilisation au niveau d'un système d'exploitation). Ainsi vint l'idée de développer une architecture optimisée pour l'éxecution de Lisp, et en 1974, Richard Greenblatt, Tom Knight, et d'autres se mirent au design de la première Lisp machine, CONS.

Différents dialectes

Une des spécificités (historique, ce n'est nullement intrinsèque au langage) de Lisp est la présence, avant sa standardisation (dont le processus commença en 1984) de plusieurs dialectes.

En premier lieu fut implémenté LISP, comme évoqué ci-dessus. Cette première version était supposée utiliser des M-expressions (qui ressemblent a des formules mathématiques, par exemple 3 * (foo(2,3) + 2). L'implémentation se fit cependant avec des S-expressions (qui sont en gros des arbres syntaxiques, par exemple (* 3 (+ (foo 2 3) 2))), dont la manipulation est plus aisée. LISP 1.5 (dont le manuel, écrit par John McCarthy, parut en 1962; j'en ai un exemplaire papier, d'origine :-)) marqua vraiment le début de l'utilisation courante de Lisp. Il fut implémenté sur PDP-1 par L. Peter  Deutsch (futur auteur de Ghostscript, entre autres). Avec le projet MAC, au MIT naquit MACLisp, qui fut probablement le dialecte dans lequel le plus de lignes de code furent écrites avant les Lisp Machines. ZetaLisp, et le Lisp Machine Lisp, furent utilisés sur les-dites Lisp Machines entre autres.
Vers 1975 fut crée Scheme, premier Lisp dont les variables aient une portée statique; jusque là, les differents dialectes étaient scopés dynamiquement en interprétation, et statiquement en compilation, du fait d'une erreur dans la première implémentation (ainsi, « l'erreur historique » à laquelle McCarthy fait allusion n'est pas le choix de la portée dynamique, mais l'erreur d'implémentation qui fit que Lisp fut longtemps implémenté en portée dynamique. Par ailleurs, il est vrai que cette dernière solution est plus facile).
On peut également noter LeLisp (dialecte français) et EULisp (dialecte européen).

Enfin, Common Lisp est le résultat d'un long processus d'unification des différents dialectes, essayant de garder une certaine compatibilité. Ce langage est standardisé selon une norme ANSI de 1994. On y retrouve une grande influence de MACLisp et du Lisp des Lisp Machines, ce qui n'est guère étonnant au vu du comité qui conçut ce langage; la plupart de ses membres étaient des hackers des Lisp Machines. C'est un gros langage, dont le standard fournit beaucoup de fonctionnalités (gestion de nombreuses structures algorithmiques, et des entiers de taille arbitraire par exemple), à l'inverse de Scheme, dont le standard est volontairement minimaliste, afin de pouvoir maintenir son caractère pédagogique. Common Lisp est scopé statiquement.
Précisons également, afin de casser définitivement un mythe couramment répandu, que Common Lisp possède un système de typage statique; plus précisément, on peut décider de ne donner aucune indication de type, auquel cas le compilateur typera à l'execution les objets dont il ne connait pas le type à la compilation. Toutefois, on peut tout à fait indiquer le type des variables que l'on déclare, et tout bon compilateur essaiera d'inférer le plus possible les types des autres objets. Ceci permet de garder la flexibilité d'un typage dynamique, utile notamment dans les premières phases de conception d'un programme, tout en offrant la possibilité d'avoir la sécurité (et la rapidité à l'éxecution, puisqu'il n'y a plus de vérification de types à faire) d'un langage typé statiquement. Le typage statique est donc envisagé comme une optimisation (à la fois vis-à-vis de la sécurité et de la rapidité) et non comme un caractère instrinsèque du langage.

En savoir plus

Si cette petite introduction vous a mis l'eau à la bouche, ce que j'espère, voilà quelques pointeurs vers des ressources pour apprendre Common Lisp. Il y en a beaucoup d'autres, mais je ne préfère citer que celles sur lesquelles je peux formuler un avis en mon nom.


Valid XHTML 1.0! Viewable With Any Browser Powered by GNU Emacs