Konzepte von Programmiersprachen WS 03/04

Werbung
Konzepte von Programmiersprachen WS 03/04
http://www-pu.informatik.uni-tuebingen.de/users/klaeren/kvps
B LATT 7
H. Klaeren,
H. Gast
Abgabe: 4.12.2003, 9:30h
(Seite 1 / 2)
Hinweis: Auch bei diesem Blatt dürfen die Textabgaben im Team bearbeitet werden.
Aufgabe 1 [10] Ein inkrementeller Linker für Pascal†
Zu Beginn von Kapitel 6 wurden die Begriffe Compiler und Linker anhand eines Fortran-Beispiels
besprochen. Nun soll ein entsprechendes Programm für den auf Blatt 5 vorgestellten Pascal-Dialekt
geschrieben werden. Vollende also das Programm in pascal_lnk.ml.
Die die Sprache wurde zum Linken um extern-Deklarationen erweitert. Dabei bedeutet
extern var x : t,
daß in einer anderen Übersetzungseinheit Variable x mit Typ t als globale Variable definiert wird und
daß diese Definition von nun an unter dem Namen x zugänglich sein soll. Entsprechendes gilt für die
globalen Prozeduren aus anderen Übersetzungseinheiten.
Eine Objektdatei besteht aus einigen Tabellen mit Verwaltungsinformation für den Linker und dem
Code einer Übersetzungseinheit. Sie wird vom vorgegebenen Compiler erzeugt (siehe unten).
Imports Eine Liste von importierten (extern) Bezeichnern aus der Übersetzungseinheit mit den Labels, die in dieser Übersetzungseinheit im Code für sie benutzt werden. Die Labels entsprechen
ungefähr den in der Vorlesung genannten Offsets, nur daß man mit Labels nicht rechnen kann.
Exports Eine Liste von (globalen) Bezeichern mit zugehörigen Adressen, die in dieser Übersetzungseinheit definiert werden und von anderen Übersetzungseinheiten importiert werden dürfen (in
dieser Aufgabe sind das alle globalen var/procedure Deklarationen).
Patches Die Stellen im Code, an denen der Übersetzer nur Dummy-Adressen einsetzen konnte, weil
die echten Adressen von Imports erst beim Binden festgelegt werden. Der Linker muß die
entsprechenden Instruktionen mit der echten Adresse ersetzen.
Data size Anders als beim Code-Block wird nicht der Datenblock selbst, sondern nur seine Größe
abgelegt. (Die Initialisierung der Variablen findet zur Laufzeit statt.)
Code Der Maschinencode für diese Einheit.
Entsprechende Datenstrukturen, wie gewohnt mit Ausgabefunktionen, werden in Pascal_obj (Dateien
unter rahmen/pascal) bereitgestellt. Dort sind auch schon Hilfsfunktionen für das Ersetzen einer Instruktion beim Durchlauf durch Patches (s.o.) und das Relozieren von Code vorgesehen. Außerdem
gibt es ein lookup Funktionen für die exportierten Code/Daten-Bezeichner.
Bei einem Aufruf pascal_lnk r o1 . . . on lädt der Linker nacheinander die Objektdateien oi ein und
führt für jede folgende Aktionen durch; schließlich wird das Ergebnis, eine neue Objektdatei, nach r
geschrieben.
• Der Linker addiert die Größen der Datenblöcke auf.
• Er hängt die Code-Blöcke hintereinander (mit Relokation!).
• Er löst die Imports gegen die bisherigen Exports auf und führt die Patches aus. Man beachte,
daß Imports nicht rückwärts aufgelöst werden: Wenn beim Einlesen einer Datei ein Import nicht
aufgelöst werden kann, dann wird eine Ausnahme geworfen (daher der Name inkrementell).
• Er fügt die Exports des Objekts zu den bisherigen Exports hinzu (Achtung: Code-Adressen
wurden reloziert!)
• Schließlich muß noch die aktuelle Code- und Datengröße nachgeführt werden.
Konzepte von Programmiersprachen WS 03/04
http://www-pu.informatik.uni-tuebingen.de/users/klaeren/kvps
H. Klaeren,
H. Gast
B LATT 7
Abgabe: 4.12.2003, 9:30h
(Seite 2 / 2)
Compiler Das Unterverzeichnis rahmen/pascal enthält einen kompletten Übersetzer für unseren
Pascal-Dialekt, der hier nur grob beschrieben werden soll. Zunächst enthalten alloc, pascal_il,
pascal_tl gerade die Lösung von Blatt 5 (attributierte Pascal-Programme). pascal_cg ist der Code,
der aus der Zwischensprache Maschinencode erzeugt; das geht sofort durch einen Baumdurchlauf.
Das Hilfsprogramm pascal_nm (analog nm unter UNIX) gibt die Tabellen und den Code aus einer
Objektdatei zu Testzwecken aus. pascal_run liest eine Objektdatei ohne Imports ein und führt
den Code, beginnend bei Prozedur main, aus. Dazu wird der Code der Objektdatei um 2 Adressen
verschoben und die Codeadressen 0-1 enthalten die Befehle Call[main,0]; Halt. Dann wird die
Maschine gestartet.
Es sind bereits Beispiele exp1.p, exp2.p und imp.p vorhanden, die mit dem Compiler übersetzt
werden können (siehe Makefile). Außerdem kann man comb.p direkt übersetzen und ausführen; es
sollte bis auf die Namen der Labels den gleichen Trace erzeugen wie das gelinkten Programm.
Aufgabe 2 [5] Maschineninstanz
Die Datei rahmen/vm/vmi_nested.ml enthält eine Beschreibung der Parameter env und cont der
Maschine für Pascal. Dabei muß env i.w. die Funktionen get, set, extend, remove implementieren, die aufgerufen werden, wenn die Maschineninstruktionen var, set, AddEnv, RemEnv im Code
abgearbeitet werden. cont definiert analog die Implementierung der Prozeduraufrufe: Instruktion
Call wird durch Funktion call_sequence ausgeführt, entsprechend Ret durch return_sequence.
Lies die gegebene Datei und finde heraus, an welcher Stelle die folgenden, in der Vorlesung angegebenen Konzepte realisiert sind; erkläre in 1-2 Sätzen jeweils den Bezug zum Konzept: Welche Datentstrukturen in vmi_nested werden verwendet? Welche Operationen darauf stehen für welche
konzeptuellen Operationen?
1. Dynamischer Verweis
2. Rücksprungadresse beim Prozeduraufruf
3. Speicherplatz für lokale Variablen
4. Speicherplatz für Parameter von Prozeduren
5. Anlegen des Aktivierungsblocks einer Prozedur
6. Entfernen des Aktivierungsblocks einer Prozedur
Aufgabe 3 [5] Prozeduraufrufe in C
In der Datei call.s ist die übersetzte Version von call.c enthalten (im Rahmenprogamm). In
welchen Zeilen finden sich:
1. Prozedurprolog von f und g
2. Prozedurepilog von f und g
3. Aufrufsequenz von g(1,3)
4. Offset von Parameter i in g relativ zu bp
5. Zugriff auf Parameter i in g
Entscheide anhand der bekannten Aufgaben in Bezug auf bp, sp und durch Vergleich des Codes von
f und g!
Herunterladen