Cours de compilation



Documents pareils
Gestion mémoire et Représentation intermédiaire

Traduction des Langages : Le Compilateur Micro Java

Algorithmique et Programmation, IMA

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

Compilation (INF 564)

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

Programmer en JAVA. par Tama

Éléments d informatique Cours 3 La programmation structurée en langage C L instruction de contrôle if

Cours 1 : La compilation

Chap 4: Analyse syntaxique. Prof. M.D. RAHMANI Compilation SMI- S5 2013/14 1

Cours de Programmation 2

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

Génie Logiciel avec Ada. 4 février 2013

Cours de C++ François Laroussinie. 2 novembre Dept. d Informatique, ENS de Cachan

Résumé Génération de code Le code intermédiaire

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Java Licence Professionnelle CISII,

Centre CPGE TSI - Safi 2010/2011. Algorithmique et programmation :

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Machines virtuelles fonctionnelles (suite) Compilation ML Java

as Architecture des Systèmes d Information

Suivant les langages de programmation, modules plus avancés : modules imbriqués modules paramétrés par des modules (foncteurs)

Évaluation et implémentation des langages

Cours d Algorithmique et de Langage C v 3.0

Cours de Programmation Impérative: Zones de mémoires et pointeurs

Les structures de données. Rajae El Ouazzani

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Une introduction à Java

Programmation Objet Java Correction

Utilisation d objets : String et ArrayList

Introduction à la programmation orientée objet, illustrée par le langage C++ Patrick Cégielski

Initiation à l algorithmique

Cours 1: Java et les objets

UE Programmation Impérative Licence 2ème Année

Grandes lignes ASTRÉE. Logiciels critiques. Outils de certification classiques. Inspection manuelle. Definition. Test

Analyse de sécurité de logiciels système par typage statique

ALGORITHMIQUE ET PROGRAMMATION En C

Arbres binaires de recherche

Langage C. Patrick Corde. 22 juin Patrick Corde ( Patrick.Corde@idris.fr ) Langage C 22 juin / 289

Recherche dans un tableau

OCL - Object Constraint Language

PROGRAMMATION PAR OBJETS

Cours d initiation à la programmation en C++ Johann Cuenin

INITIATION AU LANGAGE JAVA

Corrigé des TD 1 à 5

Claude Delannoy. 3 e édition C++


Classes et Objets en Ocaml.

Cours 1 : Introduction. Langages objets. but du module. contrôle des connaissances. Pourquoi Java? présentation du module. Présentation de Java

TP 1. Prise en main du langage Python

Objets et Programmation. origine des langages orientés-objet

TP, première séquence d exercices.

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

Argument-fetching dataflow machine de G.R. Gao et J.B. Dennis (McGill, 1988) = machine dataflow sans flux de données

Plan du cours. Historique du langage Nouveautés de Java 7

Travaux pratiques. Compression en codage de Huffman Organisation d un projet de programmation

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

STAGE IREM 0- Premiers pas en Python

Plan du cours Cours théoriques. 29 septembre 2014

Les arbres binaires de recherche

Présentation du langage et premières fonctions

Auto-évaluation Programmation en Java

Langage Java. Classe de première SI

Java 1.5 : principales nouveautés

Rappels d architecture

F. Barthélemy. 17 mai 2005

Java Licence Professionnelle CISII,

Conventions d écriture et outils de mise au point

Algorithmique, Structures de données et langage C

Rappel. Analyse de Données Structurées - Cours 12. Un langage avec des déclaration locales. Exemple d'un programme

INITIATION A LA PROGRAMMATION

Représentation d un entier en base b

Introduction à MATLAB R

Premiers Pas en Programmation Objet : les Classes et les Objets

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

3. SPÉCIFICATIONS DU LOGICIEL. de l'expression des besoins à la conception. Spécifications fonctionnelles Analyse fonctionnelle et méthodes

Introduction au langage C

INF 321 : mémento de la syntaxe de Java

LES TYPES DE DONNÉES DU LANGAGE PASCAL

Principes des langages de programmation INF 321. Eric Goubault

Cours No 3 : Identificateurs, Fonctions, Premières Structures de contrôle.

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

Logiciel de base. Première année ENSIMAG

RAPPELS SUR LES METHODES HERITEES DE LA CLASSE RACINE Object ET LEUR SPECIALISATION (i.e. REDEFINITION)

TD3: tableaux avancées, première classe et chaînes

Les structures. Chapitre 3

Le langage C. Introduction, guide de reference

Chapitre VI- La validation de la composition.

Le langage C. Séance n 4

Algorithmique et programmation : les bases (VBA) Corrigé

Généralités sur le Langage Java et éléments syntaxiques.

Programmation C. J.-F. Lalande. 15 novembre 2012

SHERLOCK 7. Version du 01/09/09 JAVASCRIPT 1.5

Transcription:

Cours de compilation 1 Introduction Un compilateur est un logiciel de traduction d un langage source vers un langage cible. D ordinaire le langage source est un langage de programmation évolué, comme C++ ou Java par exemple, le langage cible un code machine prévu pour programmer un ordinateur en particulier. Un compilateur contient plusieurs modules : analyseur lexical analyseur syntaxique analyseur sémantique générateur de code intermédiaire optimiseur de code générateur de code Il gère une table des symboles, détecte et signale un ensemble d erreurs à chaque niveau d analyse et produit le code qui servira à la programmation. Le compilateur entre dans un processus d élaboration des programmes et n est qu un des rouages permettant de construire un programme. Nous distinguons le compilateur des outils qui sont utilisés en amont : Editeur, Préprocesseur, et des outils qui sont utilisés en aval : Assembleur, lieur, chargeur. Sources Préprocesseur Programme source Compilateur programme cible Assembleur Lieur-chargeur Fig. 1 Contexte du compilateur Les phases et le résultat peuvent être différents d un compilateur à un autre : Interprétation plutôt que compilation proprement dite : Postscript, Shell, HTML Production de code portable (bytecode) pour machine virtuelle, et non de code dédié à une machine en particulier : P-code, java, NET Langages sources plus ou moins structurés. L assembleur par exemple est très peu structuré, il présente des instructions machines, des directives, des étiquettes. Optimisations plus ou moins poussées Analyse des erreurs plus ou moins poussées Exemple : PGCD int PGCD( int a, int b ) { 1

while ( b!= a ) { i f ( a > b ) a=a b ; else { / Echanger a e t b / int tmp ; tmp=a ; a=b ; b=tmp ; } return a ; } 1. Analyse lexicale : commentaires, mots réservés, constantes, identificateurs 2. Analyse syntaxique : Transforme le code en arbre fonction pgcd type int parametres contenu SUCC type int type int while return!= if b a = > a - b a a b Fig. 2 arbre syntaxique 3. Analyse sémantique, génération de code intermédiaire : Types : 2

PGCD int int int a int b int Instructions : SUCC(W HILE(T EST (, a, b), IF (T EST (<, a, b), AF F (a, OP (, a, b)), SUCC(BLOC(V AR(tmp, int), AF F (tmp, a), SUCC(AF F (a, b), AF F (b, tmp)))))), RET URN(a)) 2 Analyse lexicale 2.1 Entités lexicales (token) Définition par des expressions rationnelles L analyseur est un automate fini dont les états terminaux sont associés à des actions 2.2 Expression rationnelle Soit un alphabet A, un ensemble rationnel est : 1. Ensemble fini de mots 2. Concaténation d ensembles rationnels R 1 R 2 3. Itération d ensembles rationnels R 4. Union d ensembles rationnels R 1 R 2 Exemple : Alphabet = [A-Z][a-z][0-9]"_" = [A-Z][a-z] Chiffre = [0-9] Identificateur = ( Chiffre "_") Entier = {0} [1-9] (Chiffre) 2.3 Automate Un analyseur lexical s implémente à l aide d un automate 2.4 JFLEX Construit un automate qui applique les actions à effectuer sur chaque entité décrite par les expressions rationnelles. Fichier flex JFlex Lexer.java Java Lexer.class java JFlex pseudocode.jflex javac Lexer.java java Lexer programme.pseudocode Un exemple 3

f o u r n mot clef i c t i o f mot clef n mot clef Identificateur ChiffreUnderscore Fig. 3 fsa 4

import java.io.*; %% %public %class Lexer %standalone %8bit %{ StringBuffer str = new StringBuffer(); %} LineTerminator = \r \n \r\n InputCharacter = [^\n\r] WhiteSpace = {LineTerminator} [ \f\t] %% /* Keywords */ if {System.out.printf("KEYWORD:%s\n", yytext());} else {System.out.printf("KEYWORD:%s\n", yytext());} /* Operators */ "+" {System.out.printf("OPERATOR:%s\n", yytext());} /* Literals */ /* Comments and whitespace */ {WhiteSpace} {/* Nothing */} 3 Analyse syntaxique Quelques rappels exemple avec ETF, a + a (a + a) E E + T E T T T * F T F F ( E ) F IDENTIFIER arbre de dérivation dessiner Dérivation 5

a + b (c + d) F + b (c + d) T + b (c + d) E + b (c + d) E + F (c + d) E + T (c + d) E + T (F + d) E + T (T + d) E + T (E + d) E + T (E + F ) E + T (E + T ) E + T (E) E + T F E + T E Méthode descendante Méthode ascendantes Méthodes tabulaires Principe de l analyse LR 1. E E + T E T T T * F T F F ( E ) F IDENTIFIER 2. F IDENTIFIER 3. F ( E ) E E + T E T T T * F T F F ( E ) F IDENTIFIER (a) F ( E ) E E + T (b) E T T T * F 4. E E + T 6

5. E T T T * F 6. T F... Arbre d analyse syntaxique Dérivation gauche Problème d ambiguïté Revenons à la grammaire ifthenelse instr si expr alors instr instr si expr alors instr sinon instr autre analyse de si E1 alors S1 sinon si E2 alors S2 sinon S3 On préfère le alors le plus proche (p.201) Grammaire équivalente : instr instr close instr instr non close instr close si expr alors instr close sinon instr close autre instr non close si expr alors instr instr non close si expr alors instr close sinon instr non close Notions de grammaire attribuée chaque production A α possède un ensemble de règles b = f(c 1, c 2,..., c k ) f fonction b attribut synthétisé de A b attribut hérité d un des symboles en partie droite de la production c 1, c 2,..., c k attributs de symboles quelconques de la production L E imprimer(e.val) E E + T E.val = E 1.val + T.val E T E.val = T.val T T * F E.val = E 1.val T.val T F T.val = F.val F ( E ) F.val = E.val F IDENTIFIER F.val = IDENT IF IER.vallex Principe d arbre de syntaxe abstraite Attributs : Valeurs attachées CUP 7

4 Arbres de syntaxe abstraite Définition Classes abstraites Langage C 5 Types, vérification de type Environnement G G B Z B A C Fig. 4 fonction a j o u t e r ( x : nom, t : type, u : Arbre ) : Arbre début s i ( u==null) retourner new Arbre ( x, t, NULL, NULL) ; sinon s i ( x < u. nom) retourner new Arbre ( u. nom, u. type, a j o u t e r ( x, t, u. gauche ), u. d r o i t ) ; sinon s i ( x > u. nom) retourner new Arbre ( u. nom, u. type, u. gauche, a j o u t e r ( x, t, u. d r o i t ) ) ; sinon s i ( x==u. nom) retourner new Arbre ( u. nom, u. type, u. gauche, u. d r o i t ) ; fin Représentation des types 1. Type de base (booléen, caractère, entier, réel), void, error 2. Nom de type 8

3. Constructeur : (a) Tableaux (I, T) (b) Produits (c) Structures (d) Pointeurs (e) Fonctions 4. Variables de type Lors de la compilation : statique, lors de l exécution : dynamique langages fortement typé : programmes sans erreur de type. Graphe de représentation des expressions de type Par un arbre si pas types récursifs caractère caractère pointeur entier Fig. 5 struct { int x ; int y ; int z [ ] ; } Types du langage pseudo C P D ; E D D ; D id : T T char int T[] T* E littéral integer identifier E mod E E[E] *E Vérification dans les expressions 9

array array array int Fig. 6 int a[][][] ; struct int int array int Fig. 7 10

5.1 Equivalence des expressions de type Dans quelle mesure peut-on dire que deux types sont équivalents? Solution simple : fonction Equiv ( s, t ) : booléen début s i s et t sont l e même type de base alors retourner vrai sinon s i s = tableau (s 1, s 2 ) et t = tableau (t 1, t 2 ) alors retourner Equiv (s 1, s 2 ) et Equiv (t 1, t 2 ) sinon s i s = s 1 s 2 et t = t 1 t 2 alors retourner Equiv (s 1, s 2 ) et Equiv (t 1, t 2 )... sinon retourner faux fin Problème : cycles type l i e n = pointer of c e l l u l e ; type c e l l u l e = structure { i n f o : int ; s u i v a nt : l i e n ; } Struct X X info Int suivant pointeur Fig. 8 11

5.2 Coercition, surcharge et polymorphisme Coercition Exemple : { a : int ; b : real ; x : int ; y : real ; x = a + b ; y = a + b ; } E E :e1 op E :e2 { : if e1.type == entier AND e2.type == entier RESULT.type = entier else if e1.type == reel OR e2.type == real RESULT.type = real else RESULT.type = error :} Instr LeftExpr :e1 = Expr :e2 { : if e2.type == entier AND e1.type == real RESULT.code = Aff (RealToInt(e1.code), e2.code)) else if e2.type == real AND e1.type == int RESULT.code = Aff (IntToReal(e1.code), e2.code)) :} Surcharge surcharge : signification différente suivant contexte. exemple : Addition : addition d entiers, de réels, de complexes, concaténation de chaines. Problème : f u n c t i o n foo ( i, j : int ) : real ; f u n c t i o n foo ( i, j : int ) : int ; int int int int int real foo ( 4, 5)??? i : int ; x : real ; 12

foo ( 4, 5) + x ; foo ( 4, 5) + i ; E ID :id { : RESULT.types = rechercher (id) :} E E :e1 (E :e2) { : RESULT.types = {t s, s e2.types s t e1.types} :} Polymorphisme Tout morceau de code que l on peut exécuter avec des arguments de types différents. Exemples : Opérateur & en C Si X est de type T, alors &X est de type pointeur vers T Opérateur [] en C Si X est de type tableau(t, I) et k est de type entier, alors X[k] est de type T On peut développer des fonctions polymorphes pour son propre compte exemple : longueur d une liste # l e t rec long = function [ ] > 0 t : : q > 1 + long q ; ; val long : a l i s t > i n t = <fun> Exemple de polymorphisme :pp. 406 407 P D ; E D D ; D id : Q Q id. Q T T T T T T pointeur(t) liste(t) type ID ( T ) E E ( E ) E, E ID d e r e f : x. p o i n t e u r ( x ) x q : p o i n t e u r ( p o i n t e u r ( e n t i e r ) ) d e r e f ( d e r e f ( q ) ) pointeur(y) = pointeur(pointeur(entier)) ppcu = y, pointeur(entier) pointeur(x) = pointeur(entier) ppcu = x, entier 13

appliquer : x deref : pointeur(x) x appliquer : y deref : pointeur(y) y q : pointeur(pointeur (entier)) Fig. 9 6 Génération de code intermédiaire 7 Organisation de l espace de travail Soit le bloc de mémoire du code compilé : 1. Code cible 2. Données Statiques 3. Pile 4. Tas 7.1 enregistrement d activation Appel d une fonction : un espace est alloué (dans la pile) (p.439) 1. adresse de retour 2. paramètres 3. état machine 4. données locales 5. temporaires adresse de retour : a + 1 où a est l adresse de l appel 7.2 Allocation 14

7.2.1 Allocation statique L adresse consiste à décaler - Taille connue à la compilation - Pas de récursivité! - Pas d allocation dynamique 7.2.2 Allocation en pile - Pas de perte (variables locales supprimées) - Taille connue exemple : protocole d appel des procédures Appel 1. Evalue les arguments 2. Stocke adresse retour 3. Sauvegarde registres et état courant 4. Initialise données locales Retour 1. 2. 3. 4. 5. 6. 7.2.3 Allocation dans le tas 7.3 passage paramètres 1. Valeur Valuer dans enregistrement d activation 2. Référence pointeur 3. Copie-restauration (valeur-résultat) 4. Nom 8 Du code intermédiaire vers le code optimisé 8.1 Arbres canoniques ESEQ, CALL - ordre pertinent 1. Un arbre est réécrit sous la forme d une liste d arbres canoniques sans ESEQ ni SEQ 2. Chaque liste est regroupée dans un bloc basic qui ne contient ni saut ni label 15

3. CJUMP - immédiatement suivi par partie fausse du test 1. Pas de SEQ ou de ESEQ 2. CALL dans EXP(...) ou MOVE(TEMP t,...) 9 Graphe du flot de contrôle 10 Variables d un bloc B1 : a = 0 exemple : B2 : LABEL l 1 b = a+1 c=c+b a=a 2 i f a < n goto l 1 else goto l 2 B3 : LABEL l 2 p r i n t c B1 B2 B2 B2 B2 B3 Une variable est vivante à la sortie d un bloc si elle est utilisée par un bloc que l on peut atteindre depuis ce bloc. Out(B) : vivantes en sortie de B In(B) : vivantes en entrée de B Use(B) = figure dans un membre droit dans B avant de figurer dans un membre gauche ou d être défini Def(B) = figure dans un membre gauche dans B Out(B) = B successeurs de BIn(B ) In(B) = Use(B) (Out(B) Def(B)) Algo : 1. Déterminer Use et Def 2. Initialiser In et Out à 3. L1 : Appliquer les équations 4. si modification, retourner en L1 Exemple 16

L1 : t1=a L2 : t2=b t3=a+b i f ( t1 > t2 ) goto L3 else goto L4 L3 : t2=t2+b t3=t3+c i f ( t2>t3 ) goto L5 else goto L2 L4 : t4=t3 t3 t1=t4+t3 goto L1 L5 : p r i n t ( t1, t2, t3 ) 17