next up previous contents
Next: Zusammenfassung Up: Programmausführung Previous: Optimierung von Java-Programmen   Inhalt


Dynamische Übersetzung

Auf den ersten Blick scheint die Verwendung dynamischer Compiler, die erst zur Laufzeit Übersetzungsvorgänge durchführen, nur Nachteile im Vergleich zu ihren statischen Pendants mit sich zu bringen. Sie brauchen Rechenzeit, die eigentlich nutzbringender im Anwendungscode verbracht würde, und sie belasten den Hauptspeicher durch ihren eigenen Objektcode sowie umfangreiche Datenstrukturen, die zur Übersetzung benötigt werden. Warum also stellt dynamische Übersetzung nichtsdestotrotz die überwiegende Ausführungstechnik virtueller Maschinen dar?

Zunächst bietet die Java-Plattform die Möglichkeit, das Programm zur Laufzeit zu erweitern. Statische Systeme unterstützen diesen dynamisch geladenen Code maximal durch Interpretation. Bei Anwendungen, die fremden oder dynamisch erzeugten Code integrieren, wie z.B. Applikationsserver, läßt sich der genaue Umfang aktiver Klassen gar nicht bestimmen, so daß ein statischer Übersetzungsprozeß immer Gefahr läuft, relevante Teile zu ignorieren.

Weiterhin hat ein dynamischer Compiler exaktes Wissen über die ausführende Maschine. Besonderheiten wie der Instruktionssatz oder die Zahl der Prozessoren, lassen sich vorteilhaft zur Codeerzeugung auswerten. Beispielsweise unterscheidet der dynamische Compiler der Hotspot VM zwischen SPARC-Prozessoren der Revisionen V8 und V9; letztere bietet ,,Compare-And-Swap``- sowie ,,Conditional-Move``-Instruktionen. Gleiches wäre beispielsweise für dedizierte Hardware wie die MMX-Erweiterungen der Intel IA32-Architektur denkbar.

Der Hauptvorteil eines dynamischen Compilers liegt jedoch in der parallelen Ausführung mit dem Programm begründet: Optimierungsentscheidungen können auf Basis des Programmzustands getroffen und gegebenenfalls sogar revidiert werden. Das bedeutet, ein dynamischer Compiler hat gegenüber einem statischen einen Informations-2.2 und Flexibilitätsvorsprung, denn ihm stehen zur Laufzeit folgende Informationen zur Verfügung:

Insbesondere der erste Punkt unterliegt einer bedeutsamen Einschränkung. Durch das dynamische Laden von Klassendefinitionen läßt sich der Umfang eines Java-Programms beliebig erweitern. Der zuvor erzeugte Code könnte somit nicht länger korrekt sein. Daher muß die Laufzeitumgebung folgendes sicherstellen: Code, der auf einer -- nun widerlegten -- Annahme über das Programm beruht, darf nicht länger ausgeführt werden; zumindest jedoch mit keinem Exemplar der neu geladenen Klassen. Techniken zur Feststellung und Bereinigung solcher Situationen werden in Abschnitt 3.3 weiter diskutiert.

Grundsätzlich sei darauf hingewiesen, daß durchaus hochoptimierende statische Übersetzer für Java existieren. Produkte wie TowerJ[TowerJ, 2000] oder NaturalBridge BulletTrain[NaturalBridge, 2000] belegen, daß alternative Ausführungsmodelle realisierbar sind. Immerhin erzielte TowerJ lange Zeit die beste Performance im Volano Benchmark[Volano, 2000].


next up previous contents
Next: Zusammenfassung Up: Programmausführung Previous: Optimierung von Java-Programmen   Inhalt

2001-02-28