Lisp at 1.2. Modèle de données et modèle de l'exécution en Lisp

Home
Up
Previous
Next

1.2.    Modèle des données et modèle de l'exécution en Lisp

Le Lisp est un langage fonctionnel (ou langage applicatif). Tout programme Lisp s'exprime en termes d'applications de fonctions à des objets (par objet, on entend ici une donnée en général, c'est-à-dire une donnée ou un programme). Une fonction prend zéro ou plusieurs objets comme arguments, effectue un traitement et renvoie un ou plusieurs objets comme résultats (un argument pouvant être lui-même une application de fonction).

En Lisp, toute donnée (ou valeur) est représentée par un objet ayant un type manifeste; le type d'un objet est dit manifeste s'il peut être testé et reconnu à l'exécution (le langage est typé dynamiquement). Contrairement aux langages où le type est statique (C, Fortran,...), il n'est pas nécessaire en Lisp de déclarer le type d'une variable. On peut déclarer le type d'une variable, limitant ainsi les valeurs de cette variable à une certaine gamme d'objets (pour des raisons d'optimisation par exemple, le compilateur mettant à profit cette information pour générer un code machine plus efficace).

La gestion de la mémoire est automatique, le programmeur ne devant pas allouer explicitement la mémoire, ni faire utilisation du concept de bas niveau (langage machine) qu'est le pointeur (appelé aussi référence; voir l'exemple 3 du chapitre 5). La récupération et la réorganisation de la mémoire est assurée automatiquement par un système de ramasse-miettes (garbage collection), ce qui donne l'illusion d'une mémoire infinie. Ainsi une source importante de difficultés et d'erreurs est éliminée (par exemple, l'erreur de la référence folle). A noter qu'actuellement, le processus de ramasse-miettes est non-intrusif (il passe inaperçu aux yeux de l'utilisateur).

Les fonctions Lisp sont elles-mêmes des objets du modèle des données Lisp : de fait, elles sont représentées sous forme de listes, la liste étant une structure de donnée du Lisp. On dit qu'il y a équivalence entre le programme et les données. Les fonctions Lisp peuvent donc être traitées comme n'importe quelle valeur (par exemple être passées en argument d'un appel de fonction ou encore être stockées dans une structure de données). Ceci présente plusieurs avantages :

  • De façon générale, cette propriété augmente le pouvoir d'abstraction du langage (voir les exemples 1 et 2, chapitres 3 et 4).
  • Certaines techniques de conception de programmes reposent sur la non-différenciation des données et des programmes (par exemple la programmation dirigée par les données, voir [ABEL85]).
  • Cette propriété est de première importance pour la création des SPPLs (special purpose programming languages) car elle simplifie notablement l'écriture des interpréteurs de ces langages. Il est facile d'écrire des programmes manipulant d'autres programmes (voir l'exemple 2, chapitre 4).
  • Cette similarité entre les données et les programmes permet d'utiliser le Lisp comme un auto-macro-langage, c'est-à-dire un langage permettant de manipuler et d'étendre sa propre syntaxe (voir l'exemple 3, chapitre 5).
  • Il est parfois intéressant de construire dynamiquement le nom d'une fonction selon le contexte et de l'appliquer (si elle existe; voir l'exemple 3, chapitre 5).

    Les fonctions Lisp peuvent être génériques, ce qui signifie qu'elles peuvent opérer sur différents types d'objets. En Lisp, ces fonctions font la différence durant l'exécution, mettant à profit le type manifeste de tout objet Lisp. Cela donne une flexibilité supplémentaire; par exemple, une fonction composée à partir de fonctions génériques sera automatiquement générique (voir l'exemple 1, chapitre 3).

     

Home    Previous    Up    Next
contact
site map
Last update : 20/11/2001