Information Technology Reference
In-Depth Information
rektheit des Syntaxbaums. - Welcher virtuelle Befehl zu welchem Knoten gehört, ist
anhand der Zeilennummern bzw. der den Knoten angehefteten Zahlen zu erkennen.
Der Syntaxbaum wird im weiteren Verlauf der Codeerzeugung traversiert. Ohne
Optimierungen und bei Verwendung einer auf Basisblöcke begrenzten Registerzu-
teilung lässt sich mit einem Traversierungsdurchgang das in Bild 4.6c dargestellte
Programm für einen realen 3-Adressprozessor mit vier Registern erzeugen. - Die
einem Knoten zuzuordnenden realen Befehle sind dabei ebenfalls anhand der den
Knoten bzw. den Zeilen angehefteten Nummern zu erkennen. So wird der Ladebe-
fehl in „Zeile“ 6 des realen Assemblerprogramms in Bild 4.6c z.B. beim Verlassen
des mit b beschrifteten Knotens 6 in Bild 4.6b erzeugt.
Problematisch an dieser ressourcensparenden Variante der Laufzeitübersetzung ist,
dass Variablen, auf die über mehrere Basisblöcke hinweg zugegriffen wird, zwi-
schen Register- und Hauptspeicher hin- und hertransportiert werden müssen. Dies
reduziert wegen der geringen Zugriffsgeschwindigkeit des Hauptspeichers deutlich
die Ausführungsgeschwindigkeit des virtuellen Programms im Vergleich zu einem
entsprechenden nativen Programm. Bessere Ergebnisse lassen sich durch eine basis-
blockübergreifende Registerzuteilung erzielen. Dabei ist jedoch in Kauf zu nehmen,
dass der Syntaxbaum mehrere Male durchlaufen und ggf. Hilfsstrukturen, wie
Datenfluss- oder Kontrollflussgraphen, erzeugt werden müssen, was sehr zeit- und
speicherplatzintensiv ist.
1:
iload_0
// a, ...
13:
1:
ld
r0 = @0
// a
2:
iload_1
// x, a, ...
=
2:
ld
r1 = @1
// x
3:
iload_1
// x, x, a, ...
// x 2 , a, ...
// x 2
11:
12:
4:
imul
4:
mul
r2 = r1, r1
+
&y
// ax 2
// ax 2 , ...
5:
imul
5:
mul
r3 = r0, r2
// b, ax 2 , ...
6:
iload_2
6:
ld
r1 = @2
// b
// x, b, ax 2 , ...
7:
ld
r2 = @1
// x
7:
iload_1
5:
10:
// bx, ax 2 , ...
+
*
8:
mul
r0 = r1, r2
// bx
8:
imul
// c, bx, ax 2 , ...
9:
iload_3
9:
ld
r2 = @3
// c
1:
4:
8:
9:
// bx + c, ax 2 , ...
a
c
10:
iadd
10: add
r1 = r0, r2
// bx + c
*
*
// ax 2 + bx + c, ...
11: add
r2 = r3, r1
11:
iadd
2:
3:
6:
7:
13: st
@4 = r2
// store y
12:
bipush 4
// &y, ...
x
x
b
x
13:
istore
// store y
a
b
c
Bild 4.6. Laufzeitübersetzung eines virtuellen Programms zur Berechnung eines Polynoms 2. Gra-
des. a virtuelles Assemblerprogramm für die 0-Adressarchitektur JVM von Sun. b Syntaxbaum. c
Assemblerprogramm für eine fiktive reale 3-Adressarchitektur
Durch eine aufwendige Laufzeitübersetzung ist es möglich, ein reales Programm zu
erzeugen, das nicht langsamer bearbeitet wird als ein entsprechendes natives Pro-
gramm, allerdings mit der Konsequenz einer deutlich längeren Übersetzungs- bzw.
Startzeit. Diese kann jedoch verkürzt und gleichzeitig der Speicherbedarf für die
Laufzeitübersetzung gemindert werden, wenn man das auszuführende virtuelle Pro-
gramm nicht als Einheit, sondern in kleinen Teilen übersetzt. Zum Beispiel lässt sich
die Ausführung eines virtuellen Programms beginnen, sobald das Hauptprogramm
als reale Befehlsfolge vorliegt. Unterprogramme, Funktionen oder Methoden müs-
sen zu diesem Zeitpunkt noch nicht übersetzt worden sein. Erst beim Verzweigen zu
Search WWH ::




Custom Search