====== Ausgewählte Kapitel aus dem Übersetzerbau ====== Beisitzer: Kamp, Kreutzer Zeit: 30min ===== Stimmung & Ablauf ===== Angenehme Atmosphäre, Einstieg über das Blockpraktikum hilft gut, zweiter Teil wie gewohnt über den restlichen Stoff. ===== Teil 1: Blockpraktikum ===== B: Was haben wir im Praktikum gemacht? B: Welche Teile haben wir dabei im Vergleich zu einem "echten" JIT weg gelassen? * Code-Cache-Manager * Laufzeitmessungen ==== JIT 0 ==== B: Wie funktioniert ein Interpreter? * switch-case B: Wie führt man dann einzelne Instruktionen aus? B: Was ist schlecht daran? * Viele Sprünge B: Wie gehts besser? * Indirektes Durchfädeln B: Was macht man bei indirektem Durchfädeln? B: Dann gibt es doch auch direktes Durchfädeln? ==== JIT 1 ==== B: Was haben wir hier gemacht? * Code vorübersetzt B: Auf was muss man aufpassen? * Interpreter -> Nativer Code * Nativer Code -> Interpreter * => Trampolinfunktion B: Ist die Trampolinfunktion weglassbar, wenn alles übersetzt ist? * Bei uns möglich, da Code-Cache nie gelöscht wird * Bei anderen JITs allerdings nicht (erneute Übersetzung) ==== JIT 2 ==== B: Was haben wir da gemacht? * Registervergabe B: Mittels Graphfärben? Wieso nicht? * Zu aufwändig und lohnt meistens nicht B: Kosarajus Algorithmus. B: Auf was machen wir den? * KFG B: Linear Scan * Keine Löcher * Erstes Lesen bis letztes Lesen ===== Teil 2: Restlicher Stoff ===== ==== Exceptions ==== B: Wie würde man mit Exceptions umgehen? B: Wie funktioniert Stack Cutting? B: Vor- und Nachteile von Stack Cutting ==== Garbage Collection ==== B: Welche einfachen Speicherbereiniger gibt es? * Verwendungszähler * mark and sweep * Kopierend B: Woher weiß man, welche Objekte man entfernen kann? * Zähler / (keine) Markierung B: Wie sieht es bei Speicherbereiniger mit Verwendungszähler mit zyklischen Müll aus? B: Wann macht man Speicherbereinigung? ==== LLVM ==== B: Was ist das? B: Was sind die Vorteile?