Projet 1 ENS Lyon L3IF



Documents pareils
Compilation (INF 564)

Rappels d architecture

Traduction des Langages : Le Compilateur Micro Java

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

TP1. Outils Java Eléments de correction

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

Projet d informatique M1BI : Compression et décompression de texte. 1 Généralités sur la compression/décompression de texte

Gestion mémoire et Représentation intermédiaire

Java Licence Professionnelle CISII,

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

Introduction aux Machines Virtuelles avec VMKit

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

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

Chapitre I Notions de base et outils de travail

Classes et Objets en Ocaml.

STAGE IREM 0- Premiers pas en Python

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

Cours de Programmation 2

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

Architecture des ordinateurs

NFP 121. Java et les Threads. Présentation : Thierry Escalarasse Mai 2007

Chapitre VI- La validation de la composition.

Initiation. àl algorithmique et à la programmation. en C

Chapitre 2. Classes et objets

Une introduction à Java

Cours 1: Java et les objets

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

Programmation stochastique

ACTIVITÉ DE PROGRAMMATION

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

Initiation à JAVA et à la programmation objet.

Évaluation et implémentation des langages

Perl Console. Votre compagnon pour développer en Perl. Les Journées du Perl , 17 novembre, Lyon. Alexis Sukrieh

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

Cours d introduction à l informatique. Partie 2 : Comment écrire un algorithme? Qu est-ce qu une variable? Expressions et instructions

Cours 1 : La compilation

Vérification formelle de la plate-forme Java Card

C++ COURS N 2 : CLASSES, DONNÉES ET FONCTIONS MEMBRES Classes et objets en C++ Membres d'une classe Spécification d'une classe Codage du comportement

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

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

Département informatique de l université d Angers

ASR1 TD7 : Un microprocesseur RISC 16 bits

La JVM. La machine virtuelle Java. La JVM. La JVM

as Architecture des Systèmes d Information

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

TP1 : Initiation à Java et Eclipse

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

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

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

Algorithmique et Programmation, IMA

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

Calculabilité Cours 3 : Problèmes non-calculables.

Machines virtuelles Cours 1 : Introduction

Institut Supérieure Aux Etudes Technologiques De Nabeul. Département Informatique

Initiation à l algorithmique

LMI 2. Programmation Orientée Objet POO - Cours 9. Said Jabbour. jabbour@cril.univ-artois.fr

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

Conception de circuits numériques et architecture des ordinateurs

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

INITIATION AU LANGAGE JAVA

Présentation du langage et premières fonctions

CM2 L architecture MIPS32

Principes des langages de programmation INF 321. Eric Goubault

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)

Programmation. fonctionnelle, impérative, logique et orientée objet

Outils pour la pratique

Conventions d écriture et outils de mise au point

PG208, Projet n 3 : Serveur HTTP évolué

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

Virtualisation logicielle De la machine réelle à la machine virtuelle abstraite

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

contact@nqicorp.com - Web :

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

TP3 : Manipulation et implantation de systèmes de fichiers 1

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

Les structures de données. Rajae El Ouazzani

Programmation assembleur : aperçu

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

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

Chapitre 1 : La gestion dynamique de la mémoire

Formula Negator, Outil de négation de formule.

Machines virtuelles fonctionnelles (suite) Compilation ML Java

Théorie des Langages

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

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

Les structures. Chapitre 3

Introduction à MATLAB R

Structure d un programme

Cette application développée en C# va récupérer un certain nombre d informations en ligne fournies par la ville de Paris :

1 Description générale de VISFIELD

Programmation Web. Madalina Croitoru IUT Montpellier

Java c est quoi? Java pourquoi?

Générer du code à partir d une description de haut niveau

Cours d Algorithmique et de Langage C v 3.0

Programmer en JAVA. par Tama

Construire des plug-ins pour SAS Management Console SAS 9.1

La technologie Java Card TM

Architecture des ordinateurs TD1 - Portes logiques et premiers circuits

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

Transcription:

Projet 1 ENS Lyon L3IF Génération de code Sébastien Briais 8 janvier 2008 Dans cette partie, vous allez devoir implémenter le générateur de code pour l émulateur DLX risc-emu. À rendre pour le 18 janvier 2008 à minuit au plus tard. 1 Consignes générales Votre compilateur devra pouvoir être invoqué à l aide de la commande dreic dans un terminal. Il prendra en argument un paramètre indiquant la phase du compilateur testée suivi du nom de fichier drei à compiler. Un exemple typique d utilisation est :./dreic -generator Factorial.drei Les noms des phases sont indiqués ci-après : Nom de la phase Analyse lexicale Analyse syntaxique Construction de l arbre Analyse des types Génération de code Nom de l option -scanner -parser -printer -analyser -generator En outre, pour le rendu de votre projet, Vos sources devront être obligatoirement accompagnées d un fichier Makefile permettant de construire votre projet. Optionnellement, vous pouvez aussi joindre un fichier README pour y reporter vos remarques éventuelles sur le fonctionnement ou la compilation de votre programme. Avec un peu de chance, il sera lu :p Vous devrez rendre vos sources sous forme d une archive tar gzippée. Le contenu de votre archive devra se décompresser dans un répertoire portant le nom de votre groupe (i.e. B1, R3,...) L archive devra m être envoyée par mail. Le titre de votre mail sera de la forme [PROJET] Etape 4 1

2 À propos de l émulateur DLX Le jeu d instruction du processeur est décrit dans le document situé à l URL suivante : http://tinyurl.com/2rskh7. La version caml de l émulateur RISC est située aux endroits suivants : /home/sbriais/bin/risc-emuf (version bytecode caml) /home/sbriais/bin/risc-emuf.opt (version bytecode caml) La version Java de l émulateur RISC est située aux endroits suivants : /home/sbriais/bin/risc-emu (version en ligne de commande) /home/sbriais/bin/risc-gui (version avec GUI) Les sources de la version caml sont disponibles à l URL suivante : http: //tinyurl.com/3azhlx. Comme expliqué en cours, la version caml est plus souple au niveau de la gestion des labels mais est moins conviviale que la version graphique en Java. Il sera donc plus facile pour vous de générer du code pour la version caml mais pour déboguer votre générateur de code, vous préférerez sans doute utiliser la version Java. La version caml permet de prémâcher le code DLX fourni en entrée pour donner du code DLX accepté par la version Java (flag -dump). Par exemple, si le fichier source.asm contient le code DLX suivant (pas accepté par la version Java de l émulateur) : classa: DATA A_f DATA A_g A_f: RET R31 A_g: RET R31 Alors risc-emuf.opt -dump source.asm vous donnera : DW 8 DW 12 RET 31 RET 31 qui est accepté par la version Java. Enfin, comme mentionné en cours, faites attention : la signification des flags n est pas forcément la même entre la version caml et la version Java. 3 Description de l étape 3.1 Organisation des registres en pile Pour une allocation basique des registres, on les organise en pile. Il est pratique d implémenter les fonctions suivantes : ( a l l o u e un nouveau r e g i s t r e et l e p l a c e au sommet de l a p i l e ) val freshreg : u nit > r e g i s t e r ( l i b e r e l e r e g i s t r e en sommet de p i l e ) 2

val dropreg : u nit > unit ( r e n v o i e l e r e g i s t r e en haut de l a p i l e ) val topreg : unit > r e g i s t e r ( r e n v o i e l e deuxieme r e g i s t r e a p a r t i r du haut de l a p i l e ) val sndreg : u nit > r e g i s t e r où le type register peut simplement êtré défini par : type r e g i s t e r = i n t 3.2 Gestion des blocs d activation Pour pouvoir accéder aux variables locales et aux paramètres des fonctions, votre générateur de code va tenir à jour en permanence la taille du bloc d activation courant. Ainsi, vous pourrez vous passer de la manipulation explicite d un registre FP (frame pointer). Je vous suggère les fonctions suivantes pour vous faciliter la vie : ( a l l o u e n o c t e t s dans l e bloc courant ) val incframesize : i n t > unit ( l i b e r e n o c t e t s dans l e bloc courant ) val decframesize : i n t > unit ( r e n v o i e l a t a i l l e du bloc courant ) val getframesize : unit > i n t L idée est qu à chaque fois que vous générez une instruction qui modifie le pointeur de pile (à savoir le registre R30), vous devez appeler la fonction correspondante mettant à jour la taille du bloc d activation courant. 3.3 Extension des symboles Vous allez étendre le type des symboles pour contenir des informations nécessaires à la génération de code : Un symbole de variable contiendra l offset par rapport à FP pour accéder à sa valeur. Un symbole de champ contiendra l offset par rapport au début de l adresse d un objet pour accéder à sa valeur (n oubliez pas de compter un champ supplémentaire pour stocker l adresse de la VMT) Un symbole de méthode contiendra l offset de la méthode par rapport au début de la table de méthode virtuelle. Un symbole de classe contiendra un label qui indiquera l endroit où la table de méthode virtuelle (VMT) se trouve en mémoire. Concrètement, cela revient à modifier les types des symboles comme ceci : type var symbol = { var type : dtype ; mutable v a r o f f s e t : i n t option ; 3

and f i e l d s y m b o l = { f i e l d t y p e : dtype ; mutable f i e l d o f f s e t : i n t option ; and method symbol = { params type : dtype l i s t ; r e t u r n t y p e : dtype ; ( o f f s e t dans l a VMT ) mutable m e t h o d o f f s e t : i n t option ; ( debut du code de l a methode ) mutable method label : l a b e l option ; and c l a s s s y m b o l = { parents : s t r i n g l i s t ; f i e l d s : f i e l d s c o p e ; methods : method scope ; mutable c l a s s l a b e l : l a b e l option ; type où le type label peut simplement êtré défini par : l a b e l = s t r i n g Vous aurez probablement besoin d une fonction pour générer des nouveaux labels. val n e w l a b e l : unit > l a b e l 3.4 Génération du code Une bonne manière d aborder cette étape est d ajouter progressivement chaque aspect du langage drei. Par ordre de difficulté croissante, vous avez : Les entrées/sorties. Les expressions arithmétiques. Les classes (sans les méthodes) et les objets. Les blocs et les variables locales. Le if et le while. Les conditions. Les méthodes. Concrètement, vous aurez trois fonctions mutuellement récursives pour générer le code des expressions, des conditions et des énoncés. ( genere l e code evaluant l e x p r e s s i o n et p l a c e l e r e s u l t a t dans RSP ) val g e n e r a t e e x p r e s s i o n : e x p r e s s i o n > unit ( genere l e code d une c o n d i t i o n. Saute au l a b e l s i l a c o n d i t i o n vaut l e booleen passe en argument ) val g e n e r a t e c o n d i t i o n : l a b e l > bool > e x p r e s s i o n > unit ( genere l e code correspondant a l enonce donne ) val g e n e r a t e s t a t e m e n t : statement > unit 4

Pour générer le code d un membre d une classe (méthode ou champ), vous aurez la fonction suivante : val generate member : member > unit Le code pour générer une définition de classe sera alors simplement une suite d appels à la fonction generate member. val g e n e r a t e c l a s s : c l a s s > unit Le code pour générer la VMT qui correspond à une classe sera implémenté par : val generate vmt : c l a s s > unit C est cette fonction qui se chargera d attribuer un label pour le symbole de classe, un label pour chacun des symboles de méthodes et qui calculera les offsets de chacun des symboles de champs. Enfin, le code d un programme sera généré par : val generate program : program > unit 3.5 Initialisation de l émulateur Pour rappel, le code que vous allez générer aura la structure suivante : start: BEQ R0 init // saute au code d initialisation vmts:... // les VMTs des classes methods:... // le code des methodes main:... // le code de l expression principale RET R0 // quitte l emulateur init: SYSCALL R30 0 13 // initialise le pointeur de pile ORIU R1 R0 ((init >> 16) & 0xffff) LSHI R1 R1 16 ORIU R1 R1 (init & 0xffff) // le tas commence en init SUB R2 R30 R1 // taille memoire sans le code DIVIU R2 R2 (3*4) // coupe en trois morceaux LSHI R2 R2 1 // deux tiers pour le tas ORIU R3 R0 30 // registre de pile = R30 LSHI R3 R3 27 OR R2 R2 R3 SYSCALL R1 R2 11 // initialise le GC BEQ R0 main // saute a l expression principale Attention, le code ci-dessus est accepté uniquement par la version caml de l émulateur DLX. 5

4 Extensions Je propose ci-dessous quelques extensions. J apprécierais que les groupes de type B essaient d en réaliser au moins une. Clairement, toutes ne font pas le même poids en terme de travail à fournir. Si vous avez d autres extensions à proposer, n hésitez pas à m en parler. Encore une fois, je conseille la lecture de l excellent livre de Andrew Appel Modern Compiler Implementation in... pour vous aider à réaliser ces extensions. Les extensions qui me semblent intéressantes sont les suivantes : Écrire un vrai allocateur de registres. Écrire un garbage collector pour ne plus devoir se reposer sur celui fourni par l émulateur DLX. Optimiser les appels de méthodes quand on peut connaitre statiquement l instance de la méthode qui doit être appelée. Ajout de la coercition et du typage dynamique. Certains langages objet tels que Java disposent d un mécanisme permettant : de tester dynamiquement de quelle classe un objet est une instance (isinstanceof), de coercer le type statique d une classe vers quelque chose de plus précis, c est-à-dire un sous type du type statique, et de générer une erreur dynamique si cette coercition s avère finalement impossible (asinstanceof). Ce mécanisme, très utilisé dans des langages avec des systèmes de types «pauvres» (comme Java 1.4), peut également être ajouté à drei. Il faudra ici étendre la syntaxe de drei pour autoriser ces constructions, étendre le système de type et étendre le générateur de code. Ajout des tableaux. Autoriser des champs mutables dans les objets. 6