Compilers Everywhere
Mit Java 1.0 war die Welt noch einfach. Es gab einen Compiler, der Java-Quellcode in Bytecde übersetzte und eine virtuelle Maschine, die Bytecode interpretierte. Das änderte sich mit Java 1.2. Sun führte die sogenannte Hot-Spot-VM ein, die beim Erkennen von "heißen" Code-Stellen, also besonders häufig ausgeführten Code-Segmenten, diese on the fly in Maschinen-Code der realen Hardware übersetzte und ausführte. Der Just-In-Time-Compiler (JIT) war geboren.
Heute gibt es im OpenJDK zwei davon, den Client-Compiler, C1 genannt, und den Server-Compiler, C2 genannt. Man kann (manchmal) sich für einen entscheiden oder beide kombinieren, der sogenannten Tiered Compilation. Mit Java 9 kam der Ahead-of-Time Compiler (AOT) hinzu, wenn auch zunächst nur experimentell und nur für Linux. Dieser übersetzt wie ein normaler Compiler den Quellcode in direkt ausführbaren Maschinen-Code. IBMs JDK macht dies schon seit Java 8. Basis des OpenJDK-AOT-Compilers ist Graal, der neue JIT-Compiler und als GraalVM das Polyglot-Laufzeitsystem für die JVM. Graal wurde mit dem JEP 317 in Java 10 integriert und steht damit auch als JIT-Compiler zur Verfügung, zunächst auch nur experimentell.
Wir versuchen, in diesem Talk einen Überblick über die verschiedenen Java-Compiler zu geben, um den Wald trotz lauter Bäume sehen zu können. Begriffe wie Compiler Threshold, On-Stack Replacement und Escape Analysis werden erläutert.
Vorkenntnisse
Grundkenntnisse Java und JVM
Lernziele
Am Ende des Vortrags hat der Zuhörer einen Überblick über die verschiedenen Compiler und kann Java-Compiler-Welten besser verstehen.