Du befindest dich hier: FSI Informatik » Prüfungsfragen und Altklausuren » Hauptstudiumsprüfungen » Lehrstuhl 2 » Allgemein (Übersicht)
Dies ist eine alte Version des Dokuments!
Beisitzer (Kreutzer)
Prüfer (Philippsen)
Prüfungsdauer 30min
Prüfung
Erster Teil der Prüfung anhand e2-Code mit Klassen, so ungefähr:
class Super var a : int; func foo (....) end class Sub extends Super var b: int; func foo (k: Sub) .... .... k.a .... ..... end func bar (....) end / ********* / O o = new O(); O u = new U();
Wie muss unser Compiler erweitert werden, um das abzubilden?
- Lexer um Token erweitern
- Grammatiken erweitern für Parser
Blatt mit Grammatik bekommen. Was muss konkret hinzugefügt werden?
- mögliche global_declarations um class_declaration erweitern
- Regeln für class_declarations: CLASS identifier [EXTENDS identifier]? [variable_declaration]* [function_declaration]* END
- CLASS hinzufügen
- …
Warum sind Lexer und Parser überhaupt getrennt?
- Reguläre Ausdrücke vs. kontextfreie Grammatik
Kann ein Lexer die Arbeit des Parsers übernehmen?
- Nein, reguläre Ausdrücke können zB die Verschachtelungen nicht (wichtig: es geht nicht, auch nicht mit irgendwie komische Erweiterungen - ich hab mich da in die Nesseln gesetzt)
Was muss noch getan werden?
- Klassen für neue AST-Knoten
Wie wird das dann im Speicher umgesetzt? Bitte graphisch darstellen.
- Objekte und Klassendeskriptoren malen - alle Einträge erklären können!
- Verzeigerung für TypeCasts mit Oberklassen - ginge etwas effizienter mit Displays (dann durfte ich Displays erklären und es wurde noch gefragt, wo die dann liegen → im Klassendeskriptor)
- V-Tables in den Deskriptoren für Methoden und darüber die Verzeigerung zur richtigen Implementierung (je nachdem, ob Funktionen überschrieben wurden)
- Instanzvariablen in den Objekten, bei Ober- und Unterklassen jeweils am selben Offset (WICHTIG: erklären warum man das so macht. Da bin ich gewaltig ins Schwimmen gekommen. Auf dynamische und statische Typen eingehen)
Gehen wir zur letzten Phase, was macht man da?
- Code-Generierung: Code-Selektion, Register-Vergabe, Instruktionsreihenfolgen
Warum ist Instruktionsreihenfolge wichtig?
- ILP
- Effizienz bei Pipelining und Datenkonflikten /-abhängigkeiten