|
Kompilation, Just-in-time-Kompilation
Ein Java
Interpreter ruft während des Abarbeitens von Bytecode Unterprogramme auf,
die den jeweiligen Bytecode als Sequenz von Maschinenbefehlen des
zugrundeliegenden Computersystems repräsentieren. Da diese Unterprogramme
selber schon Maschinencode sind, der direkt auf der zugrundeliegenden CPU
ausgeführt werden kann, liegt nichts näher, als während der Abarbeitung
des Bytecodes diesen Maschinencode zu sammeln, und die Bytecode-Sequenzen
nach und nach durch den fertigen Maschinencode zu ersetzen. Somit wird der
Bytecode während des Interpretierens compiliert.
|
1.Methode
-
Stack
wird auf Stack der Registermaschine abgebildet
-
Oberstes
Stackelement kommt in den Akku
-
Einfach
zu Implementieren
-
Schnelle
Compilierungszeit
-
Unnötige
Speicherzugriffe
2.Methode
|
Beispiel: b = a + c * d
|
|
|
iload a |
iload
c |
iload d |
|
|
|
|
|
|
imul |
iadd |
istore
b |
Übersetzung von Stackcode
zum Registercode:
JVM |
|
i386 |
|
i386 |
|
iload
a |
|
PUSH EAX
MOV EAX,a |
|
MOV EAX,a |
iload
c |
|
PUSH EAX
MOV EAX,c |
|
MOV EBX,c |
iload
d |
|
PUSH EAX
MOV EAX,d |
|
MOV ECX,d |
imul |
|
POP EBX
IMUL EBX |
|
IMUL
EBX,ECX |
iadd |
|
POP EBX ADD EAX,EBX |
|
ADD
EAX,EBX |
istore
b |
|
MOVE b,EAX
POP EAX |
|
MOVE
b,EAX |
Kompilierung mit einem C-Compiler
MOV EAX,c
IMUL EAX,d
ADD EAX,a
MOV b,EAX
Vorteile
der JIT Kompilierung
-
Da
dieser Vorgang während der Laufzeit geschieht, bleibt das
Java-Programm plattformunabhängig
-
Die
Abarbeitungsgeschwindigkeit kann drastisch gesteigert werden
Nacheile
der JIT Kompilierung
-
Da
der JIT-Kompiler zur Laufzeit kompiliert, ist er mehr damit
beschäftigt, den Code schnell zu kompilieren, als ihn effizient zu
kompilieren, da durch den Kompilevorgang soll die Ausführung des
Bytecodes auf keinen Fall verlangsamt werden.
-
Bei
jedem neuen Start des Java-Programms wird der Bytecode wieder aufs
neue kompiliert. Beim beenden eines Java-Programms wird der
kompilierte Code komplett verworfen.
-
Methoden
werden kompiliert, auch wenn sie eventuell nur einmal aufgerufen
werden. Somit kann das Kompilieren und anschließende Ausführen des
nativen Codes mehr Rechenzeit in Anspruch nehmen als einmalige
Interpretieren des Bytecodes.
Implementierungen von JIT Compiler
|
CACAO
Das
Interessante an Cacao ist die Implementation der Übersetzung durch
das obenerwähnte Registermodell der von Cacao
erzeugte Code ist daher sehr schnell. Cacao war anfangs eine
Diplomarbeit - wird jedoch momentan noch an der Technischen Universität
Wien weiterentwickelt. Ein Problem ist die nur teilweise
Implementation der Java 1.1 API.
|
TYA
-
TYA linkt sich in den Methodenaufruf eines bestehenden Java
Interpreters.
-
Wird
eine Methode aufgerufen, tritt stattdessen TYA in Kraft.
-
Wurde
die Methode schon compiliert, wird Sie über das Java Native
Interface (JNI) aufgerufen, ansonsten wird sie erst
kompiliert.
-
Ein
Vorteil von TYA ist, dass er einfach anwendbar, klein und
jederzeit ein- und ausschaltbar ist.
|
KAFFE
Die Kaffe OpenVM ist
eine unabhängige Implementierung einer virtuellen Java-Maschine
mit eigenen JIT Compiler und geht bezüglich minimalem
Speicherverbrauch neue Wege.Der JIT-Compiler Kaffe liegt nun
mittlerweile in der Version 1.0 vor. Das besondere an ihm ist,
neben der Verfügbarkeit unter der GNU Public License (GPL),
daß er als Personal Java 1.1 compliant gilt. Dies bedeutet,
daß eine Untermenge der kompletten Java 1.1 API unterstützt
wird und damit eine große Anzahl an Java-Programmen unter
Kaffe lauffähig ist. Kaffe implementiert weiterhin ein
kompletes Laufzeitsystem inklusive Unterstützung für das
Java Native Interface.
|
|