Table des matières
Chapitre 1 L’environnement des compilateurs
1.1 Qu’est-ce exactement qu’un compilateur ?
1.1.1 Assembleur
1.1.2 Édition de liens
1.1.3 Chargement dynamique
1.1.4 En résumé
1.2 La chaîne de compilation
1.3 Gestion des compilation et recompilations
Chapitre 2 Code machine
2.1 Les processeurs
2.1.1 Un peu de culture : le bytecode
2.2 Description d’un processeur
2.2.1 La mémoire
2.2.2 Les registres
2.2.3 Le jeu d’instructions
2.2.4 Les appels systèmes
2.3 Langage assembleur et langage machine
2.3.1 Pseudo-Instructions
2.4 Exemples de programmes en assembleur
2.4.1 Conditionnelle
2.4.2 Boucles
2.4.3 Expressions arithmétiques
2.4.4 Les données
2.4.5 Procédures simples
2.4.6 Procédures compliquées
Chapitre 3 Le langage Pseudo-Pascal
3.1 Expressivité des langages de programmation
3.2 Comment définir un langage
3.2.1 Syntaxe
3.2.2 Sémantique
3.3 Sémantique opérationnelle de la calculette
3.3.1 Un interpréteur
3.3.2 Une présentation plus neutre
3.4 Diverses constructions et leur sémantique
3.4.1 Les liaisons
3.4.2 Langages impératifs
3.4.3 Les booléens et la conditionnelle
3.4.4 Formalisation des erreurs
3.4.5 Terminaison
3.4.6 Ordre d’évaluation
3.4.7 Tableaux
3.5 Les fonctions
3.5.1 Les fonctions globales
3.5.2 Appel par valeur
3.5.3 Culture : Fonctions de première classe
3.6 Le langage Pseudo-Pascal (PP)
3.6.1 Syntaxe
3.6.2 Sémantique
Chapitre 4 Analyse lexicale
4.1 Enjeux
4.2 Les langages formels
4.2.1 Exemples
4.3 Expressions régulières
4.3.1 Utilisation pour l’analyse lexicale
4.4
ocamllex
4.4.1 Un exemple simple
4.4.2 Exemples plus compliqués
4.5 Bibliothèque des expressions régulières
4.6 Un peu de théorie
4.6.1 Automates finis déterministes (DFA)
4.6.2 Automates finis non-déterministes (NFA)
4.6.3 Compilation des expressions régulières
4.6.4 Réalisation des automates
4.6.5 Exemple d’exercice sur les automates
Chapitre 5 Analyse grammaticale
5.1 Grammaires
5.2 Analyse descendante (
top-down parsing
)
5.3 Analyse LL
5.4 Analyse montante (
bottom-up parsing
)
5.4.1 Automates shift-reduce
5.4.2 Programmation en Caml d’un analyseur montant
5.4.3 Analyse LR(1)
5.5
ocamlyacc
en pratique
Chapitre 6 Analyse sémantique et code intermédiaire
6.1 Les environnements
6.1.1 Réalisation des liaisons
6.1.2 Réalisation des environnements
6.1.3 Les environnements à l’exécution
6.2 Code intermédiaire
6.2.1 Le code intermédiaire, pourquoi ?
6.2.2 Notre code intermédiaire
6.3 Génération du code intermediaire
6.3.1 Compilation des constructions de Pseudo-Pascal
6.3.2 Compilation des accès aux variables
6.3.3 Les fonctions, représentation, compilation
6.3.4 Les fonctions, cas particulier des primitives
6.3.5 Compilation d’un programme complet
6.4 Linéarisation, canonisation
6.5 Optimisation du contrôle
Chapitre 7 Sélection des instructions
7.1 Principes
7.2 La sélection en pratique
7.2.1 Les registres
7.2.2 Les instructions assembleur
7.2.3 Sélection pour les expressions
7.2.4 Les fonctions
7.3 Un exemple simple
7.4 Quelques détails
7.4.1 Sur les opérations immédiates et la multiplication
7.4.2 Quelques problèmes posés par le Pentium
Chapitre 8 Analyse de durée de vie
8.1 Durées de vie
8.1.1 Temporaires vivants
8.1.2 Calcul
8.1.3 Calcul en pratique
8.2 Graphe d’interférence
8.3 Réalisation
8.3.1 Environnement de programmation
8.3.2 Calcul des durées de vie
8.3.3 Graphe d’interférence
8.3.4 Un détail
8.4 Un exemple complet
Chapitre 9 Allocation de registres
9.1 Allocation d’un temporaire en pile
9.2 Coloriage de graphe
9.2.1 L’algorithme de base
9.3 Choix des temporaires spillés, coloriage optimiste
9.4 Bon choix des couleurs, coloriage biaisé
9.5 Un exemple complet