Du befindest dich hier: FSI Informatik » Prüfungsfragen und Altklausuren » Hauptstudiumsprüfungen » Lehrstuhl 2 » Übersetzerbau 1   (Übersicht)

Übersetzerbau 1

  • „Grundlagen des Übersetzerbaus“ uebbau WS 2012/2013
  • „Übungen zu Grundlagen des Übersetzerbaus“
  • ~ 30 min.
  • Prüfung oder benoteter Leistungsnachweis zu Programmiersysteme (7,5 ECTS)

Prüfer: Prof. Dr. Michael Philippsen
Beisitz: Dipl.-Inf. Stefan Kempf
Papier + Stift bereitgestellt
versch. Blätter mit Pseudo-Code für Prüfungsfragen vorhanden

War hinterher verwundert, dass viele Verfahren und Fragen (Graham&Glanville, Dyn.Prog., Registerzuteilung, Scheduling..) aus vorherigen Prüfungen nicht wieder verwertet wurden. Gute Atmosphäre, faire Benotung. Es wird erwartet, dass man nicht zu lange zögert, bevor man Lösungen präsentiert.

(x == 0) {
} else if (x == 1) {
} else if (x == 2) {
} else if (x == 3) {
}

Was macht der Compiler? Lexer: Tokens malen für einen Teil. Parser: Baum malen für if und ein else if.

Wie ändern Sie die Grammatik, wenn Sie ein Switch-Case einbauen wollen? (Grammatik des Übungscompilers lag vor)

Was müssen Sie an Ihrem Compiler dazu ändern?

Würde jemand einen Fehler in einem Case programmieren (zB. case j:), wo müssten Sie den Fehler in Ihrem Compiler abfangen?

Auf was müsste man achten, wenn man If zu Switch-Case optimiert? (Vorteile, Nachteile etc)

Wie stellt man ein Switch-Case, das x mit 0..1000 vergleicht, am besten dar? (Layout ist gefragt) Meine Antwort ungefähr, nach reichlich Nachfragen: Bereiche: 1: Grenzen prüfen, Offsettabelle an der richtigen Stelle anspringen, 2: Codeblöcke, 3: Offset Tabelle mit Sprüngen in Codeblöcke.

Wir wollen zu unserem erweiterten Compiler jetzt ein Binary haben, das auch Switch-Case übersetzen kann. Wir haben dazu noch den alten Compiler. Erklären sie, wie sie das machen. (Stichwort Tombstone)

Zurück zum Switch-Case: Oben, beim Grenzen prüfen, kann man da optimieren? Sonstige Vorteile? (Hint: Pipelining) Meine Antwort beinhaltete ungefähr: Reordering damit Jumps nicht so arg die Pipeline leeren, cmp-Flag mehrfach verwenden.

Malen sie den Stack zu folgenden Aufrufen. Minimalistisch ohne FP-Sicherung etc., geht hier um Optimierung.

g() {.... 
 return; 
} 
f(int x) { 
 g(); 
 L2; 
 return;
} 
main() { 
 f(2); 
 L1 ...
}

Wie würden Sie jetzt optimieren? Antwort: Stack ist voller Jumps zu Labeln, also: Inlining; Nachtrag von Prüfern: Einfach direkt anspringen.