next up previous contents
Next: Ziel und Aufbau der Up: Einleitung Previous: Einleitung   Inhalt

Der Begriff der virtuellen Maschine

Mit dem Begriff der virtuellen Maschine werden vielfach zwei Dinge assoziiert. Zum einen bezeichnet er eine abstrakte Spezifikation, zum anderen eine konkrete Implementierung dieser Spezifikation.

Die Spezifikation einer virtuellen Maschine definiert das Modell einer Maschine zum Ausführen von Berechnungen. Dieses Modell enthält eine Maschinensprache, in der Berechnungsanweisungen für die Maschine erstellt werden können, sowie eine Beschreibung der Semantik der in der Sprache definierten Operationen. Die Art der Operationen impliziert ein bestimmtes Architekturmodell; das gängige Modell ist das der Stackmaschine -- sie wird von virtuellen Maschinen wie der Java VM [Gosling, 1995], unterschiedlichen Smalltalk VMs [Goldberg and Robson, 1983] und der Tycoon-2 VM [Gawecki and Wienberg, 1998] verwendet. Ein weniger verbreitetes Modell ist das der Registermaschine -- sie wurde beispielsweise von einigen LISP Implementierungen verwendet.

Die Spezifikation der virtuellen Maschine erlaubt die Entkopplung zweier Schritte: zum einen kann ,,gegen`` die Spezifikation programmiert werden, d.h. es können der Maschinensprache entsprechende Programme erstellt werden. Zum anderen können anhand der Spezifikation konkrete Implementierungen der virtuellen Maschine erstellt werden. Diese Implementierungen sind Computerprogramme, die ihrerseits Programme der abstrakt spezifizierten Maschinensprache ausführen.

Diese Maschinensprache kann dabei entsprechend dem spezifizierten Maschinenmodell unterschiedlich abstrakt sein. Es kann sich beispielsweise um für einen Menschen verständlichen Quellcode oder binär kodierte abstrakte Syntaxbäume handeln. Im Fall der häufig verwendeten Stackmaschinen umfaßt die Maschinensprache Befehle zur Manipulation eines abstrakten Stacks im Zusammenhang mit einem abstrakten Hauptspeicher. Durch das Fehlen von Registern entsteht eine sehr einfache Maschinensprache mit wenigen Befehlen -- da aus diesem Grunde jeder Befehl durch nur ein Byte dargestellt werden kann, wird eine solche Maschinensprache häufig als Bytecode bezeichnet. Dieser Bytecode wird üblicherweise von einem Compiler aus dem Sourcecode einer höheren Programmiersprache generiert. Als erster Bytecode wird gemeinhin der von [Nori et al., 1974] erstellte ,,P-Code-Interpreter`` für die Programmiersprache USCD-Pascal bezeichnet.

Neben der Spezifikation der Programmiersprache liegt somit auch die Spezifikation einer Plattform vor, auf die erstere abgebildet wird. Hierbei können sich Probleme von Inkompatibilitäten oder impedance mismatches ergeben. Weiterhin besteht die Möglichkeit, mehrere Programmiersprachen auf die abstrakte Plattform zu übersetzen. Die hiermit verbundenen Möglichkeiten und Probleme sind nicht Teil dieser Arbeit.

Die Aufgabe der Implementierung einer virtuellen Maschine ist eine möglichst effiziente Abbildung des Bytecodes auf die jeweilige konkrete Plattform, auf der die Maschine abläuft. Anders formuliert, muß die VM das Programm in ähnlicher Zeit und mit vergleichbarem Speicherbedarf ausführen wie ein direkt übersetztes Programm. Dabei erfüllt sie, abhängig von der implementierten Sprache, verschiedene Dienste wie Garbage Collection, Nebenläufigkeit, Überprüfen und Auslösen von Ausnahmen, Sicherheitprüfungen, Aufruf von Funktionen anderer Sprachen und Persistenz.

Für Java wurde die Spezifikation der virtuellen Maschine in [Lindholm and Yellin, 1996] festgehalten. Mittlerweile existiert eine Vielzahl von Implementierungen verschiedener Hersteller (Anhang A beschreibt eine Auswahl). Für die meisten Sprachen existiert hingegen keine gesonderte Spezifikation einer virtuellen Maschine, bzw. die Implementierung stellt die Spezifikation dar.


next up previous contents
Next: Ziel und Aufbau der Up: Einleitung Previous: Einleitung   Inhalt

2001-02-28