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.
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.
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.
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.