Verlauf meiner Prüfung heute:
Zunächst prinzipiellen Aufbau eines Compilers erklären, ohne Rückfragen (also
nicht sehr detailliert).
Dann gings direkt zu Grammmatiken für Boolesche Ausdrücke.
Auf welche Art können die Werte codiert werden (numerisch oder durch stelle im
programmcode)
Er hat ne kleine Grammatik hingeschrieben und ich sollte erklären wie man dafür
3Adresscode generieren kann -> mit na attributierten Grammatik mit true, false
und code (inherit, inherit, synthetisch).
Beispielhaft sollte ich fürs "or" dann die Berechnungen hinschreiben.
Dann kamen wir noch drauf, dass man statt der Generierung der Zeichenkette in
"code" auch emit verwenden kann -> dafür braucht man dann ne
Ausführungsreihenfolge, also nen SDTS.
Um die Regeln nur am Ende der Produktionen stehen zu haben (für
Bottom-Up-Parsing) muss man dann noch vor dem zweiten
Ausdruck nen extra Nicht-Terminal einfügen, das das label setzt und die Stelle
hochreicht.
Dann gings um die Alternative zu der Verwendung von inheriten Attributen:
Backpatching. (Hab von mir aus gesagt, dass dafür die Maschinensprache halt
Zeilennummern statt labels für Sprünge verwenden muss). Auch hier sollte ich
wieder die Regeln für das "or" angeben.
Danach gings zum Laufzeitstack: Was passiert, wenn ne Prozedur aufgerufen wird
-> AR anlegen. Sollte auch den Aufbau des AR beschreiben. Er fragte dann noch,
was bei der definition der funktion angelegt wird und was beim call, bin nicht
ganz sicher wie er das meinte, konnte es auch nicht so gut beantworten.
Einige Werte wie die Größe des Bereichs für temporäre und lokale Vars. muss auf
jeden Fall schon bei der Definition bestimmt werden, beim Call dann noch so
Dinge wie die Rücksprung-Adresse. Habe die Frage so verstanden, dass es ums
anlegen geht und der AR wird ja komplett beim Call angelegt, evtl. gings eher um
den Zeitpunkt der Bestimmung der Werte.
Dann kamen wir zur Code-Optimierung:
Welche Schritte gibt es da: ich habe nur bilden einfacher Blöcke (sollte kurz
sagen, was das ist und wie man sie bestimmt) und bilden des Flussgraphen gesagt,
danach hat er mich unterbrochen und ist zur Datenflussanalyse übergegangen.
Da gings zuerst um Lebendigkeit (was ist das, wann ist ne Var lebendig, wofür
braucht man Infos über Lebendigkeit? -> ggf. Befehle rausschmeißen,
Registerzuordnung entscheiden, ...) wofür ich auch die Gleichungen für in und
out von Blöcken angeben sollte (und natürlich, dass es ne Rückwärtsanalyse ist).
Anschließend sollte ich noch sagen wie man das GLS löst -> iterativ, out[entry]
= leere Menge, weil die Mengen monoton wachsen kommt man zu na Lösung / nem
Fixpunkt. Er fragte dann noch wofür man Reaching Definitions braucht und was
das für ne Analyse ist, aber nicht mehr wie die Gleichungen genau aussehen.
Schlussendlich gings dann noch zu natürlichen Schleifen: Wie bestimmt man sie
(Dominatoren -> was ist ein Dominator?) und was ist dann eine natürliche
Schleife? Warum wollen wir, dass es nur einen Eintrittspunkt gibt -> wegen des
Vorziehens schleifeninvarianter Berechnungen. Er hat dann noch nein
Flussdiagramm gemalt. Ich hab vorher schon anhand dessen veranschaulicht, was
ein Dominator ist und sollte dann noch sagen warum das eine eine natürliche
Schleife ist und das andere nicht (die eine hatte mehrere Eintrittspunkte, die
andere nicht).
Viele Grüße,
Anselm
"Once you figure out what a joke everything is, being the comedian's the only thing makes sense."
~The Comedian