====== Ü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.