Environnement d'exécution du principe de compilation

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écutionInsérer la description de l'image ici

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
Insérer la description de l'image ici

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
    image

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
      image

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.
image

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

Je suppose que tu aimes

Origine blog.csdn.net/u010523811/article/details/124859256
conseillé
Classement