Université de Nice - Sophia Antipolis Licence 3 Informatique 2012-2013 1/17 Compilation I. Introduction Jacques Farré Jacques.Farre@unice.fr http://deptinfo.unice.fr/~jf/compil-l3/
Université de Nice - Sophia Antipolis Licence 3 Informatique 2012-2013 2/17 Plan du cours et modalités de contôle le cours comprend 3 parties introduction et analyse lexicale (3 séances) analyse syntaxique (5 séances) analyse sémantique et interprétation (4 séances) contrôles 1 examen final de 2h (40%) projet (30%, fait en grande partie pendant les TPs; l activité en TP sera prise en compte dans cette note) 3 interrogations en TD de 30 mn (30%) 18 février (analyse lexicale) 25 mars (analyse syntaxique) 6 mai (analyse sémantique et interprétation) présence aux TDs et TPs obligatoire (sinon malus)
Université de Nice - Sophia Antipolis Licence 3 Informatique 2012-2013 3/17 Introduction Compilation : traduction d un dans un autre pas seulement des s de programmation : s de script, d interrogation, de description (LaTeX, XML...) pas seulement pour obtenir un programme exécutable : enjoliveurs, éditeurs syntaxiques... concepts et outils utilisés dans de nombreux autres domaines : web, bases de données, traitement des langues naturelles... Concepts et outils fondamentaux théorie des s (grammaires, automates) sémantiques formelles algorithmes et structures de données variés principes de génie logiciel Vous rencontrerez inévitablement un jour ou l autre un problème de compilation dans votre vie professionnelle
Université de Nice - Sophia Antipolis Licence 3 Informatique 2012-2013 4/17 Terminologie source : celui qu il faut analyser objet : celui vers lequel il faut traduire machine ou d assemblage : machine sous forme symbolique traducteur : passage d un à un autre, par exemple préprocesseur : d un sur- de L vers L (C par exemple) assembleur : du d assemblage vers le code machine binaire éditeur de liens : d un ensemble de sous-programmes en binaire relogeable (les.o de linux par exemple) vers un programme exécutable compilateur : traduction d un source (généralement) de haut niveau vers un de plus bas niveau décompilateur : programme qui essaye de reconstruire le programme source à partir du code objet
Université de Nice - Sophia Antipolis Licence 3 Informatique 2012-2013 5/17 Compilateur et interprète données programme en source COMPILATEUR données programme en objet programme en source INTERPRÉTATION TRADUCTION forme interne avantages et inconvénients de chaque modèle compilateur : produit du code machine programme efficace mais pas toujours portable interprète : programme portable mais moins efficace, mais qui peut manipuler le code source (méta-programmation)
Université de Nice - Sophia Antipolis Licence 3 Informatique 2012-2013 6/17 Compilation croisée Les traducteurs (compilateurs et interprètes) sont des programmes comme les autres ils sont écrits dans un certain de programmation la différence est qu ils prennent des programmes comme données et produisent (compilateurs) du code exécutable Diagramme en T : Compilateur de S vers un code O implanté sur une machine X : programme écrit en S compilateur de S vers O sur machine X programme exécutable SOURCE S OBJET O sur machine O D EXECUTION X machine X par exemple, compilateur Objective C sur un PC pour processeur embarqué programme en Objective C compilateur de Objective C pour processeur ARM compilation sur machine Intel Objective C Code ARM Compilateur en code 80x86 PC programme en code ARM
Université de Nice - Sophia Antipolis Licence 3 Informatique 2012-2013 7/17 Comment obtenir un compilateur? on l écrit dans un E (de haut niveau si possible) on suppose qu on dispose d un compilateur de ce sur une machine X par exemple, un compilateur de Java écrit en C sur un PC : S = Java, O = JVM, E = C, X = code intel core SOURCE S OBJET O SOURCE S OBJET O D ECRITURE E SOURCE E OBJET X D EXECUTION X D EXECUTION X machine X
Université de Nice - Sophia Antipolis Licence 3 Informatique 2012-2013 8/17 Comment obtenir un auto-compilateur? si on veut écrire le compilateur dans son propre S écrire d abord un compilateur d un sous-ensemble S de S en E, et le compiler écrire ensuite en S le compilateur de S c est ce qu on appelle un bootstrap du compilateur SOURCE S OBJET O SOURCE S OBJET O D ECRITURE E SOURCE E OBJET X D EXECUTION X D EXECUTION X SOURCE S OBJET O machine X SOURCE S OBJET O D ECRITURE S SOURCE S OBJET O D EXECUTION O D EXECUTION X machine X
Université de Nice - Sophia Antipolis Licence 3 Informatique 2012-2013 9/17 Compilateurs monolithiques les premiers compilateurs étaient monolitiques : ils pouvaient travailler en 1 seule passe (les s étaient encore simples) autant de compilateurs que de couples (, machine cible), soit m n source 1 COMPILATEUR 1-1 objet 1 source 1 COMPILATEUR 1-n objet n source 2 COMPILATEUR 2-n objet n source m COMPILATEUR m-1 objet 1 source m COMPILATEUR m-n objet n
Université de Nice - Sophia Antipolis Licence 3 Informatique 2012-2013 10/17 Compilateurs modulaires source PARTIE AVANT représentation intermédiaire PARTIE ARRIÈRE objet partie avant (analyse) : analyses lexicale, syntaxique, sémantique (cours de L3) partie arrière (synthèse) : optimisation, production de code (cours de M1) avantages de cette décomposition : m parties avant + n parties arrières permettent d avoir m n compilateurs source 1 source m PARTIE AVANT 1 PARTIE AVANT m représentation intermédiaire PARTIE ARRIÈRE 1 PARTIE ARRIÈRE n objet 1 objet n le objet peut être celui d une machine virtuelle (JVM...) : le programme résultant sera portable on peut interpréter la représentation intermédiaire
Université de Nice - Sophia Antipolis Licence 3 Informatique 2012-2013 11/17 Schéma synthétique de la partie avant demande l analyse syntaxique COMPILATEUR demande l analyse sémantique ANALYSEUR SYNTAXIQUE construit représentation intermédiaire consulte ANALYSEUR SÉMANTIQUE demande un lexème ANALYSEUR LEXICAL renvoie un lexème source TRAITEMENT DES ERREURS
Université de Nice - Sophia Antipolis Licence 3 Informatique 2012-2013 12/17 Justification de l architecture de la partie avant du point du vue lexico-syntaxique le programme source est plein de bruits (espaces inutiles, commentaires...) pour la grammaire, de nombreux symboles sont équivalents (identificateurs, nombres...) ce qui justifie le pré-traitement (en général au vol) du texte source par l analyseur lexical du point de vue sémantique existence de références en avant (utilisation d un identificateur avant sa déclaration par exemple) unification du traitement de constructions équivalentes (attr=0 et this.attr=0 par exemple) ou proches (boucles notamment) ce qui justifie la mémorisation (sous forme intermédiaire) du texte à compiler
Université de Nice - Sophia Antipolis Licence 3 Informatique 2012-2013 13/17 Concepts et structures de données utilisés analyse lexicale : s réguliers, expressions régulières, automates finis pour l essentiel, mais aussi tables d adressage dispersé, arithmétique analyse syntaxique : grammaires hors-contexte, automates à pile (analyseurs descendants ou ascendants), attributs sémantiques analyse sémantique : diverses sémantiques formelles (mais l analyse sémantique est souvent codée à la main), équations de type, table de symboles représentation intermédiaire : arbre ou graphe le plus généralement
Université de Nice - Sophia Antipolis Licence 3 Informatique 2012-2013 14/17 Un exemple Soit en Java : if (i==0) --ifou; analyse lexicale : reconnaître les lexèmes : mot-clé if (mais pas dans l identicateur ifou), reconnaître i et ifou comme lexèmes de la classe identificateur, 0 comme de la classe des nombres entiers, -- comme un seul lexème, et pas la suite - - analyse syntaxique et représentation intermédiaire : analyser le texte selon la règle de grammaire : instruction MOT-IF ( condition ) instruction et construire (par exemple) un sous-arbre comme IF sous-arbre de la condition sous-arbre de l instruction
Université de Nice - Sophia Antipolis Licence 3 Informatique 2012-2013 15/17 Un exemple (suite) Soit en Java : if (i==0) --ifou; analyse sémantique : analyse de nom : vérifier que i et ifou sont bien déclarés, et déclarés comme des variables (ou des attributs); met en œuvre la table des symboles, qui permet de mémoriser les symboles déclarés (classes, attributs, méthodes, variables locales et paramètres...) analyse de type : vérifier que le type de i ou celui de ifou est compatible avec les opérations effectuées; met en œuvre des équations de type du genre int == int bool peut travailler en 1 ou plusieurs parcours de la représentation intermédiaire (selon la complexité du ) peut transformer/enrichir/normaliser la représentation intermédiaire par exemple, si ifou est un attribut, représenter de la même manière --ifou et --this.ifou
Université de Nice - Sophia Antipolis Licence 3 Informatique 2012-2013 16/17 Propriétés d un bon compilateur Reconnaître tout le, et rien que le (ou alors avoir un mode permettant d informer des constructions non standards) sinon, on accepte des programmes non portables Ne pas se restreindre à des constructions humainement lisibles : beaucoup de programmes sont créés par des programmes Indiquer de façon claire les erreurs et éviter les messages d erreur en cascade (bien que la source de l erreur ne soit pas toujours évidente) Traduire correctement vers le cible, et en donnant le meilleur code possible Être raisonnablement rapide (utiliser des algorithmes quasi linéaires)
Université de Nice - Sophia Antipolis Licence 3 Informatique 2012-2013 17/17 Bibliographie Les bases Compilateurs. Dick Grune, Henry E. Bal, Ceriel J.H. Jacobs, Koen G. Langendoen, Dunod 2002 Compilateurs - Principes, techniques et outils - Avec plus de 200 exercices. Alfred Aho, Monica Lam, Ravi Sethi et Jeffrey D. Ullman, Pearson Education, 2007 Compiler Design. Reinhard Wilhelm et Dieter Maurer, Adison-Wesley, 1995. Pour les mordus de théorie The Theory of Parsing, Translation and Compiling (2 volumes). Alfred V. Aho et Jeffrey D. Ullman, Prentice-Hall 1972 Parsing Theory (2 volumes). Seppo Sippu et Eljas Soisalon-Soininen, Springer-Verlag 1992