Der Java Specification Request 292 (JSR-292)[51] erweitert die Java Virtual Machine (JVM) Spezifikation[34] um die effiziente Implementierung von dynamisch typisierten Programmier- sprachen zu ermöglichen. Der invokedynamic Bytecode ist die wichtigste Neuerung in diesen Zusammenhang. Das Ziel dieser Arbeit ist es alle neuen Features von JSR-292 in der CACAO JVM[30],[31] zu implementieren. Die Umsetzung der neuen Instruktionen und Schnittstellen hat Auswirkungen auf eine Vielzahl von Modulen der virtuellen Maschine, darunter den Classloader, den Bytecode- Verifizierer, den Just-In-Time (JIT) Codegenerator und den Garbage-Collector. Die OpenJDK-Klassenbibliothek enthält einen Laufzeit-Bytecode Generator[57], welcher Tei- le von JSR-292 implementiert. Unglücklicherweise verwendet dieser Generator mehrere inter- ne Schnittstellen der HotSpot JVM und Erweiterungen des Bytecode Befehlssatzes. Ein großer Teil dieser Arbeit war ihrer Reimplementierung in CACAO gewidmet. Das größte Problem stell- te die Annahme des Generators dar, dass die virtuelle Maschine Bytecode unterstützt, der sein Stackverhalten zur Laufzeit verändert. Die HotSpot JVM verwendet in solchen Fällen einen Bytecode-Interpreter, für den Änderungen des Operandenstack kein großes Problem darstellt. Da CACAO sich zur Ausführung von Bytecode vollständig auf einen JIT-Übersetzer verlässt, ist dieser Ansatz derzeit nicht möglich, es war daher notwendig OpenJDKs Generator Framework zu analysieren um das dynamische Verhalten des generierten Bytecode vorhersagen zu können. Abschliessend vergleichen wir die Implementierung von JSR-292 für CACAO mit der von HotSpot und JamVM, zwei weiterer JVMs die den selben Bytecode-Generator verwenden, um Erkenntnisse darüber zu gewinnen wie sich low-level Implementierungsentscheidungen auf die Effizienz auswirken.
de
The Java Specification Request 292 (JSR-292)[51] adds features to the Java Virtual Machine (JVM) specification[34] that facilitate high performance implementations of dynamically typed languages, most notable the new invokedynamic bytecode. The aim of this thesis is to implement all new features of JSR-292 in the CACAO Java Virtual Machine[30],[31]. Implementing the invokedynamic instruction requires several changes to the JVM, which interact with various subsystems such as the class file loader, the bytecode verifier, the JIT code generator and even the garbage collector. The OpenJDK class library contains a runtime bytecode generator[57] which implements parts of JSR-292. Unfortunately, the generator relies on a number of internal APIs of the HotSpot JVM and non standard extensions to the bytecode instruction set and a large part of this work was dedicated to porting these to CACAO. Most notable among these is that the generator as- sumes that its host VM can handle changes to a methods stack behavior during execution, which HotSpot handles by falling back to interpreted mode. With CACAOs JIT only approach to ex- ecuting bytecode this is currently not feasible, as a workaround OpenJDKs generator is reverse engineered and the dynamic behaviour of the bytecode is anticipated statically where necessary. Finally, the JSR-292 implementation of CACAO is compared to that of HotSpot and JamVM, two JVMs that also use the same bytecode generator framework, in order to gain insights on how low level implementation decisions impact performance.
en
Additional information:
Abweichender Titel laut Übersetzung der Verfasserin/des Verfassers Zsfassung in dt. Sprache