Gestion mémoire et Représentation intermédiaire



Documents pareils
Compilation (INF 564)

Traduction des Langages : Le Compilateur Micro Java

Cours 1 : La compilation

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

Java Licence Professionnelle CISII,

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Machines virtuelles fonctionnelles (suite) Compilation ML Java

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Rappels d architecture

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

Programmer en JAVA. par Tama

Initiation à l algorithmique

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

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

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

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

Architecture des ordinateurs

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

Assembleur. Faculté I&C, André Maurer, Claude Petitpierre

Quelques patterns pour la persistance des objets avec DAO DAO. Principe de base. Utilité des DTOs. Le modèle de conception DTO (Data Transfer Object)

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

Arbres binaires de recherche

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

UE C avancé cours 1: introduction et révisions

as Architecture des Systèmes d Information

Bases de programmation. Cours 5. Structurer les données

Les structures de données. Rajae El Ouazzani

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

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

Classes et Objets en Ocaml.

Conventions d écriture et outils de mise au point

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

1. Structure d'un programme FORTRAN 95

Cours de Programmation 2

Table des matières PRESENTATION DU LANGAGE DS2 ET DE SES APPLICATIONS. Introduction

Chapitre VI- La validation de la composition.

Conception de circuits numériques et architecture des ordinateurs

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

Lambda! Rémi Forax Univ Paris-Est Marne-la-Vallée

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

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

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

Présentation du PL/SQL

1 Architecture du cœur ARM Cortex M3. Le cœur ARM Cortex M3 sera présenté en classe à partir des éléments suivants :

TP1 : Initiation à Java et Eclipse

Table des matières Avant-propos... V Scripting Windows, pour quoi faire?... 1 Dans quel contexte?

Vérification formelle de la plate-forme Java Card

Anne Tasso. Java. Le livre de. premier langage. 10 e édition. Avec 109 exercices corrigés. Groupe Eyrolles, , ISBN :

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

Corrigé des TD 1 à 5

C++ Programmer. en langage. 8 e édition. Avec une intro aux design patterns et une annexe sur la norme C++11. Claude Delannoy

Représentation d un entier en base b

Resolution limit in community detection

Qualité du logiciel: Méthodes de test

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

Cours d algorithmique pour la classe de 2nde

Cours de C. Petits secrets du C & programmation avancée. Sébastien Paumier

Environnements de développement (intégrés)

Travaux Pratiques de Commande par ordinateur 1 TRAVAUX PRATIQUES

Programmation en Caml pour Débutants

Application 1- VBA : Test de comportements d'investissements

Algorithmique, Structures de données et langage C

CM2 L architecture MIPS32

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

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

Le Langage C Version 1.2 c 2002 Florence HENRY Observatoire de Paris Université de Versailles florence.henry@obspm.fr

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

Tutoriel: Création d'un Web service en C++ avec WebContentC++Framework

Gestion hybride de la mémoire dynamique dans les systèmes Java temps-réel

Algorithmique et Programmation, IMA

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

Claude Delannoy. 3 e édition C++

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

Brefs rappels sur la pile et le tas (Stack. / Heap) et les pointeurs

Outils pour la pratique

Projet gestion d'objets dupliqués

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

Cours Informatique Master STEP

Le langage C. Séance n 4

Derrière toi Une machine virtuelle!

ACTIVITÉ DE PROGRAMMATION

ARDUINO DOSSIER RESSOURCE POUR LA CLASSE

Machines virtuelles. Brique ASC. Samuel Tardieu Samuel Tardieu (ENST) Machines virtuelles 1 / 40

Java et les bases de données: JDBC: Java DataBase Connectivity SQLJ: Embedded SQL in Java. Michel Bonjour

Programmation système I Les entrées/sorties

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Programmation VBA/Excel. Programmation VBA. Pierre BONNET. Masters SMaRT & GSI - Supervision Industrielle P. Bonnet

Java 1.5 : principales nouveautés


Principes des langages de programmation INF 321. Eric Goubault

Introduction aux concepts d ez Publish

Auto-évaluation Programmation en Java


MIS 102 Initiation à l Informatique

Seance 2: En respectant la méthode de programmation par contrat, implémentez les autres fonctions de jeu.

Logiciel de base. Première année ENSIMAG

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

Contraintes, particularités. 1. Généralités Gestion de la mémoire a. Type des variables et constantes... 2

Déroulement. Evaluation. Préambule. Définition. Définition. Algorithmes et structures de données 28/09/2009

Cours 1 : Qu est-ce que la programmation?

Transcription:

Gestion mémoire et Représentation intermédiaire Pablo de Oliveira <pablo.oliveira@uvsq.fr> March 23, 2015

I Gestion Memoire

Variables locales Les variables locales sont stockées: Soit dans un registre, 1 cycle latence Soit sur la pile (mémoire), 2-100 cycles latence Stratégie: utiliser les registres le plus possible

Problème: pas assez de registres L allocateur de registres maximise le nombre de variables stockées dans des registres Si les registres viennent à manquer les variables sont temporairement stockées sur la pile Certaines variables doivent être stockées sur la pile

Organisation de la pile (Tiger)

Variables qui échappent On dit qu une variable échappe lorsqu elle peut être accédée en dehors de sa portée. function f1() : int = let /* a est locale dans f1()... */ var a := 42 /*... mais accédée depuis f2() */ function f2() = a := a + 1 in f2() ; a end L allocation de registres est locale à une fonction. Après un appel, éventuellement récursif, les registres peuvent changer et ne plus contenir la valeur de a. a échappe et doit être stockée sur la pile

Détection des variables qui échappent Un visiteur d arbre compare pour chaque variable la profondeur de sa déclaration et de son utilisation Une variable déclarée à une profondeur différente échappe

Gestion mémoire des variables échappées Le compilateur rajoute un paramètre supplémentaire spécial static link à chaque fonction. Le static link pointe vers le frame pointer de la fonction contenante. Il permet au contenu d accéder aux variables dans la pile du conteneur.

Comment remonter plusieurs scopes? function f1() : int = let var a := 42 function f2() = let function f3() = a := a + 1 in f3() end in f2() ; a end Ici on doit remonteur deux niveaux d imbrication. Chaque fonction stocke le static link de la fonction contenante sur sa pile. La fonction f3() peut donc remonter la chaîne de static link pour accéder à a dans f1().

Attention: le static link est Statiquement calculé 1 function f1() : int = 2 let 3 var a := 42 4 function f2( b : int ) : int = 5 if b = 0 then a else f2(b-1) + a 6 in 7 f2(10) 8 end L appel f2(10) en ligne 7 est remplacé par f2(fp, 10) L appel f2(b-1) en ligne 5 est remplacé par f2(mem(fp), 10) et non pas f2(fp, 10). Pourquoi?

Calcul du Static link d = profondeur(appel) - profondeur (appellé) si d < 0, alors on passe notre SL. Si d >= 0, alors on remonte d + 1 SL f1() { f2() { f3() { f1() ---> niveau 3 appele niveau 1, d = 2 } 3 niveaux à remonter } sl = MEM(MEM(MEM(fp))) f1() ---> niveau 1 appele niveau 1, d = 0 1 niveau à remonter sl = MEM(fp) f2() ---> niveau 1 appelle niveau 2, d < 0 pas de niveau à remonter } sl = fp

Exercice Quels static links sont passés pour chaque appel de fonction? 1 function f1() : int = 2 let 3 var a := 41 4 function f2() : int = 5 let 6 function f3() : int = 7 let function f4() = 8 a := 0 9 in f4(); 10 f2() end 11 in 12 f2(); 13 a 14 end 15 in 16 f2()

À quelle adresse mémoire aller chercher a? 1 function f1() : int = 2 let 3 var a := 41 4 function f2() : int = 5 let 6 function f3() : int = 7 let function f4() = 8 a := 0 9 in f4(fp); # 3-4 < 0 10 f2(mem(mem(fp))) end # 3-2 = 1 11 in 12 f2(mem(fp)); # 2-2 = 0 13 a 14 end 15 in 16 f2(fp) # 1-2 < 0 17 end

A quelle adresse mémoire aller chercher a? 1 function f1() : int = 2 let 3 var MEM[FP-4] := 41 <---------. <--. 4 function f2() : int = 5 let 6 function f3() : int = 7 let function f4() = 8 MEM[(MEM(MEM(MEM(fp)))-4] := 0 #---------' 9 in f4(fp); 10 f2(mem(mem(fp))) end 11 in 12 f2(mem(fp)); 13 MEM[(MEM(fp)-4)] + 1 #-----------------' 14 end 15 in 16 f2(fp) 17 end

Tableaux et structures Dans Tiger, les tableaux et structures sont allouées sur le tas. On utilise un équivalent système de la fonction malloc() pour obtenir un nouveau segment de mémoire. Une variable tableau ou structure est un pointeur vers le segment alloué. Les tableaux et structures sont passés par référence (et non par valeur). Dans Tiger, il n y a pas de désallocation mémoire pour les structures et tableaux.

Implémentation dans Tiger La phase de traduction en RI doit pouvoir allouer des variables locales dans une fonction. Il est trop tôt pour décider exactement où elles sont stockées: L allocateur de registres est en fin du compilateur. Mais on ne sait pas toujours si elles seront dans un registre ou sur la pile. L organisation de la pile est propre à chaque architecture. On utilise la classe Abstraite Frame On crée un objet Frame pour chaque nouvelle fonction On alloue des variables en utilisant Access Frame.alloc(bool is_escape_var); qui nous retourne un objet de type Access. Access nous permet de manipuler des variables locales en déférant à plus tard le choix du stockage (registre, pile).

Comment est implémenté Access Si la variable échappe, on sait qu elle ira sur la pile. L objet Frame réserve une case dans la pile pour stocker la variable Access.getExp(Exp fp) retourne une expression de type Mem(Binop(-, fp, Const(position)) Si la variable n échappe pas, on ne sait pas encore. L objet Frame crée un nom unique, par exemple, t127. Access.getExp(Exp fp) retourne une expression de type TempExp(t127) L allocateur de registre choisira de stocker t127 dans un vrai registre ou sur la pile.

Généricité Un code bien structuré et modulaire limite les dépendances inutiles. La traduction IR n a pas à ce soucier de l implémentation de la pile qui est propre à chaque architecture (rôle du Backend). Pourtant elle doit créer des Objets Frame différents pour chaque Architecture ciblée: FrameMips, FrameArm. Comment faire?

Design pattern: Factory On déclare une interface Builder qui permet de fabriquer des objets de type Frame. Le module de traduction dépend que des interfaces génériques Builder et Frame Mais il reçoit en argument une implémentation concrète de Builder, par exemple ArmBuilder. Maintenant il peut appeler la fonction Builder.newFrame() et il obtiendra des Frame de type Arm. Cette encapsulation est bonne et facilite la maintenance et le déboggage du projet. Parce que le module de traduction ne sait pas le type de Frame qu il manipule, il ne peut pas aller fouiller dans l implémentation du backend, ce qui produirait du code non-générique, inmaintenable.

II Traduction en Représentation Intermédiaire

Choix d une représentation intermédiaire Doit être simple et se débarrasser du sucre syntaxique. Doit conserver suffisamment d informations pour être optimisable. Il faut arriver à des compromis. eg. Doit-on conserver des expressions de tableau? Oui: facilite l analyse de dépendances Non: complique la propagation de constantes, la réduction de force, etc.

Tree Langage intermédiaire sous forme d arbre Utilisation de temporaires (infinité de registres) Jump conditionnel à deux branches

Grammaire de Tree Exp ::= "const" int name "temp" Temp "binop" Oper Exp Exp "mem" Exp "call" name [{Exp}] "eseq" Stm Exp Stm ::= "move" Exp Exp "sxp" Exp "jump" name "cjump" Relop Exp Exp name name "seq" [{Stm}] "label" Label name ::= "name" Label Oper ::= "+" "-" "*" "/"

Exemple de Tree: 1 + 2 * 5 seq label main # fonction main move # sauve le FP temp x1 temp fp move # met à jour le FP temp fp temp sp move # réserve une case sur la pile temp sp binop (-) temp sp const 4 move # écrit le SL mem temp fp temp i0 move temp rv eseq sxp # 1 + 2 * 5 binop (+) const 1 binop (*) const 2 const 5 const 0 # retour = 0 move temp sp # restaure SP temp fp move temp fp # restaure FP temp x1 label end seq end

Traduction des expressions Visiteur AST Parcourir l arbre en remplaçant les expressions les plus profondes par des arbres traduits. AST -> RI TREE

Traduction des expressions (1/3) La traduction dépend du contexte. Exemple: a < b? Si le contexte est if a < b then... else... cjump(<, a, b, truelabel, falselabel)

Traduction des expressions (2/3) La traduction dépend du contexte. Exemple: a < b? Si le contexte est t = a < b eseq (seq ( cjump (a < b, ltrue, lfalse), label ltrue move temp t, const 1 jump lend label lfalse move temp t, const 0 label lend), temp t)

Traduction des expressions (3/3) La traduction dépend du contexte. Exemple: a < b? Si le contexte est (a < b, ()) seq(sxp(a), sxp(b))

Comment résoudre le problème? Notre Visiteur d AST traduit l arbre en commençant par les expressions les plus profondes. Le contexte n est pas encore connu lorsque l on traduit a<b. Idée: Retarder la traduction.

Coquilles: Shell Au lieu de faire la traduction directement on retourne des coquilles, où Shell: Ex Expression Shell, retarde une expression Nx Statement Shell, retarde un statement Cx Condition Shell, retarde un test conditionnel unnx unex uncx(t,f) Ex(e) sxp(e) e cjump(<>, e, 0, t, f) Cx(a<b) seq(sxp(a), sxp(b) eseq(t (a<b), t) cjump(<, a, b, t, f) Nx(s) s error error

Traduction While while condition do body label test cjump(!condition, done, continue) label continue body jump test label done

Exercice: Traduction For Comment traduire le programme for i:= low to high do body

Exercice: Traduction For Comment traduire le programme for i:= low to high do body Votre traduction marche-t-elle lorsque high = 2 31 1?

Exercice: Traduction For let i := min limit := max in if (i > limit) goto end loop: body if (i >= limit) goto end i = i + 1 goto loop end:

Optimisations des IFs (1/3) if a b then tlab else flab est remplacé par if (if a then 1 else b) then tlab else flab qui va être compilé vers une cascade de sauts. CJUMP(a, lab1, lab2) lab1: t <- 1 JUMP(out) lab2: t <- b out: CJUMP(t, tlab, flab)...

Optimisations des IFs (2/3) Ce serait plus efficace de remplacer if (if a then 1 else b) then tlab else flab par if a then tlab else (if b then tlab else flab) qui sera compilé vers une cascade de sauts plus courte. CJUMP(a, tlab, lab2) lab2: CJUMP(b, tlab, flab)

Optimisations des IFs (3/3) Pour implémenter cette optimisation, il faut rajouter un troisième shell Ix. Ix nous permet de retarder la compilation des Ifs. Lorsque qu un Ix est compilé à l intérieur d un autre Ix, on peut faire l optimisation ci-dessus.

III Structures de données

Traduction des tableaux (ArrayExp) Appel à la primitive initarray Retourne un pointeur vers un segment mémoire initialisé à la valeur par défault

Traduction des structures (RecordExp) Appel à la primitive malloc pour allouer autant de cases que nécessaire Compiler les Move qui vont bien pour initialiser la structure.