Einführung in die Systemprogrammierung Bytecode Prof. Dr. Christoph Reichenbach Fachbereich 12 / Institut für Informatik 2. Juli 2015 Bytecode als Zwischensprache Historischer Hintegrund: I I I Entwicklung von Pascal-Übersetzern Portierung von Übersetzern von Architektur A nach B zeitaufwändig, fehleranfällig Idee:1 I I I I I 1 Wir schreiben eine Übersetzerimplementierung, in Pascal Zielarchitektur P, eine Stapelmaschine (nicht in Hardware) P-Code: möglichst einfach gehalten Interpreter für P-Code: Einfach zu schreiben Übersetzen den Übersetzer nach P-Code: ⇒ Ausführen des Übersetzers benötigt nur P-Code-Interpreter Nori, Ammmann, Jensen, Nägeli: “The Pascal P Compiler: Implementation notes”, ETH Zürich, Dezember 1974 Bytecode heute I I P-Code ist erstes Beispiel für Bytecode In unseren Beispielsprachen verwendet von: I I I I Python Java Interpretierung ineffizient (Faktor 15-20 langsamer als übersetzer Code) Stattdessen: Übersetzung P-Code nach Maschinencode Bytecode: Vorteile und Nachteile Vorteile I I Obfuszierung trotz Portabilität Übersetzung Bytecode vs. Quellcode: I I I I Nachteile I I I I Sparen uns Parsen, Namensanalyse Einfache Interpretierung Software-Werkzeuge können einfache Programmrepräsentierung zur Analyse nutzen Oberflächensyntax kann geändert werden Aufwand Bytecode-Schnittstelle: I I I Spezifizierung Backend Frontend Speicherrepräsentierung Bytecode-Eingabe, Ausgabe implementieren Versionskompatibilität Andere Formen von Bytecode I Dalvik-Bytecode I I I Common Intermediate Language (CIL) I I I Verwendet auf Android Registertransfercode: Ähnelt realistischem Maschinencode Verwendet von Microsoft .NET Ähnlich Java-Bytecode LLVM-Bitcode I I ... Verwendet vom LLVM-Übersetzer Komplexer Code mit Eigenschaften einer Hochsprache Zusammenfassung: Bytecode I I I I I Bytecode repräsentiert Zwischenzustand des Übersetzers Meist weniger komplex als Hochsprache, Maschinensprache Plattformunabhangig Erleichtert Portierung von Programmen Höhere Implementierungskomplexität