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