Von Java zum Bytecode Seminar: Implementierung moderner virtueller Maschinen am Beispiel von Java Tri-Thong Truong Übersicht ● Einstieg: Was ist Bytecode?, Aufbau einer VM ● Scanner, Parser, Aufbau eines Syntaxbaumes ● Visitor-Pattern, TreeWalker ● Optimierungen 2 Java-Compiler Quellprogramm Quellprogramm wird in Zwischenprogramm (Bytecode) compiliert. Übersetzer Zwischenprogramm Eingabe Bytecode wird von VM interpretiert. Virtuelle Maschine Ausgabe 3 Aufbau einer VM ● ● ● ● JVM ist Stack-basiert Jeder Thread hat einen eigenen JVM-Stack mit Frames Jeder Aufruf einer Funktion erzeugt neuen Frame Ein Frame besteht im Wesentlichen aus: - Operand Stack, - Array of local variables, und - einer Referenz auf den Constant pool der der Funktion übergeordneten Klasse Constant pool 4 Was ist Bytecode? ● Bytecode vergleichbar mit Assembler in C/C++ ● Bytecode entweder direkt in VM, oder auch JIT ● Bytecode sorgt für Plattformunabhängigkeit 5 Übersicht Bytecodebefehle 6 Bytecode (Bsp) 7 Bytecode (Bsp) 8 Bytecode (Bsp) 9 Aufbau einer class-Datei 10 Programmcode ? Bytecode 11 Scanner, Parser, ... Was javac macht Lexical Scanner Parser Syntaxbaum Sub-Routine des Parsers Recursive-descent parser Ausgabe des Parsers ... 12 Codebeispiel Scanner 13 Codebeispiel Scanner 14 15 Codebeispiel Parser 16 Codebeispiel JCCompilationUnit 17 Codebeispiel JCCompilationUnit Gibt Baum auf höchstem Level zurück 18 Übersicht: Interface-Vererbung im package com.sun.tools.javac.tree 19 Übersicht: Interface-Vererbung im package com.sun.tools.javac.tree 20 Übersicht: Interface-Vererbung im package com.sun.tools.javac.tree 21 Semantische Analyse Wie wird dies im Javac erkannt? 22 Visitor-Pattern ● ● ● ● ● Auf Objektstruktur erfordert Erweiterung von (nicht miteinander verwandter) Operationen eine Erweiterung aller Klassen Visitor-Pattern lagert Operationen auf Objektstruktur in externe Visitor aus Neue Operationen lassen sich leicht durch die Definition neuer Visitor hinzufügen Verwandte Operationen werden im Visitor zentral verwaltet und von besucherfremden Operationen getrennt Visitor können über mehreren Klassenhierarchien arbeiten 23 Visitor-Pattern (UML) 24 Visitor-Pattern im Java-Compiler (exem.) 25 TreeScanner ● Ist ein Visitor ● Scannt rekursiv von oben nach unten und links nach rechts durch den Baum 26 TreeTranslator Bietet Möglichkeit, Knoten zu ersetzen 27 Typkonvertierung 28 Optimierungen ● Keine Optimierungen auf Bytecode-Ebene ● Aber: in der semantischen Analyse ● Invarianten? ● Schlecht geschriebener Code? 29 Optimierungsbeispiel I 30 Optimierungsbeispiel II 31 Optimierungsbeispiel III 32 Referenzen ● ● Source Code des javac-Compilers: http://openjdk.java.net/groups/compiler „Understanding bytecode makes you a better programmer“ http://www.ibm.com/developerworks/ibm/library/it-haggar_bytecode/ ● Buch „Compiler – Prinzipien, Techniken und Werkzeuge“ Aho, Lam, Sethi, Ullman ● Universität Hannover, Compiler-Bau Labor Unterlagen, jvm-1.pdf (JVM und JBC) ● Untersuchung des Compilers zum Java 6 Release, Bachelorarbeit, Grenz, Lindenberg ● www2.informatik.uni-erlangen.de/Lehre/WS200304/Java_Sem/vortraege/13bytecode.ppt ● http://www.javaworld.com/javaworld/jw-09-1996/jw-09-bytecodes.html ● Wikipedia (DE) Compiler, Visitor Pattern ● Wikipedia (EN): Java bytecode, Java Compiler, javac, Java Virtual Machine 33