Chapitre 1 Introduction aux compilateurs (et aux interpréteurs) Jean Privat Université du Québec à Montréal INF5000 — Théorie et construction des compilateurs Automne 2013 Jean Privat (UQAM) 01—Introduction aux compilateurs INF5000 — Automne 2013 1 / 19 Programmation Problème de communication Bonjour ! Jean Privat (UQAM) 0110010 ? 01—Introduction aux compilateurs INF5000 — Automne 2013 2 / 19 Langages de programmation Permettre l’écriture de code source de programme par un humain Distinct du code machine inadapté pour les humains Quelques langages de programmation Assembleur, C, Python, Prolog Évolution Les langages de programmation ont évolués (et évoluent toujours) Jean Privat (UQAM) 01—Introduction aux compilateurs INF5000 — Automne 2013 3 / 19 Exécution d’un programme Un microprocesseur ne peut pas en soit exécuter directement le code source d’un programme Il ne comprend que son propre langage machine Le code source doit être traité pour pouvoir être exécuté par une machine Transformé (compilation) Évalué (interprétation) Jean Privat (UQAM) 01—Introduction aux compilateurs INF5000 — Automne 2013 4 / 19 Exécution d’un programme Données Idée Programmeur Code source « Écriture » Exécution « Traitement » Ordinateur Résultats Jean Privat (UQAM) 01—Introduction aux compilateurs INF5000 — Automne 2013 5 / 19 Compilateur Programme qui transforme du code source en du code exécutable par une machine La compilation à lieu avant l’exécution 01100100100 11101110110111 10110010110001 10000011010110 FOR A = 1 TO 9 B=B+A NEXT A Jean Privat (UQAM) Code source Compilateur Données Exécutable Exécutable 01—Introduction aux compilateurs Résultats INF5000 — Automne 2013 6 / 19 Compilateurs Compilateurs traditionnels C Java Compilateurs source-à-source Préprocesseur Générateurs de code Décompilateurs Travail inverse Outil de rétro-ingénierie Compilateur au sens large Extraction, transformation, génération Jean Privat (UQAM) 01—Introduction aux compilateurs INF5000 — Automne 2013 7 / 19 Compilateur C *.h fichier.c *.o préprocesseur compilateur C éditeur de liens assembleur fichier.o Jean Privat (UQAM) programme.exe 01—Introduction aux compilateurs INF5000 — Automne 2013 8 / 19 Interpréteur Programme qui prends un programme en entrée et l’exécute directement Souvent interactifs Souvent réflexifs Code source FOR A = 1 TO 9 B=B+A NEXT A Interpréteur Résultats Données Jean Privat (UQAM) 01—Introduction aux compilateurs INF5000 — Automne 2013 9 / 19 Interpréteurs Interpréteurs traditionnels Ruby Shells Machines virtuelles Java Émulateurs Interpréteurs au sens large Description de comportement Jean Privat (UQAM) 01—Introduction aux compilateurs INF5000 — Automne 2013 10 / 19 Compilateurs optimisants Interpréteurs hybrides Compilateurs vs. interpréteurs Vitesse d’exécution Souplesse Facilité de développement Hybridation Machine virtuelle Compilateur juste-à-temps Jean Privat (UQAM) 01—Introduction aux compilateurs INF5000 — Automne 2013 11 / 19 Problème de l’amorçage (bootstrap) Question rhétorique Question de l’œuf et de la poule Problème fréquent en informatique Question pratique Compilateurs autogènes Compilateurs croisés Jean Privat (UQAM) 01—Introduction aux compilateurs INF5000 — Automne 2013 12 / 19 Structure d’un compilateur Source texte Source structuré Analyseur lexical Structures de données Analyseur syntaxique Analyseur sémantique Générateur de code Compilateur Code destination Jean Privat (UQAM) 01—Introduction aux compilateurs INF5000 — Automne 2013 13 / 19 Analyse lexicale Rôle Extraire les mots (lexèmes, jetons) du flot de caractères qu’est le code source Exemple : for i = 1 to 10 do print i Mot clé for Identifiant i Symbole égal Entier 1 Mot clé to etc. Jean Privat (UQAM) 01—Introduction aux compilateurs INF5000 — Automne 2013 14 / 19 Analyse syntaxique Rôle Reconstruire la structure syntaxique à partir des lexèmes Exemple : le chat dort. le chat dort article définit nom commun verbe groupe nominal groupe verbal . point phrase Jean Privat (UQAM) 01—Introduction aux compilateurs INF5000 — Automne 2013 15 / 19 Analyse sémantique Objectifs multiples Extraire le sens du code Vérifier sa cohérence Calculer des informations additionnelles Exemple Le crayon mange une pomme. Syntaxe : OK Sens : pas OK Jean Privat (UQAM) 01—Introduction aux compilateurs INF5000 — Automne 2013 16 / 19 Génération de code Générer du code en langage cible Utilisation des informations calculées aux étapes précédentes Peut être fait en plusieurs étapes (langages intermédiaires) Si le langage source est très distant du langage cible Si le compilateur est optimisant Jean Privat (UQAM) 01—Introduction aux compilateurs INF5000 — Automne 2013 17 / 19 Structure d’un interpréteur Données Source texte Source structuré Analyseur lexical Structures de données Analyseur syntaxique Analyseur sémantique Exécuteur de code Interpréteur Résultats Jean Privat (UQAM) 01—Introduction aux compilateurs INF5000 — Automne 2013 18 / 19 Exécution du code Exécuter du code au fur et à mesure Utilisation des informations calculées aux étapes précédentes Maintient de structures de données additionnelles pour représenter l’état d’exécution du programme Interpréteur mixte Interprète une représentation intermédiaire Invoque un compilateur juste-à-temps Jean Privat (UQAM) 01—Introduction aux compilateurs INF5000 — Automne 2013 19 / 19