Du befindest dich hier: FSI Informatik » Prüfungsfragen und Altklausuren » Hauptstudiumsprüfungen » Lehrstuhl 2 » ueb3-2015-03-17
Prüfer: Tobias Werth
Beisitzer: Marius Kamp
Hinweis: Eine Woche vor der Prüfung fand die Übung in Form einer Blockübung statt. In dieser wurde ein JIT-Compiler entwickelt, auf dem auch die meisten Fragen der Übung basierten. Man sollte sich jedoch darüber im Klaren sein, dass der JIT-Compiler aus der Übungswoche im Vergleich zu realen Compilern natürlich deutlich weniger Funktionen hat. In sofern sollte man auch die in der Vorlesung behandelten Themen zur JIT-Kompilation drauf haben.
P: Fangen wir ganz vorne an, was macht ein Interpreter?
S: Grundlegendes Interpretieren von Bytecode erklärt.
P: Hast du das so implementiert?
S: Ja!
P: Okay wie kann man das besser machen?
S: Indirektes Durchfädeln erklärt.
P: Gut ein Sprung oder zwei Sprünge klingt ja jetzt nicht so schlecht. Warum ist es das trotzdem?
S: Hier bin ich eher darauf eingegangen, was es nur für Nachteile gibt (Immer wieder neues interpretieren gleicher Instruktionen (Lösung durch angereicherten Quellcode), Behandeln von Einzelninstruktionen (Lösung durch Kompilierung von Blöcken).
P: Das war soweit richtig, aber das wollte ich nicht wirklich wissen: Warum sind 2 Sprünge schlechter als ein Sprung?
S: Sprungzielvorhersage ist quasi unmöglich.
P: Jetzt wollen wir kompilieren, wie geht das?
S: JIT0 erklärt.
P: Wie handhabt man den Übergang zwischen Interpreter und nativem Code?
S: Interpreterstack, Systemstack, FFI-Calls von Interpreter zu nativem Code, Trampolinfunktion
P: Trampolinfunktion klingt langsam, wie macht man es schneller?
S: Inlinen der Trampolinfunktion. Habe hier erklärt, wie ich es in der Übung gemacht habe.
P: Neues Stichwort: Registervergabe.
S: LinearScan (genaue Erklärung des Algorithmus).
P: Okay das reicht eigentlich auch zur Registervergabe. Letzte Aufgabe, war Inlining. Was hast du da gemacht?
S: Inlining auf Bytecodeebene erklärt, Vorteile von Inlining, Grundidee. Grobe Erklärung der Vorgehensweise und worauf man beim Inlinen achten muss (Offsets anpassen, Return ersetzen etc.)
P: Wie entscheidet man welches JIT-Level man haben möchte?
S: Profiling-Methoden sehr grob erklärt.
P: Jetzt haben wir eine einfache Main-Funktion mit Schleifen und wir merken, dass die Berechnung recht lange dauert und wollen auf native Kompilieren umsteigen, was machen wir da?
S: On Stack Replacement mit entsprechender Grundidee erklärt.
P: Woher wissen wir wo wir im neuen Code weiter machen müssen?
S: Ich habe vorgeschlagen Operationen bis zu bestimmten Punkt Rückgängig zu machen. Am einfachsten ist es aber, man lässt OSR nur an bestimmten detektierbaren Punkten zu.
P: Okay ganz anderes Thema: Was müssen wir machen, wenn wir shared libraries in unsere VM einbauen wollen?
S: Im Wesentlichen auf dynamic shared libraries eingegangen und Laden mit PLT erklärt.
P: Was machen wir wenn unsere shared library globale Variablen enthält?
S: GOT erklärt.
P: Wenn wir unseren Übersetzer auf einer Maschine mit ganz wenig Speicher laufen lassen wollen, dann müssen wir unseren Code vorher komprimieren. Was müssen wir an unserem Übersetzer ändern, dass er das unterstützt.
S: Er muss in der Lage sein komprimierten Code beim Laden einer Instruktion in den Cache zu dekromprimieren. Was genau wir tun müssen hängt von der Kompression ab.
P: Wenn wir jetzt viele ähnliche E-Programme haben und diese als Basismenge für unsere Kompression nehmen wollen, was können wir da machen?
S: Prozedurale Abstraktion erklärt: ahnliche Codestücke, die an N stellen vorkommen in Methode auslagern.
P: Wie findet man solche ähnlichen Code-Stücke?
S: Textuell über Suffixbäume oder mit graphbasiertem Ansatz (beides grob erklärt).
P: Zum Abschluss: Erkläre einen nicht-trivialen Grabage-Collection-Algorithmus deiner Wahl.
S: …
Für mich persönlich eine sehr angenehme Prüfung, in der ich mich wohl gefühlt habe. Durch die Nähe zur Übung ist ein guter Einstieg gegeben und es herrschte eine gute und lockere Atmosphäre. Durch die Übungsnähe fühlte ich mich auch wohl darin zu antworten mit „Ich habe das so gemacht…“ oder „Ich würde das so implementieren“. Es geht somit nicht um reine Auswendiglernen, sondern um Verständnis, das man sich ggf. auch noch in der Prüfung erarbeiten kann.