Du befindest dich hier: FSI Informatik » Prüfungsfragen und Altklausuren » Hauptstudiumsprüfungen » Lehrstuhl 2 » Übersetzerbau 1
Ü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.