Sommaire Définition du langage d’expérimentation Compilateur pour le langage Z minimal Extensions du langage Z minimal
Chapitre précédent Chapitre 10 : Interprétation/Génération de code
10.3 Environnement d’exécution
10.5 Interprétation des quadruplets
10. 1 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.
Pour la génération de code, on peut choisir:
- le code d’une machine virtuelle,
- le langage d’assemblage d’une machine donnée,
- le langage binaire d’une machine donnée.
Le premier assure la portabilité. Les deux derniers sont spécifiques à un type de machine. La génération de code implique la connaissance du code cible. Il s’agit de remplacer la forme interne ( ensemble de tables et paramètres ) par un code exprimé dans le langage cible. Une fois le code généré, on a plus besoin des tables.
Pour l’interprétation, il s’agit d’exécuter la forme intermédiaire avec un langage de programmation (Pascal, C, ..).
Il est à remarquer que dans la phase sémantique, au lieu de générer les quadruplets, on peut générer directement le code. C’est ce qu’on appelle compilateur à une passe. Dans ce cas, on a tendance à confondre sémantique et génération de code.
Pour notre propos, nous avons opté pour un interpréteur.
10.2 Algorithme
La figure 12 montre les résultats de la phase sémantique, appliquée à un programme source donné, exprimés sous forme de tables. L’interpréteur prend quadruplet par quadruplet et en fonction du type du quadruplet il réalise l’opération correspondante.
Figure 12: Tables de compilation (Programme)
L’algorithme général de l’interpréteur est le suivant:
- Allocation de la zone de données. C’est un 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 quadruplet (Cop, P1, P2, P3) faire :
Selon le code Cop
- Récupérer les données se trouvant dans les tables de compilation.
- Traiter le quadruplet.
Finpour
- Libération de l’espace mémoire utilisée par la zone de données et les objets du programme.
10.3 Environnement d’exécution
La figure 13 montre l’environnement d’exécution avant l’interprétation des quadruplets. Il y a allocation de la zone de données qui est en fait un tableau d’adresses de longueur LONGZDD. De plus, il y a conversion des constantes numériques, allocation d’espace pour les constantes et rangement des adresses dans un tableau CONSTANTES. Les constantes sont mises dans le tas qui est l’espace mémoire réservé pour tous les objets du programme.
Il ne faut pas confondre TABCONS qui est une table créée lors de la compilation et CONSTANTES qui est une table créée à l’exécution. L’interpréteur opère sur cette dernière table.
Figure 13: Environnement d’exécution
10.4 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 du quadruplet (‘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 (temporaire) est Nil, il y a allocation de l’espace pour cet auxiliaire, sinon, cela veut dire que l’espace est déjà alloué.
L’interpréteur utilise le module
Alloc(Type de l’objet)
qui alloue un emplacement selon Type de l’objet et rend l’adresse de l’espace alloué, Nil si échec.
Exemples
A1 = Alloc(‘E’) alloue un espace pour ranger un entier et rend dans A1 l’adresse de cet espace..
A2 = Alloc(‘T’) alloue un espace pour ranger un tableau et rend dans A2 l’adresse de cet espace.
10.5 Interprétation des quadruplets
Nous donnons ci-après les interprétations des différents types de quadruplets considérés jusque là.
Déclaration
Pour l’instant, il y a un seul type de quadruplet relatif aux déclarations de variables. C’est le quadruplet (‘DE’, Pt1, , ). il est interprété comme suit:
Soit ZDD le tableau d’adresses représentant la zone de données.
- Allocation d’un espace mémoire pour un entier. Soit ADR son adresse.
- Récupérer de TABOB l’adresse D relative de Pt1 dans la zone de données.
// L’adresse réelle est donc ZDD [ D ]
- Ranger dans ZDD [ D ] l’adresse ADR.
Expression
L’interprétation est faite selon la nature du quadruplet.
- Cas des opérations arithmétiques binaires
Le quadruplet est de la forme (Oper, Pt1, Pt2, Pt3 ) avec Oper dans { ‘+E’, ‘-E’, ‘*E’, ‘/E’ }
Soit ZDD le tableau d’adresses représentant la zone de données.
- Récupérer de TABOB l’adresse relative D1 de Pt1 dans la zone de données. L’adresse réelle est Adr_Pt1 = ZDD [ D1 ] .
- Récupérer de TABOB l’adresse relative D2 de Pt2 dans la zone de données. L’adresse réelle est Adr_Pt2 = ZDD [ D2 ] .
- Récupérer de TABOB l’adresse relative D3 de Pt3 dans la zone de données. L’adresse réelle est Adr_Pt3 = ZDD [ D3 ] .
- Effectuer l’opération Oper 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.
- Cas des opérations unaires
Le quadruplet est de la forme (Oper, Pt1, , Pt2 ) avec Oper dans { ‘+U’, ‘-U’ }.
Soit ZDD le tableau d’adresses représentant la zone de données.
- Récupérer de TABOB l’adresse relative D1 de Pt1 dans la zone de données. L’adresse réelle est Adr_Pt1 = ZDD [ D1 ] .
- Récupérer de TABOB l’adresse relative D2 de Pt2 dans la zone de données. L’adresse réelle est Adr_Pt2 = ZDD [ D2 ] .
- Effectuer l’opération Oper 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.
- Cas des opérations relationnelles binaires
Le quadruplet est de la forme (Oper, B, C , D ) avec Oper = Op , Op dans {<, <=, >, >=, =, <>, #}. Notons que D un auxiliaire de type Booléen.
L’interprétation est la même que celle faite sur les expressions arithmétiques binaires décrites précédemment.
Affectation
Il s’agit du quadruplet (‘Aff’, Pt1, ,Pt2 )
Soit ZDD le tableau d’adresses représentant la zone de données.
- Récupérer de TABOB l’adresse relative D1 de Pt1 dans la zone de données.
L’adresse réelle est Adr_Pt1 = ZDD [ D1 ] .
- Récupérer de TABOB l’adresse relative D2 de Pt2 dans la zone de données.
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
Lecture
Le quadruplé pour la lecture est (‘Lire’, Pt, N, ).
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 D de Objet dans la zone de données. L’adresse réelle est Adr_Objet = ZDD [ D ]
- Lire la donnée dans une variable DONNEE
- Ranger DONNEE dans Adr_Objet
Finpour
Écriture
Le quadruplet pour l’écriture est (‘Ecrire’, Pt, N, ).
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 D de Objet dans la zone de données. L’adresse réelle est Adr_Objet = ZDD [ D ]
- Écrire le contenu de Adr_Objet
Finpour