Université Montpellier II / Maîtrise Informatique / 1999-2000 / Projet de Langages Evaluation Compilation
En LISP, a été réalisé par groupe de 3 personnes un gros projet (de début Novembre à fin Janvier). Il consistait en la réalisation de:
  • Un métaévaluateur LISP (programme écrit en LISP qui évalue du code LISP passé en paramètre)
  • Un compilateur de LISP vers un langage que nous avons défini (proche de l'assembleur 8086)
  • La machine virtuelle correspondant à ce langage
  • Des utilitaires de fonctions sur les automates et expressions régulières
Moi, je me suis occuppé du métaévaluateur LISP (puisque je m'étais déjà penché 2 ans plus tôt sur un évaluateur SCHEME, je savais à quel genre de problèmes m'attendre). Le métaévaluateur a été très bien réussi, puisque bien au delà de métaévaluer quelques lignes de LISP, il réussissait à évaluer le code du compilateur ainsi que celui de la machine virtuelle (qui contenaient donc bien des formes LISP particulières qui étaient toutes gérées), et même à s'évaluer lui-même. Conformément à la théorie, le temps de calcul croît exponentiellement en fonction du nombre de métaévaluateurs imbriqués. Le seul défaut de ce métaévaluateur (par manque de temps) est qu'il ne gère pas les fonctions locales (il ne gère que les variables locales). En effet, lorsqu'une fonction locale est définie et appellée, il faudrait lui passer un environnement contenant la liste des fonctions locales. Or, une fonction locale peut très bien être récursive et l'environnement local devrait donc contenir la fonction locale en question (avec son propre environnement). En résultat, nous sommes amenés à utiliser des listes circulaires, dont l'affichage n'est pas géré par CLISP (et comme j'affichais plein de variables afin de voir si tout marchait correctement... ça ne me tentait pas trop de continuer à travailler à l'aveugle, vu le peu de temps qu'il restait...). Si quelqu'un veut se pencher sur le problème et parfaire ce métaévaluateur LISP, je fournis ci-dessous le code (qui a été testé et marche sous CLISP 95 et CLISP 97), que vous pouvez modifier comme bon vous semble à la seule condition de ne pas effacer mon nom.

Le compilateur est l'oeuvre de Gauthier HADERER. Lui aussi était très bien intégré dans le projet, puisqu'il arrivait à se compiler lui-même et à compiler le métaévaluateur, et ces programmes étaient correctement évalués par la machine virtuelle.

La machine virtuelle est l'oeuvre de Eric BOULAT. Hélas, il n'a pas travaillé comme Gauthier et moi, et en résultat, la machine virtuelle n'arrivait pas à évaluer son propre code (à part ça, toutes les parties du projet pouvaient s'imbriquer entre elles dans n'importe quel ordre et à plusieurs niveaux). Ce problème vient du fait que les variables d'environnement de la machine virtuelle sont globales (alors que pour Gauthier et moi, nous les passions en paramètres, ce qui permettaient d'avoir lorsqu'on réappellait notre propre programme, de nouvelles variables d'environnement qui n'écrasaient pas les variables d'environnement courantes).

Les utilitaires pour les automates et expressions régulières sont l'oeuvre de Gauthier HADERER.

Mon métaévaluateur a obtenu la meilleure note de toute la promotion: 18/20. Les compilateur, machine virtuelle et automates obtinrent aussi les meilleurs notes dans leurs catégories (18, 17 et 17 respectivement). 

Tout l'intérêt de ce projet passionant fut que le programme de chacun pouvait prouver que les programmes des autres fonctionnaient correctement :o)

code du projet (archive RAR)