Du befindest dich hier: FSI Informatik » Prüfungsfragen und Altklausuren » Hauptstudiumsprüfungen » Lehrstuhl 2 » Übersetzerbau 1
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.
Beide Seiten, vorherige ÜberarbeitungVorherige ÜberarbeitungNächste Überarbeitung | Vorherige ÜberarbeitungLetzte ÜberarbeitungBeide Seiten, nächste Überarbeitung | ||
pruefungen:hauptstudium:ls2:ueb1-2013-02-07 [07.02.2013 10:38] – chrisl | pruefungen:hauptstudium:ls2:ueb1-2013-02-07 [10.02.2014 12:22] – mantra | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
- | “Grundlagen des Übersetzerbaus” uebbau WS 2012/2013 | + | ====== Übersetzerbau 1 ====== |
- | “Übungen zu Grundlagen des Übersetzerbaus” | + | * "Grundlagen des Übersetzerbaus" |
- | ~ 30 min. | + | * "Übungen zu Grundlagen des Übersetzerbaus" |
- | Prüfung oder benoteter Leistungsnachweis zu Programmiersysteme (7,5 ECTS) | + | |
- | Prüfer: Prof. Dr. Michael Philippsen | + | |
- | Beisitz: Dipl.-Inf. Stefan Kempf | + | |
- | Papier + Stift bereitgestellt | + | **Prüfer:** Prof. Dr. Michael Philippsen |
+ | **Beisitz:** Dipl.-Math. Jakob Krainz \\ | ||
+ | Papier + Stift bereitgestellt | ||
versch. Blätter mit Pseudo-Code für Prüfungsfragen vorhanden | versch. Blätter mit Pseudo-Code für Prüfungsfragen vorhanden | ||
- | War hinterher verwundert, dass viele Verfahren und Fragen (Graham& | ||
<code c> | <code c> | ||
- | (x == 0) { | + | void f(int x) { |
- | } else if (x == 1) { | + | a = b + c (1) |
- | } else if (x == 2) { | + | x[2][b][3+4] += a (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? | + | (P) Was macht der Compiler? |
- | Was müssen Sie an Ihrem Compiler dazu ändern? | + | (S) Lexer geht durch, ist endl automat. Eintrag in Namenstabelle nicht vergessen!(lalala) |
- | Würde jemand einen Fehler in einem Case programmieren (zB. case //j//:), wo müssten Sie den Fehler in Ihrem Compiler abfangen? | + | Parser: |
+ | Parst Ergebnis vom Lexer, versucht Grammatik anzuwenden. Buzzword: Rekursiver Abstieg | ||
+ | (P) was kommt dabei raus? | ||
- | Auf was müsste man achten, wenn man If zu Switch-Case optimiert? | + | (S) Teilw. Atr. Sr. Tbaum |
- | Wie stellt man ein Switch-Case, | + | (P) was kommt danach? |
- | 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. | + | (S) Semant. Analyse. mit typpruefung, Semantische ueberpruefung auf korrektheit |
- | Zurück zum Switch-Case: | + | (P) wie geht die Typueberpruefung in (1) s.O. |
- | 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. | + | (S) baum hinmalen, durchlaufen, |
- | <code c> | + | |
- | g() {.... | + | (P) geht das immer so? |
- | | + | |
- | } | + | (S) nein, wenn infos von spaeter gebraucht werden |
- | f(int x) { | + | |
- | g(); | + | (P) wir ham da dieses +=, wie baut man das ein |
- | L2; | + | |
- | return; | + | (S) an die richtige stelle in der grammatik einfuegen, lexer muss es kennen etc |
- | } | + | |
- | main() { | + | (P) jetz soll die Zielsprache das nicht koennen, was tun? |
- | f(2); | + | |
- | L1 ... | + | (S) auf einfache addition abbilden (tmp = x[].... + b; x[].... = tmp;) |
- | } | + | |
- | </ | + | (P) was kann schiefgehen? |
- | Wie würden Sie jetzt optimieren? | + | |
- | Antwort: Stack ist voller Jumps zu Labeln, also: Inlining; | + | gemeint war wenn im array zugriff eine funktion steht (x[b()]) wird sie 2mal aufgerufen. |
- | Nachtrag von Prüfern: Einfach direkt anspringen. | + | |
+ | |||
+ | (P) wenn man den code jetz uebersetzen will, wie geht man vor | ||
+ | |||
+ | (S) man muss moegl. ersetzungsstrategien wissen (-> risc) dann kann man G&G machen, DP oder Baumersetzung etc. kurz darauf eingegangen dass da registerverteilung unabh. gemacht wird -> suboptimal, aber leichter. dann baum in praefix hinschreiben, | ||
+ | |||
+ | (P) und was macht man jetz mit den registern? | ||
+ | |||
+ | (S) get reg, graph faerben. | ||
+ | graph faerben dann ansatzweise ausgefuehrt. was machen wenn Grad <( oder = ) Registerzahl etc siehe Folien | ||
+ | {(P) was ist eine kante, was ein knoten, was ist eine lebensspanne} | ||
+ | |||
+ | (P) zeit is rum | ||
+ | |||
+ | (S) echt? mist. | ||
+ | |||
+ | note war 1.7. das war auch fair. | ||
+ | mein problem war hauptsaechlich dass ich nicht exakt genug auf die frage geantwortet hab. ein grosses wissen und verstaendniss darueber |