Blöcke (2)
Die Speicherverwaltung für die Objekte eines Blocks
geschieht auf folgende Weise:
-
Bei der Aktivierung wird dem Block ein Aktivierungsobjekt
(auf Englisch: activation record) zugeordnet
(daran gebunden).
Dies ist ein Speicherobjekt,
in dem die den lokalen Objekten des Blockes bei ihrer Einrichtung
zugeordneten Speicherobjekte Platz finden,
sowie Platz für diverse weitere Informationen, etwa:
- die Parameterangaben, falls es solche gibt,
- den Resultatwert, falls es einen solchen gibt,
- ein Zugriffspfad auf die unmittelbare Umgebung,
also auf das gerade gültige Aktivierungsobjekt
des direkt umfassenden Blockes
(im Compilerbau statische Kette genannt),
- ein Zugriffspfad auf das vor Aktivierung des Blockes
gültige Aktivierungsobjekt, das beim Verlassen des Blockes
wieder zugänglich wird
(im Compilerbau dynamische Kette genannt),
- Rückkehr-Information, die angibt,
wo und auf welche Weise nach Verlassen und Deaktivieren
des Blockes mit der Verarbeitung fortgefahren wird.
Beim Verlassen des Blockes wird das Aktivierungsobjekt wieder freigegeben.
-
Wird ein Block mehrfach aktiviert, etwa bei
rekursivem Aufruf einer Prozedur oder Funktion,
so wird ihm jeweils ein neues Aktivierungsobjekt zugeordnet,
er besitzt also dann mehrere Aktivierungsobjekte;
damit existieren auch von jedem lokalen Objekt dann mehrere
Inkarnationen; nur eine davon ist jeweils zugänglich.
-
Das Gleiche gilt auch, wenn eine Prozedur
nicht von sich selbst direkt aufgerufen wird,
sondern aus einer von ihr aufgerufenen anderen Prozedur,
eventell sogar nach weiteren Aufrufen.
Das nennt man indirekte Rekursion.
Ist ein im Block deklariertes lokales Objekt
eine Prozedur oder eine Funktion,
so wird daran bei der Aktivierung des Blockes
dessen gerade erzeugtes Aktivierungsobjekt
als direkte Umgebung gebunden
(Hülle, auf Englisch: closure).
Diese Zuordnung bleibt erhalten, auch wenn die Prozedur
später in einem anderen Kontext aktiviert wird,
etwa aus einem inneren Block heraus,
oder gar an einer ganz anderen Stelle,
nachdem sie als Parameter weitergegeben wurde
(in einigen Sprachen, darunter Modula 2, ist das möglich).
zurück |
Inhalt | Index |
vor |
Vorlesung
Klaus Lagally, 22. Februar 2000, 19:36