Environnement d'exécution du principe de compilation
Présentation de l’organisation du stockage d’exécution
Le compilateur traduit la partie description de l'algorithme et la partie description des données du programme source encode objet machineetunité de stockage de données, et enfin obtenir le programme cible.
Le programme cible est enEnvironnement de la machine cibleEn courant, chacun est dans l'un des siensEspace de stockage d'exécution. Lorsqu'il est exécuté sur un système d'exploitation, le programme cible seraExécuter et stocker des données dans son propre espace d'adressage logique. Lorsque le compilateur génère du code, il est chargé de clarifier comment les différents objets sont stockés dans l'espace d'adressage logique et comment utiliser l'espace d'adressage logique lorsque le code cible est en cours d'exécution .
Durant le processus de compilation,L'allocation d'adresse d'objet du programme source est souvent un décalage par rapport à l'espace de stockage en cours d'exécution. L'accès aux objets est effectué à l'aide de la méthode d'adressage "adresse de base + décalage", de sorte que toute zone disponible de la mémoire puisse être sélectionnée comme la zone de stockage lorsque le programme cible est en cours d'exécution.. Le code objet ainsi généré est appelécode d'adresse flottant
Note:
"Adresse de base" fait référence à la première adresse de l'espace de stockage en cours d'exécution。
Exécuter la stratégie d'allocation de stockage
Pendant le travail du compilateur, il doitLes objets de données allouent de l'espace de stockage d'exécution
- Pour les objets de données dont la taille peut être déterminée au moment de la compilation, un espace de stockage peut leur être alloué au moment de la compilation. Cette stratégie d'allocation est appeléeallocation de stockage statique
- D'un autre côté, si la taille de l'objet de données ne peut pas être complètement déterminée au moment de la compilation, utilisezAllocation de stockage dynamiquestratégie. Autrement dit, seules diverses informations nécessaires sont générées lors de la compilation, ettemps de fonctionnement, puis allouez dynamiquement l'espace de stockage de l'objet de données
- allocation de stockage de pile
- Allocation de stockage en tas
- dans,statiqueetdynamiquecorrespondant respectivementtemps de compilationettemps de fonctionnement
La mission et le rôle de l'organisation de stockage d'exécution
La taille du code généré par le compilateur est généralement fixe, généralement stockés dans un espace dédié, à savoirzone de code;
Lors de l'exécution du programme cible, il est nécessaire deLes objets de données créés et consultés sont stockés dans la zone de données。
La disposition de l'espace de stockage lorsque le programme est en cours d'exécution
Registre d'activité
utiliserLangage dans lequel les procédures (ou fonctions, méthodes) servent d'unité d'actions définies par l'utilisateur et son compilateur alloue généralement l'espace de stockage en unités de procédures.
Chaque exécution du corps de la procédure est appelée unactivité
A chaque exécution d'un processus, une zone de stockage continu lui est allouée pour gérer les informations nécessaires à une exécution du processus. Cette zone de stockage continu est appeléeenregistrement d'activation
Forme générale du relevé d'activité
Les enregistrements d'activité incluent généralement le contenu suivant
- Arguments
- valeur de retour
- Chaîne de contrôle : enregistrement d'activité pointant vers l'appelant
- Chaîne d'accès : utilisée pour accéder aux données non locales stockées dans d'autres enregistrements d'activité
- État de la machine enregistré
- données locales
- Variables temporaires
allocation de stockage de pile
certaines langues utilisentProcédure, fonction ou méthode en tant qu'unité d'action définie par l'utilisateur, presque tous les compilateurs pour ces langages incluent (au moins une partie de) leurLe stockage d'exécution est géré sous la forme d'une pile, appelée allocation de stockage de pile.
- Lorsqu'une procédure est appelée, le relevé d'activité de la procédure estpousser sur la pile; Lorsque le processus se termine, l'enregistrement d'activité estpile pop
- Cet arrangement n'est pas seulementPermet de partager l'espace entre plusieurs appels de procédure avec des périodes actives qui ne se chevauchent pas,etPermet de compiler le code d'une procédure comme suit:
- L'adresse relative des variables non locales est toujours fixe
- Séquence d'appel de procédure indépendante
arbre d'activité
L'arborescence utilisée pour décrire le contrôle d'entrée et de sortie de diverses activités pendant l'exécution du programme est appelée arborescence d'activités.
- chacun dans l'arbreNœudcorrespond à unActivité。Noeud principalIl est exécuté par le programme de démarrageprincipales activités de processus
- Sur un nœud représentant une activité du processus p, sonnœud enfantCorrespondant à cette activité étant ptransfertactivités de chaque processus. suivez-lesL'ordre dans lequel les activités sont appelées, en les affichant de gauche à droite.Un nœud enfant doit se terminer avant que l’activité de son nœud frère droit ne commence.。
pile de contrôle
- chaqueactivités activesIl y en a un situé àpile de contrôleneutreRegistre d'activité
- arbre d'activitéracineL'activité de est située àbas de la pile
- L'enregistrement de l'activité où se trouve le contrôle du programme (c'est-à-dire l'activité en cours) se trouve en haut de la pile.
- en pileSéquence de tous les enregistrements d'activitécorrespond à l'arbre d'activitéLe chemin vers le nœud actif où se trouve le contrôle actuel
Quelques principes pour concevoir des dossiers d’activités
Les valeurs transmises entre l'appelant et l'appelé sont généralement placées au début du relevé d'activité de l'appelé afin qu'elles soient aussi proches que possible du relevé d'activité de l'appelant. Les
éléments de longueur fixe sont placés au milieu :Lien de contrôle, chaîne d'accès, mot d'état de la machine
Les éléments dont la taille n'est pas connue au départ sont placés à la fin de l'enregistrement actif dans le haut du
registre des pointeurs de pile.top_spPointe vers l'emplacement où commencent les données locales dans l'enregistrement actif, en utilisant cet emplacement comme adresse de base
Séquence d'appel et séquence de retour
Les appels de procédure et les retours de procédure nécessitent l'exécution d'un certain code.Gérer la pile d'enregistrements d'activité, enregistrer ou restaurer l'état de la machineattendez
- Séquence d'appel : une section de code qui implémente les appels de procédure. Allouez de l'espace dans la pile pour un enregistrement actif et renseignez les informations dans les champs de cet enregistrement
- Séquence de retour : restaure l'état de la machine afin que le processus appelant puisse continuer son exécution après la fin de l'appel.
- Le code d'une séquence de codes appelant est généralement divisé en processus appelant (appelant) et processus appelé (appelé). Il en va de même pour la séquence de retour
séquence d'appel
- votre interlocuteurCalculer la valeur du paramètre réel
- votre interlocuteurVolontéadresse de retour(la valeur du compteur de programme) est placée dans le champ d'état de la machine de l'appelé. VolontéValeur de pointe d'origineMettez-le dans la chaîne de contrôle de l'appelé. Alors,Augmenter la valeur du top-sp, en le faisant pointer vers l'appeléLa position où commencent les données locales
- appelégarderValeur du registreetAutres informations sur l'état
- appeléInitialiser ses données locales et lancer l'exécution
séquence de retour
- appeléVolontévaleur de retourPlacez-le à côté du paramètre
- En utilisant les informations du champ d'état de la machine,appeléVolontéRestaurer le top-spetAutres registres,Alorsrediriger versL'adresse de retour placée par l'appelant dans le champ d'état de la machine
- Bien que le top-sp ait été réduit (restauré),votre interlocuteurConnaissez toujours la position de la valeur de retour par rapport à la valeur top-sp actuelle (située dans le prochain enregistrement actif,Même si elles sont apparues à ce moment-là, les données sont toujours valides). Par conséquent, l'appelant peut utiliser cette valeur de retour
Allocation de stockage de données de longueur variable
existerlangage de programmation modernedans, dansObjet dont la taille ne peut pas être déterminée au moment de la compilationsera attribué enZone de tas. Cependant, s'ils sontobjet local de la procédure, ou ils peuvent être alloués danspile d'exécutionmilieu. Raisons pour placer les objets dans la zone de pile autant que possible : Ouiéviterà leurs espacesCollecte des ordures, ce qui réduit le correspondantaérien
Il n'y a qu'un seul objet de donnéeslocal à un processus,etLorsque ce processus se termine, il devient inaccessible, vous pouvez utiliser la pile pour allouer de l'espace à cet objet
Accès aux données non locales
En plus d'utiliser le processus lui-même, un processus peut utiliserdonnées localesDe plus, vous pouvez également utiliser des procédures définies en dehors dudonnées non locales
Les langues peuvent être divisées en deux types
- Langages prenant en charge les déclarations de procédures imbriquées
- Une procédure peut être déclarée au sein d'une autre procédure
- Un processus ne se définit pas par lui-mêmedonnées localesetdéfinition globaleEn plus des données, vous pouvez également utiliserprocessus périphériqueObjet déclaré dans
Exemple : Pascal
- Langages qui ne prennent pas en charge les déclarations de procédures imbriquées
- Vous ne pouvez pas déclarer une procédure au sein d'une autre procédure
- Les données utilisées dans le processus sont soit des données locales définies par lui-même, soit des données globales définies en dehors de tous les processus.
Exemple : C
Accès aux données sans déclarations de procédures imbriquées
Allocation de stockage et accès aux variables
- Les variables globales sont affectées danszone statique,utiliseradresse déterminée statiquementy accéder
- D'autres variables doivent êtreVariables locales actives en haut de la pile. capable de passerIls sont accessibles par le pointeur top_sp de la pile d'exécution.
Accès aux données lorsqu'il y a des déclarations de procédures imbriquées
Profondeur de nidification
- Profondeur d'imbrication des procédures
- Une procédure qui n'est intégrée dans aucune autre procédure, définissez sa profondeur d'imbrication sur 1
- Si une procédure p est définie dans une procédure avec une profondeur d'imbrication i, définissez la profondeur d'imbrication de p sur i + 1
- Profondeur d'imbrication des variables
- Utiliser la profondeur d'imbrication de la procédure dans laquelle la variable est déclarée comme profondeur d'imbrication de la variable
- Utiliser la profondeur d'imbrication de la procédure dans laquelle la variable est déclarée comme profondeur d'imbrication de la variable
Liens d'accès
Règle de portée statique : la procédure b peut accéder aux objets déclarés dans la procédure a tant que la déclaration de la procédure b est imbriquée dans la déclaration de la procédure a.
Vous pouvez établir un processus appeléPointeur de lien d'accès, afin que la procédure embarquée puisse accéder à l'objet déclaré dans la procédure externe
- Si la procédure b est directement imbriquée dans la procédure a dans le code source (la profondeur d'imbrication de b est supérieure de 1 à la profondeur d'imbrication de a), alors la chaîne d'accès dans toute activité de b pointe vers l'activité la plus proche de a.
Mise en place de la chaîne d'accès
Le code qui établit la chaîne d'accès appartient àséquence d'appelune partie de
Supposons qu'une procédure x avec une profondeur d'imbrication de nx appelle une procédure y(x->y) avec une profondeur d'imbrication de ny.
- Le cas de nx < ny (la couche externe appelle la couche interne)
- y doit être directement défini dans x (par exemple : s->q, q->p), donc ny=nx+1,
- Ajoutez une étape à la séquence de code appelant : placez un pointeur vers l'enregistrement actif de x dans la chaîne d'accès de y
- Le cas de nx = ny (cette couche appelle cette couche)
- Appel récursif (par exemple : q->p)
- La chaîne d'accès au dossier d'activité de l'appelé est la même que la chaîne d'accès au dossier d'activité de l'appelant et peut être copiée directement.
- Le cas de nx > ny (la couche interne appelle la couche externe, tel que : p->e)
- Le processus x doit être imbriqué dans un certain processus z, et z définit directement le processus y
- À partir de l'enregistrement d'activité de x, vous pouvez trouver l'enregistrement d'activité de z le plus proche du sommet de la pile en passant par les étapes nx-ny+1 le long de la chaîne d'accès. La chaîne d'accès de y doit pointer vers l'enregistrement d'activité de z
Allocation de stockage en tas
L'allocation de stockage en tas consiste à diviser la zone de stockage continue en blocs, qui sont alloués lorsque les enregistrements actifs ou d'autres objets le nécessitent. La
libération des blocs peut être effectuée dans n'importe quel ordre, donc après un certain temps, la zone peut contenir des zones entrelacées qui sont en cours d'utilisation et ont été publiés.
Appliquer
Supposons que la longueur totale du bloc libre actuel soit M et que la longueur à demander soit n.
- S'il existe plusieurs blocs de stockage d'une longueur supérieure ou égale à n, l'allocation de stockage peut être effectuée selon l'une des stratégies suivantes
- Prenez le premier bloc libre de longueur m qui répond aux exigences et placez la partie restante de longueur mn dans la chaîne libre
- Trouver le plus petit bloc libre de longueur m qui répond aux exigences
- Trouvez le plus grand bloc libre de longueur m qui répond aux exigences
- S'il n'existe pas de bloc de stockage de longueur supérieure ou égale à n
- Si M>=n, déplacez et réorganisez les blocs libres dans le tas (toutes les parties pertinentes doivent être modifiées en conséquence, ce qui est une tâche très compliquée et difficile)
- Si M<n, des stratégies plus complexes devraient être adoptées pour résoudre le problème de gestion du tas
libéré
Insérez simplement le bloc de stockage libéré dans la chaîne libre en tant que nouveau bloc libre et supprimez l'enregistrement correspondant dans la table d'enregistrement des blocs occupés.
résumé
Afin de mettre en œuvre la gestion du stockage en tas, un grand nombre d'opérations auxiliaires doivent être effectuées. Tels que le tri, la recherche de table, le remplissage de table, l'insertion, la suppression,... Sa surcharge spatiale et temporelle est relativement importante
Les références
"Principes de compilation" Deuxième édition