===== Uebersetzerbau 3 ===== **Prüfer**: Prof. Dr. Michael Philippsen, Dipl.-Inf. Stefan Kempf\\ **Syntax**: Frage? //(Meine) Antwort//\\ **Anmerkung**: Hab viel selbst erzaehlt da Prof. Dr. Philippsen das so gerne sieht(?) === Gedaechtnis-Protokoll === Fragen kamen nur von Stefan. Er hat auch nur Fragen zum Praktikum und den Teilen der Vorlesung gestellt die er selbst gehalten hat. * Byte-Code: int foo(int a){ add tmp, a, 1 return tmp; } int main(){ ... // hier standen Anweisungen push y call z, foo() ... // noch mehr sinnlose Anweisungen } * Was macht ein Interpreter damit? * Wie sieht der Aufruf von foo() aus? // Interpreter ruft sich selbst rekursive Aufruft oder macht direkte Sprung im Byte-Code.// * Was macht der JIT? * Ohne Optimierung // Das ganz normale 1:1 Codeerzeugen erklaert. // * JIT2 = Registervergabe mittels Linear Scan * Algorithmus an **einfachem** Beispiel (nur gegebenen Lebensspannen) auf Papier vorfuehren. Davor hab ich selbst noch erklaert wie man die Lebenspannen korrekt berechnet, etc. * Dann JIT3: foo() in main inlininen * Wann sollte man JITen? // Laufzeitmessung: Zaehler vs Stichproben // * Zwischen drinnen kam noch eine Frage zu was passiert wenn man aus Interpretiertem Code gejiteten Code aufrufen will oder umgekehrt. // Trampolin Funktion. System vs Interpreter Stack. On-Stack-Replacement // (Die genaue chronologische Einordnung in den obigen Block ist mir leider entfallen.) * Exceptions * Warum? * Wie? //dynamisches Registrieren vs statische Tabellen (kurz umrissen) // * Was ist zur Laufzeit besser? // statische Tabellen // * Linker und Loader: * Dynamic shared Library * Wie muss der Code beschaffen sein? // PIC // * Was passiert wenn man foo() der Library aufruft? // PLT: Erst steht dort die Adresse des Stubs der dann die richtige Adresse berechnet und in die PLT eintraegt (und dann noch foo() aufruft). // * Wie koennte man fuer Daten auch Lazy-relocation implementieren? // ? // Alles in allem lockerer Pruefung. Gerne wieder.