Sous le prétexte d'étudier les compilateurs, nous allons déconstruire
de nombreux mécanismes de programmation caractéristiques des langages
de haut niveau et nous intéresser aux langages de programmation
eux-mêmes.
L'objectif est de faire de vous des programmeurs
avertis, conscients du fonctionnement de vos outils.
Au passage, vous allez aussi écrire vous-même un compilateur
(ou plutôt une dizaine de compilateurs pour des langages de
plus en plus riches) et voir comment des notions vues dans
de multiples autres cours de votre cursus sans liens
évidents entre eux peuvent être convoquées ensemble dans la
construction d'un unique système.
Documents
Archives
- Anciennes diapos de cours [ .zip ]
- Énoncé de l'examen 2018 [ .pdf ]
- Énoncé de l'examen 2017 [ .pdf ]
Ressources
Ouvrages
Des références intéressantes, trouvables en bibliothèque.
- Aho, Lam, Sethi et Ullman : Modern Compilers: Principles, Techniques, and Tools.
Dit le dragon.
Traduit en français (Compilateurs : principes, techniques et outils). - Cooper et Torczon : Engineering a Compiler.
- Appel : Modern Compiler Implementation in ML.
- Pierce : Types and Programming Languages.
- Bryant et O'Hallaron : Computer Systems : A Programmer's Perspective.
TP : Construction d'un compilateur
La construction de votre compilateur sera incrémentale : dès la fin du premier TP vous aurez un compilateur simple mais complet, produisant du code assembleur à partir d'un programme écrit dans un langage de bas niveau. Chaque séance aboutira à un nouveau compilateur pour un langage source un peu plus riche que le précédent.
Sujets
Module 1 : langage impératif
- Machine virtuelle pour les exécutables BTC. [ spécification | code ]
- Langage assembleur [ spécification | code ]
- Langage à pile STK [ spécification et énoncé | code | correction ]
- Langage arithmétique ART [ spécification et énoncé | code | correction ]
- Langage impératif structuré IMP [ spécification et énoncé | code | correction ]
Module 2 : fonctions
- Langage avec fonctions et variables locales VAR
- Interprétation
[ énoncé, mis
à jour le 15 octobre
| code (.zip) ]
Squelette étendu [ VAREvals.ml, ajouté le 15 octobre ] - Compilation
[ énoncé
| squelette de code (.zip)
| fichiers séparés ]
Aide ajoutée le 25/10 [ CLLtoIMP ]
Outils de tests ajoutés le 4/11 [ VARCompilerTester | ARTInterpreter ]
- Interprétation
[ énoncé, mis
à jour le 15 octobre
| code (.zip) ]
L'ensemble de vos travaux de ce module est à rendre sous la forme d'une archive .zip par binôme, à déposer dans la section travaux de Dokeos dans le dossier correspondant à votre groupe :
- au plus tard le 7 novembre au soir pour la partie interprétation,
- au plus tard le 14 novembre au soir pour la partie compilation.
Module 3 : types, données, objets
- Langages TYP, REC et TPL [ énoncé ]
- Squelette de code [ .zip | fichiers séparés ]
- Fichiers mis à jour le 14/11 [ TYPLexer.mll | TPLtoFNX.ml ]
- Fichiers mis à jour le 28/11 [ TYPParser.mly ]
- Langages CLS et EXT
[ énoncé ]
- Squelette de code [ .zip | fichiers séparés ]
- Interprète mis à jour [ VAREvalFP.ml ]
Modalités
L'ensemble des travaux pratiques sera noté et comptera pour 40% de votre note finale (note conservée en deuxième session). Rappel des principes :
- un rendu par module, soit environ toutes les trois semaines
- au début de chaque module, vous pourrez repartir soit de votre travail sur les modules précédents, soit d'un corrigé fourni
- en monôme ou en binôme
- chaque sujet propose :
- un contrat de base, donnant une note comprise entre 10 et 12 s'il est convenablement rempli
- plusieurs extensions, pour approfondir votre travail et améliorer votre note