Interprétation/Génération de code pour le langage Z minimal Pr ZEGOUR DJAMEL EDDINE Ecole Supérieure d’Informatique (ESI)
Interprétation/Génération de code pour le langage Z minimal : Introduction Une fois la sémantique réalisée, il reste à générer le code à partir de la forme interne ou interpréter directement la forme interne. Génération de code Code d’une machine virtuelle Langage d’assemblage d’une machine donnée Langage binaire d’une machine donnée Interprétation Exécuter la forme intermédiaire avec un langage de programmation (Pascal, C,..) : Spécifique à un type de machines Portabilité
Interprétation/Génération de code pour le langage Z minimal : Introduction La génération de code implique la connaissance du code cible Il s’agit de remplacer la forme interne ( ensemble de table et paramètres ) par un code exprimé dans le langage cible. ( Une fois le code généré, on a plus besoin des tables) Ou mieux encore: Dans la phase sémantique, au lieu de générer les quadruplets, on génère directement le code. ( Compilateur à une passe ) On a tendance à confondre Sémantique et Génération de code.
Interprétation/Génération de code pour le langage Z minimal : Résultats (Sémantique) SOIT A, B, C DES ENTIERS ; Res UN ENTIER ; DEBUT LIRE ( A ) ; B := 5 ; C := 12 ; Res :=((A+B) / C) + ( B-C ) ; ECRIRE ( Res ) FIN ‘5’ ‘12’ TABCONS 0 1 En fin de compilation, programme source = table des quadruplés + TABOB + TABCONS + TABCOMP + LONGZDD ‘L’‘E’0 ‘L’‘E’1 ‘L’‘E’2 ‘L’‘E’3 ‘C’‘E’0 ‘C’‘E’1 ‘X’‘E’4 ‘X’‘E’5 ‘X’‘E’6 ‘X’‘E’ TABOB 8 LONGZDD 3 4 Quadruplés générés ‘DE’ ‘Lire’01 ‘Aff’14 25 ‘+E’016 ‘/E’627 ‘-E’128 ‘+E’789 ‘Aff’39 ‘Ecrire’ TABCOMP 0 1
Interprétation/Génération de code pour le langage Z minimal : Algorithme général - Allocation de la zone de données // tableau d’adresses de longueur LONGZDD - Conversion des constantes numériques, allocation d’espace pour les constantes et rangement des adresses dans un tableau - Pour chaque quadruplé (Cop, P1, P2, P3) faire : Selon le code - récupérer les données dans les tables de compilation - traiter le quadruplé Finpour - Libération de l’espace mémoire utilisée par la zone de données et les objets du programme
Interprétation/Génération de code pour le langage Z minimal : Environnement Nil … Zone de données (ZDD) … CONST Allocation de la zone de données : tableau d’adresses de longueur LONGZDD : Conversion des constantes numériques, allocation d’espace pour les constantes et rangement des adresses dans un tableau Constante 2 Constante 1 Espace mémoire pour les variables,constantes, … Constante n ( Doit être initialisée à Nil )
Interprétation/Génération de code pour le langage Z minimal : Stratégie d’allocation Pour l’instant il existe 3 types d’objets ‘L’ : variable locale ( Entière ) ‘C’ : constante ‘X’ : variable temporaire créée par le compilateur (Entière ou Booléenne) L’espace pour les variables locales est alloué au début à la rencontre des quadruplés ‘DE’ L’espace pour les constantes est aussi alloué au début à l’initialisation de l’environnement d’exécution. L’espace pour les auxiliaires est alloué quand on leur affecte une valeur pour la première fois. Si l’adresse d’un auxiliaire est Nil, il y a allocation de l’espace pour celle ci ( sinon, l’espace est déjà alloué)
Interprétation/Génération de code pour le langage Z minimal : Déclaration Soit ZDD le tableau d’adresses représentant la zone de données - Allocation d’un espace mémoire pour un entier ADR - Récupérer de TABOB l’adresse relative de Pt1 dans la zone de données D // L’adresse réelle est ZDD [ D ] - Ranger dans ZDD [ D ] l’adresse ADR (‘DE’, Pt1,, )
Interprétation/Génération de code pour le langage Z minimal : Expression Soit ZDD le tableau d’adresses représentant la zone de données Cas des opérations binaires - Récupérer de TABOB l’adresse relative de Pt1 dans la zone de données D1 ; L’adresse réelle est Adr_Pt1 = ZDD [ D1 ] - Récupérer de TABOB l’adresse relative de Pt2 dans la zone de données D2 ; L’adresse réelle est Adr_Pt2 = ZDD [ D2 ] - Récupérer de TABOB l’adresse relative de Pt3 dans la zone de données D3 ; L’adresse réelle est Adr_Pt3 = ZDD [ D3 ] - Effectuer l’opération ‘Cop’ entre les contenus de Adr_Pt1 et Adr_Pt2 - Ranger le résultat dans Adr_Pt3 (***) *** : si Adr_Pt3=Nil, allocation d’un espace d’adresse Adr_Pt3 (Oper, Pt1, Pt2, Pt3 ) Oper dans { ‘+E’, ‘-E’, ‘*E’, ‘/E’ }
Interprétation/Génération de code pour le langage Z minimal : Expression Soit ZDD le tableau d’adresses représentant la zone de données Cas des opérations unaires - Récupérer de TABOB l’adresse relative de Pt1 dans la zone de données D1 ; L’adresse réelle est Adr_Pt1 = ZDD [ D1 ] - Récupérer de TABOB l’adresse relative de Pt2 dans la zone de données D2 ; L’adresse réelle est Adr_Pt2 = ZDD [ D2 ] - Effectuer l’opération ‘Cop’ sur le contenu de Adr_Pt1 - Ranger le résultat dans Adr_Pt2 (***) *** : si Adr_Pt2=Nil, allocation d’un espace d’adresse Adr_Pt2 (Oper, Pt1,, Pt2 ) Cop dans { ‘+U’, ‘-U’ }
Interprétation/Génération de code pour le langage Z minimal : Affectation Soit ZDD le tableau d’adresses représentant la zone de données - Récupérer de TABOB l’adresse relative de Pt1 dans la zone de données D1 L’adresse réelle est Adr_Pt1 = ZDD [ D1 ] - Récupérer de TABOB l’adresse relative de Pt2 dans la zone de données D2 L’adresse réelle est Adr_Pt2 = ZDD [ D2 ] - Ranger dans Adr_Pt1 le contenu de Adr_Pt2 (***) *** : si Adr_Pt1=Nil, allocation d’un espace d’adresse Adr_Pt1 (‘Aff’, Pt1,,Pt2 )
Interprétation/Génération de code pour le langage Z minimal : Lecture Soit ZDD le tableau d’adresses représentant la zone de données Pour i:= 0 à N-1 - Objet := TABCOMP [Pt+i] - Récupérer de TABOB l’adresse relative de Objet dans la zone de données D L’adresse réelle est Adr_Objet = ZDD [ D ] - Lire la donnée dans une variable DONNEE - Ranger DONNEE dans Adr_Objet Finpour (‘Lire’, Pt,N, )
Interprétation/Génération de code pour le langage Z minimal : Écriture Soit ZDD le tableau d’adresses représentant la zone de données Pour i:= 0 à N-1 - Objet := TABCOMP [Pt+i] - Récupérer de TABOB l’adresse relative de Objet dans la zone de données D L’adresse réelle est Adr_Objet = ZDD [ D ] - Écrire le contenu de Adr_Objet Finpour (‘Ecrire’, Pt,N, )
Interprétation/Génération de code pour le langage Z minimal : Implémentation Module Alloc(Type de l’objet) adresse de l’espace alloué, Nil si Échec