Universit¨ at Karlsruhe (TH)
Lehrstuhl f¨ ur Programmierparadigmen
Sprachtechnologie und Compiler WS 2008/2009 http://pp.info.uni-karlsruhe.de/
Dozent: Prof. Dr.-Ing. G. Snelting snelting@ipd.info.uni-karlsruhe.de Ubungsleiter: Matthias Braun¨ braun@ipd.info.uni-karlsruhe.de Ubungsblatt 11¨ Ausgabe: 19.1.2008 Besprechung: 21.1.2009
Aufgabe 1:Trampolines (Zusatzaufgabe)
Funktionszeiger sind laut C Sprachstandard ganz normale Zeiger (man kann Sie zuvoid∗und zur¨uck casten). Der gcc Compiler unterst¨utzt geschachtelte Funktionen und kann diese auch beliebigen Funktionszeigern zuweisen.
Es wird also anscheinend kein speziellere Datentyp f¨ur Closures angelegt, der einen Funktionszeiger und einen Zeiger auf die Umgebung enth¨alt. Wie kann das Funktionieren?
Aufgabe 2:x86-Assembler
Gegeben sei die folgende 3-Adresszwischensprache:
ti : adridentifier ti :=Speicheradresse der Variablenidentifier ti : load tj ti :=Memory [tj]
ti : constint const ti :=int const ti : plus tj tk ti := tj + tk
ti : less tj tk ti := tj < tk
ti : if tj tk Wenn tj <> 0springe Anweisungtk sonst f¨uhreti+1 aus ti : goto tj Springe zur Anweisungtj
ti : store tj tk Memory [tj] :=tk
ti : arg tj tj als Argument f¨ur den folgenden Call benutzen ti : callfoo Unterprogrammfooaufrufen
Gegeben Sei folgendes Zwischensprachprogramm:
t 0 : a d r i
t 1 : c o n s t 1 t 2 : s t o r e t 0 t 1
t 3 : a d r i
t 4 : l o a d t 3 t 5 : c o n s t 1 t 6 : p l u s t 4 t 5
t 7 : a d r i
t 8 : s t o r e t 7 t 6
t 9 : a d r j
t 1 0 : l o a d t 9 t 1 1 : a d r k t 1 2 : l o a d t 1 1 t 1 3 : p l u s t 1 0 t 1 2 t 1 4 : a d r i
t 1 5 : s t o r e t 1 4 t 1 6 : a d r i t 1 7 : l o a d t 1 6 t 1 8 : a d r j t 1 9 : l o a d t 1 8 t 2 0 : l e s s t 1 7 t 1 9 t 2 1 : i f t 2 0 t 2 7
t 2 2 : a d r j t 2 3 : l o a d t 2 2 t 2 4 : a d r min t 2 5 : s t o r e t 2 4 t 2 6 : g o t o 31 t 2 7 : a d r i t 2 8 : l o a d t 2 7 t 2 9 : a d r min t 3 0 : s t o r e t 2 9 t 3 1 :
2.1Quellprogramm
Wie k¨onnte die C-Funktion aussehen, aus der der Zwischencode erzeugt wurde?
2.21:1 Umsetzung
Ubersetzen Sie den Zwischencode in IA32-Assembler. Ersetzen Sie zun¨¨ achst jeden Befehl durch einen oder mehrere x86 Befehle.
2.3Optimierung
Geben Sie besseren IA32-Code an.
Aufgabe 3:Zwischensprachen 3.1Grundblagen
• In welche Einheiten wird ein Programm in der Zwischensprache typischerweise eingeteilt?
• Wie ist ein Grundblock definiert?
• Wie ist ein erweiterter Grundblock definiert?
• Wof¨ur sind erweiterte Grundbl¨ocke n¨utzlich?
3.2Ubersetzung¨ voidf(void) {
int x = rand();
x = rand();
label :
x = x + i;
if ( i >100){ gotolabel;
} else if (x <1){ return1;
}
int i = 10;
do{
if ( i <12) f ();
else
i = i + 2;
i = i + 1;
} while(i<20);
}
2
• Ubersetzen Sie das folgende Programm in die Zwischensprache aus der ersten Aufgabe!¨
• Markieren Sie alle Grundbl¨ocke!
• Teilen Sie das Programm in erweiterte Grundbl¨ocke ein!
Aufgabe 4:Zwischensprachen 2 Gegeben sei folgende C-Funktion f:
voidf(void) {
int a = 4;
int b = 42;
while(1){ int t = a;
a = b;
b = t;
printf (”%d %d\n”, a, b);
} }
4.1Dynamisches Verhalten
Was gibt die Funktion aus?
4.2Tripel-Form
Wie k¨onnte f in einer Zwischensprache mit Tripel-Form aussehen?
4.3Triple-Form mit SSA-Eigenschaft
Wie k¨onnte f in einer Zwischensprache mit Tripel-Form und SSA-Eigenschaft aussehen?
4.4Semantik derΦ-Funktion
Welche besondere Semantik haben Φ-Funktionen? Worauf muss man insbesondere bei diesem Beispiel achten?
3