====== Ausgewählte Kapitel aus dem Übersetzerbau ====== ===== Allgemein ===== Angenehme Atmosphäre. Wie üblich stehen Papier und Stift bereit. Erster Teil der Prüfung geht über das Praktikum. Es gefühlt so lange nach weiteren Möglichkeiten gefragt, bis man nichts mehr weiß. ===== Prüfungsverlauf ===== **F:** Was haben wir im Praktikum gemacht? * Interpreter und JIT für Bytecode gebaut **F:** Warum Bytecode? * CISC-Maschinencode nicht gleich lang, je nachdem wo angesprungen unterschiedliche Instruktion **F:** Wie funktioniert ein Interpreter? * switch/case über Opcodes * Ausführung des Befehls in Funktion * Rücksprung * Erneute Ausführung **F:** Wie kann man es besser machen? * Indirekt durchgefädelte Interpretation * Instruktionsroutinen springen nicht zurück, sondern springen nächste Instruktion direkt an **F:** Noch bessere Variante? * Direkt durchgefädelte/vorübersetzte Interpretation * Vorübersetzungsschritt erzeugt Array mit Funktionspointern, die hintereinander ausgeführt werden und die Instruktionsroutinen anspringen * Anmerkung: Gibt noch eine (nicht in der Vorlesung besprochene Variante), bei der der Code zum Aufruf der Funktionen direkt als Maschinencode in der Tabelle steht (vergleiche auch PLT) **F:** Was macht JIT1? * Einfachen Maschinencode erzeugen (keine Optimierungen) * Trampolinfunktion **F:** Was braucht die Trampolinfunktion alles? * Ist aufgerufene Funktion schon kompiliert? Soll sie interpretiert werden? * Aufruf der Funktion mit richtigen Parametern * Rückgabe des von der aufgerufenen Funktion zurückgegebenen Returnwertes **F:** Was macht JIT2? * Registervergabe (aber nicht nach Graphfärben, um Zeit zu sparen) * Linear Scan * Lebendigkeitsintervalle auf ZHKs aufbauen * ZHKs sind topologisch sortiert * Registervergabe wie in VL * Heuristiken zum Spillen **F:** Verbesserungen? * Lebensspannen aufteilen, falls Löcher * U.U. mehr freie Register **F:** Verbesserungen? * Bin-Packing an einer Zeichnung erklärt **F:** Was macht JIT3? * Inlining * Welche Jumps wie anzupassen sind (vor geinlinter, in geinlinter, nach geinlinter Funktion, returns, calls, Offsets) **F:** Linker & Loader: Was macht ein einfacher Linker? * Relokation * Compiler produziert Assembler mit "Verweisen" * Assembler produziert Maschinencode mit Dummyverweisen (0x0) und Relokationstabelle * Linker schreibt korrekte Adressen hinein **F:** Welche Teile hat eine Objektdatei (Eingabe des Linkers)? * Symboltabelle * Text * Daten * Debuggininformationen * Relokationstabelle **F:** Warum extra Datensegment? * Will man nicht ausführen können * Hilfreich für dynamische Bibliotheken * noch gezeigt, wie mehrere Objectfiles gelinkt werden **F:** Gemeine Frage: Was ist ein Modell, was ein Metamodell * Domäne: Problembereich (Menge aller C Programme) * Modell: formale Beschreibung einer Probleminstanz (C Programm) * Metamodell: formale Beschreibung des Problembereiches (C Spezifikation) **F:** Speicherverwaltung: Was machen malloc und free? * Freispeicherliste auf Heap (Heap mit mmap/brk) * Unterschiedliche Sortiervarianten (nicht sortiert, nach Adresse, nach Größe, ...) **F** Warum muss man zum Mergen benachbarter Freispeicherelemente nicht unbedingt nach Adresse sortieren? * Größe und Tag an beiden Seiten des Freispeicherbereiches **F:** Was kann man noch machen? * ??? * Mehrere Listen für unterschiedliche Größen