Konzepte von Programmiersprachen WS 03/04

Werbung
Konzepte von Programmiersprachen WS 03/04
http://www-pu.informatik.uni-tuebingen.de/users/klaeren/kvps
H. Klaeren,
H. Gast
B LATT 8
Abgabe: 11.12.2003, 9:30h
(Seite 1 / 2)
Hinweise: • Testate können höchstens 2 Wochen nach der Abgabe des jeweiligen Blattes abgelegt
werden.
• Die schriftlichen Abgaben können wieder im Team bearbeitet werden.
• Die schriftlichen Aufgaben können ab diesem Blatt als Postscript-Datei paper.ps (im Unterverzeichnis ueb08) eingereicht werden. Sie muß die Namen beider Partner enthalten (genau wie bei der
Papierabgabe kommen diese Dateien in irgendeiner Reihenfolge aus dem Drucker) und muß sich mit
lpr paper.ps drucken lassen. Textdateien kann man mit enscript, a2ps o.ä. in Postscript-Dateien
konvertieren. PDF-Dateien sind nicht erlaubt; sie können mit xpdf oder acroread in Postscript umgewandelt werden (Print to file).
Aufgabe 1 [8] Globales Display - Stack Trace
In der Datei call2.p sind wechselseitig rekursive Prozeduren even und odd mit zwei Unterprozeduren check_one_less enthalten. Dieses Programm wurde übersetzt und ausgeführt mit der Maschine mit globalem Display (Aufgabe 4). Die wesentlichen Teile der Ausgabe sind in call2.trace
enthalten (Hinweis: Die Stapelauszüge stehen aus technischen Gründen vor den Instruktionen, die sie
veranlasst haben).
1. Wie ist jeder Stapelblock aufgebaut? Nenne die Felder mit ihren Offsets zum Beginn des Blocks
und erkläre in jeweils 1-2 Sätzen ihre Bedeutung. Dabei kann die Durchsicht von vmi_gdisp.ml
hilfreich sein.
2. Wie hoch wurde der Stapel während der Ausführung? Suche den entsprechenden Stapelauszug
(Backtrace) heraus und beantworte auch die folgende Frage 3 zu diesem Auszug.
3. Wo beginnen und enden die Aktivierungsblöcke auf dem Stapel? Mache eine einfache Tabelle
mit Anfang und Ende der Speicherbereiche.
4. Untersuche nun die Display-Vektoren bei den verschiedenen Aufrufen- und Rücksprüngen.
Welche Veränderungen nehmen die Call- und Ret-Instruktionen daran vor? Welche Informationen benötigen sie dabei aus dem Laufzeitstapel, welche nehmen sie aus der Instruktion?
Verwende hier Dein Wissen aus der Vorlesung.
5. Gib in 2-3 Sätzen eine Begründung dafür, daß diese Veränderungen für eine korrekten Ablauf
von wechselseitig rekursiven Prozeduren ermöglichen.
Aufgabe 2 [4] Symbolischer Debugger
Arbeite weiter mit dem längsten Backtrace aus der vorherigen Aufgabe:
1. Lies das übersetzte Programm zu Beginn des Traces. Fertige eine Tabelle an, die die Adressen
den jeweiligen Prozeduren zuordnet (Beispiel: 22-25: main). Denke daran, daß nicht alle
Prozeduren in der export-Tabelle auftauchen.
2. Erkläre in 1-2 Sätzen, wie man man durch die Returnadressen eine Zurordnung der Aktivierungsblöcke zu den Prozeduren des Programms vornehmen kann.
3. Tue dies für die Aktivierungsblöcke auf dem Stapel, d.h. ordne jedem der Blöcke aus der
vorhergehenden Aufgabe 1.3 die Prozedur zu. Erweitere die existierende Tabelle entsprechend.
(Hinweis: Vor der Ausführung wird der Code noch um 2 verschoben, siehe pascal_run.)
4. Stelle anhand des übersetzten Programms fest, welche lokalen Variablen der Compiler an welcher
Stelle alloziert hat und lege eine Tabelle Variable/Offset an. Nenne auch jeweils die Adressen
im Backtrace, an denen die Variable vorkommt.
Konzepte von Programmiersprachen WS 03/04
http://www-pu.informatik.uni-tuebingen.de/users/klaeren/kvps
B LATT 8
H. Klaeren,
H. Gast
Abgabe: 11.12.2003, 9:30h
(Seite 2 / 2)
Aufgabe 3 [4] Statische Verweise
Sowohl statische Verweise wie auch Closures realisieren geschachtelte Sichtbarkeitsbereiche über
Verweisketten; die Tiefe eine Variablen gibt an, wie viele Sichtbarkeitsbereiche weiter außen eine
Variable alloziert ist.
• Wie wird der statische Verweis beim Prozeduraufruf jeweils angelegt? Beschreibe das Vorgehen; woher stammen die benötigten Informationen?
• Die Closure erscheint als die allgemeinere Möglichkeit; argumentiere in 2-3 Sätzen, daß für den
bisher besprochenen Pascal-Dialekt die statischen Verweise auf dem Laufzeitstapel ausreichen.
Welche Besonderheit der Sprache wird dabei benutzt, die für funktionale Sprachen nicht gilt?
Aufgabe 4 [12] Globales Display - VMI†
Die Datei vmi_gdisp.ml enthält eine Instanz der PVM mit globalem Display. Der Typ stack
repräsentiert hier den Laufzeitstapel aus der Vorlesung mit einem Speicherbereich mem und Zeigern bp
und sp zur Markierung des aktuellen Aktivierungsblocks. Damit man den Stapelinhalt besser ausgeben kann, wird jeder Eintrag mit einem stack_tag versehen, der angibt, welche Rolle der jeweilige Wert spielt. Weiterhin ist ein Feld display enthalten, das die Einträge des globalen Displays
aufnimmt.
Die Datenstruktur wird immer mit den Grundfunktionen accstack, setstack, push und pop manipuliert, die jeweils die tags mitbehandeln. push legt durch Erhöhen von sp eine neuen Wert auf den
Stapel, pop entfernt einen Wert und liefert ihn zurück. accstack erlaubt das Lesen eines beliebigen
Wertes aus dem Stapel, setstack das Schreiben (wobei der tag nicht verändert werden darf).
Die Instanz ist im wesentlichen fertig. Es fehlen nur noch zwei Dinge (siehe raise To_be_done):
• Der Zugriff auf eine Variablen in den Funktionen get und set, in denen durch das Display auf
den Stapel mem zugegriffen werden soll.
• Der Prozeduraufruf, der die Verwaltungsinformation und die Prozedurparameter auf den Stack
schreibt (Funktion call_sequence; die komplementäre return_sequence ist schon vorhanden). Das Ergebnis soll nach dem Aufruf vom g (Programm call1.p) der Stapel wie gezeigt
aussehen (Aufruf print_backtrace schon im Code enthalten).
procedure f(i : Int)
begin
procedure g(j : Int)
begin
return i+j
end;
return 2+(i+g(1+i))
end;
procedure main()
begin
return f(5)
end
Call[d=1,addr=L005:C002]:
Call[d=1,addr=L005:C002]:
Backtrace: bp=12, sp=16:
015: [var
] 6
014: [display entry] 0
013: [retaddr
] 13
012: [dynamic link] 5
011: [#operands
] 2
010: [operand
] 5
009: [operand
] 2
008: [var
] 5
007: [display entry] 1
006: [retaddr
] 19
005: [dynamic link] 1
004: [#operands
] 0
003: [display entry] 0
002: [retaddr
] 1
001: [dynamic link] 0
000: [#operands
] 0
Current
D5 ->
D4 ->
D3 ->
D2 ->
D1 ->
D0 ->
display vector:
0
0
0
0
12
5
Herunterladen