Du befindest dich hier: FSI Informatik » Prüfungsfragen und Altklausuren » Hauptstudiumsprüfungen » Lehrstuhl 2 » Übersetzerbau 1 (Übersicht)
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.
Nächste Überarbeitung | Vorherige Überarbeitung | ||
pruefungen:hauptstudium:ls2:ueb1-2013-02-07 [07.02.2013 09:54] – angelegt chrisl | pruefungen:hauptstudium:ls2:ueb1-2013-02-07 [10.02.2014 12:24] (aktuell) – alte Version wieder hergestellt (ops) mantra | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
- | TODO | + | ====== Übersetzerbau 1 ====== |
+ | * " | ||
+ | * " | ||
+ | * ~ 30 min. | ||
+ | * Prüfung oder benoteter Leistungsnachweis zu Programmiersysteme (7,5 ECTS) | ||
- | inhalt kommt gleich | + | **Prüfer: |
+ | **Beisitz: | ||
+ | Papier + Stift bereitgestellt \\ | ||
+ | versch. Blätter mit Pseudo-Code für Prüfungsfragen vorhanden | ||
+ | |||
+ | |||
+ | War hinterher verwundert, dass viele Verfahren und Fragen (Graham& | ||
+ | |||
+ | |||
+ | <code c> | ||
+ | (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, | ||
+ | Meine Antwort ungefähr, nach reichlich Nachfragen: Bereiche: 1: Grenzen prüfen, Offsettabelle an der richtigen Stelle anspringen, 2: 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: | ||
+ | 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. | ||
+ | <code c> | ||
+ | g() {.... | ||
+ | | ||
+ | } | ||
+ | f(int x) { | ||
+ | g(); | ||
+ | L2; | ||
+ | | ||
+ | } | ||
+ | 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. |