Du befindest dich hier: FSI Informatik » Prüfungsfragen und Altklausuren » Hauptstudiumsprüfungen » Lehrstuhl 2 » ueb1-2026_02_26

Datum: 26.02.2026, 8:00
Pruefer: Philippsen und Tobias
Ergebnis: 1,3

Fragen meistens von Tobias. P=Prüfer, A=Antwort

P: Welche Phasen hat den so ein Compiler
A: Analyse, Abbildungs und Codierungsphase

P: Was passiert denn so in der Analysephase
A: Der Lexer liest das Quellprogramm ein, verwirft alles nicht semantiktragende und wandelt es in einen Tokenstrom um.
Der Parser macht aus dem Tokenstrom einen AST und gibt dem Programm damit Struktur. Dann wird die Namens- und Typanalyse gemacht und der AST attributiert.

P: Was macht die Namensanalyse, was die Typanalyse
A: Die Namensanalyse stellt sicher, dass alle verwendeten Namen existierten und an den stellen der Verwendung gültig/sichtbar sind. Die Typanalyse prüft, dass alle Typen zusammen passen, also Funktionsargumente, Zuweisungen etc.

P: Welche Typen gibt es in r2?
A: Int und Real

P: Welchen typ gibt es in e2 noch intern
(stand da auf dem schlauch, bisschen hin und her) P: Intern hat der Compiler noch einen bool typ
(gibt programm mit bools drin) P: Was muss man denn in e2 ändern um das umzusetzen
A: Man braucht nen neuen Token für das bool keyword und das entsprechende Element im AST, im Backend muss man die Abbildung auf Register implementieren

P: Da fehlt noch was bei lexer und parser
A: Die Grammatik muss man anpassen

(gibt e2 grammatik)
P: Dann machen Sie mal
(male etwas mühsam das bool keyword usw.)

primitiveTypeName: ' int ' | ' real ' | __'bool'__ ;  \\
assignStatement: lvalue ':= ' (arithmeticExpression | __compareExpression__) '; ' ; \\

—vorsicht, vermutlich unvollständig—

P: Jetzt gibt es ein Problem mit der Grammatik, welches
A: (komme nicht drauf)
P: (malt):

a := ((b1))


P: Was ist das Problem wenn das geparst wird
A: Ist mehrdeutig, konflikt

P: Genau falsch, welchen Parser haben wir hier
A: LR

P: Was ist dann los?
A: (bin nicht drauf gekommen, wäre reduce-reduce Konflikt gewesen)

P: Gehen wir weiter, was passiert ganz am Ende in der Codierungsphase?
A: Der Zwischencode wird auf Maschinencode abgebildet, dabei muss man Instruktionsauswahl, Registervergabe und Instruktionsanordnung machen

P: Welche Algorithmen kennen wir
A: Sethi-Ullmann, DP, Graham-Glanville, Baumtransformationen, Getreg

P: Welche machen denn Instruktionsanordnung
A: Instruktionsanordnung haben wir danach mit list Scheduling gemacht

P: Für was ordnet List Scheduling die Instruktionen an?
A: Für gepipelinte CPUs

P: Es gibt auch ein Verfahren das Instruktionsanordnung mit nem anderen Zweck macht
A: Ah, Sethi Ullmann ordnet so an, dass möglichst wenige Register gebraucht werden

P: Und DP auch
P: (holt Maschinengrammatik raus)
P: Welche Algorithemn können sie gleich ausschließen für die grammatik?
A: Sethi Ullmann kann nur RoR RoM, L, S getreg geht aber verwendet nur wenig davon, DP geht, Baumtransformationen geht, Graham Glanville geht

P: Dann machen wir jetzt DP
P: (holt IR raus)
P: Wie geht das?
A: Man macht einen DAG dann einen Baum draus

P: Dann machen Sie mal
A: (stelle mich an, brauche viel Hilfe bis mein Ansatz akzeptiert wird)

Ich habe den nächsten auch Teil als „Arbeitsblatt“ nachgebaut, so ist es besser nachvollziehbar.

Lösung am Ende.

P: (holt fertigen Teilbaum raus)
P: Und jetzt DP, was heißen die klammern [ , , ]
A: Es gibt 2 register

P: Was ist das r hier
A: (denke lange, komme mit Hilfe drauf dass das der Frame Pointer (register) ist)

P: Jetzt können Sie eintragen
A: (male)

P: Passt
P: (holt fast fertigen Teilbaum raus, mit ind knoten leer) A: (rechne den Array Access aus, großer load Befehl ist günstig)

P: Noch 1 Minute, das Kostenfeld hier [3, 7, 2] macht so keinen Sinn, warum?
A: Komme nicht drauf
(es wäre gewesen: die Kosten 7 machen keinen Sinn weil ich ja auch mit 3 in den Speicher auswerten könnte und + 1 wieder laden könnte, also Kosten 4 habe)

P: macht nichts ist schwierig