Zum Inhalt springen

Virtuelle Maschine

aus Wikipedia, der freien Enzyklopädie
Dies ist eine alte Version dieser Seite, zuletzt bearbeitet am 12. Februar 2006 um 04:28 Uhr durch 84.148.56.246 (Diskussion) (Zwei Absätze verschoben (siehe Diskussion) und den Rest der ersten Sektion entsprechend den Begründungen angepasst). Sie kann sich erheblich von der aktuellen Version unterscheiden.

Eine virtuelle Maschine (VM) ist allgemein ein Modell eines Prozessors und der zugehörenden Systemarchitektur, dessen Rechenweise unabhängig von der technischen Ausführung beschrieben wird. Der Begriff der Maschine für virtuelle Ausführungsmodelle tauchte schon früh in der Entwicklung der Informatik auf, darunter die Turing-Maschine.

Virtuelle Maschinen stellen entweder einen virtuellen Server (Gast-System) oder eine virtuelle Laufzeitumgebung für Programme innerhalb eines Host-Systems zur Verfügung.

Sie können entweder vollständig in Software oder mittels einer Kombination aus Software und Hardware (Vanderpool, Pacific, LPAR, z/VM) implementiert werden.

Stellt das Host-System keine Möglichkeit zur Verfügung, den Anwendungscode direkt auf einer CPU ausführen zu können, muss ein Interpreter den Anwendungscode indirekt ausführen. Benötigt das Gast-System Schnittstellen (z.B. für Geräte und Kommunikation) definiert, die das Hostsystem nicht bereitstellt, müssen diese emuliert werden.

Systeme und Modelle

In der Entwicklung der Rechnerarchitekturen hat sich eine Trennung der typischen VM Modelle ergeben, mit denen Hardware CPUs und Software VMs entwickelt werden. Die große Mehrzahl realer CPUs verwalten mehrere Operanden in einer beschränkten Zahl direkt adressierbarer Register (Registermaschinen), die große Mehrzahl der portablen VM Systeme verwalten ihre Operanden in einem verschieblichen unbeschränkten Stapel (Stapelmaschinen). Dies ergab sich durch die verschiedenen Vorteile dieser Ansätze.

Bei VM Modellen nach Art von Stapelmaschinen entsprechen die obersten Stapelwerte jeweils dem Parameterblock eines Funktionsaufrufs, der nur einmal vorhanden ist. Die Registermaschinen kommen dagegen ohne Parameterblock aus, indem Schalter bestimmte Register für eine Operation an- und abschalten, wofür zusätzliche Schalter und Leiterbahnen gebraucht werden. Dies beschränkt die Zahl der Register und Recheneinheiten. Eine Emulation von Registermaschinen ersetzt nun die Recheneinheiten durch Funktionsblöcke, für deren Aufruf jeweils Parameterblöcke erstellt werden.

Virtuelle Maschinen mit Orientierung auf Ausführung in Software spielen heute eine bedeutende Rolle, da Microsoft mit der .NET Architektur dem Beispiel von Sun mit der Java-Virtuellen-Maschine (Java VM) folgt. Hintergrund ist jeweils die Orientierung auf plattformunbhängige Ausführung von Programmen auf verschiedenen Rechnern, die über ein Netzwerk (Internet) verbunden sind.

Die heutigen VM-Systeme besitzen eine große Zahl von Vorläufern, bei denen nutzerorientierte Darstellungen eines Programms (Programmiersprachen) nicht direkt in die maschinenorientierte Darstellung der CPU übersetzt wurde (Maschinencode), sondern in einen einfach strukturierten Zwischencode. Dieser Zwischencode wird dann auf dem Zielsystem durch einen Interpreter ausgeführt. Neben der direkten Ausführung stehen dabei auch verschiedene Optimierungen zur Verfügung, insbesondere die JIT-Compiler.

Die Speicherung des Zwischencodes kann unterschiedlich ausfallen, etwa als Bytecode oder als Baumstruktur. Technisch kann dies als Vorkompilierung betrachtet werden, bei der die Analyseschritte eines Compilers zum Verständnis der problemorientierten Programmiersprache durchlaufen werden (Frontend des Compilers), jedoch keine maschinenorientierte Anpassung an eine spezielle CPU erfolgt (Backend des Compilers), sondern die Anpassung an die abstrakten Ausführungseigenschaften der virtuellen Maschine erfolgt.

siehe auch: Interpreter und Compiler

Systeme und Umgebung

Neben der reinen Beschreibung des Rechenwerkes der VM sind für anwendbare VM Systeme die Festlegung der Ausführungsumgebung wichtig. Während bei der JavaVM hier keine sprachliche Unterscheidung getroffen wird (die Programmiersprache und die Bibliotheken bilden eine Einheit), benennt man sie bei .NET getrennt - der Zwischencode ist die CIL (Common Intermediate Language), die Ausführungsumgebung ist die CLR (Common Language Runtime), und weitere Bibliotheken werden als Framework zusammengefasst. Der Framework-Begriff findet sich bei Java übrigens nicht als Teil der Basisspezifikation, sondern erst bei Erweiterungen wie OSGi, die eine dynamische Service-Architektur auf Basis von Bundles (vergleichbar konventionellen Shared Libraries oder Plugins) realisieren.

Die CLR von .NET ist dabei der JavaVM so ähnlich, dass compilierte Java Programme darin ausgeführt werden könnten, sofern die verwendeten Bibliotheken zur Verfügung stünden; die praktische Verfügbarkeit der Bibliotheken beschränkt jedoch derzeit die direkte Ausführung, so dass bisher .NET'VM Systeme und JavaVM Systeme in der Praxis strikt getrennt auftreten. Und obwohl beide VM-Systeme auf Portabilität hin designt wurden, sind wegen der faktischen Verfügbarkeit der Bibliotheken bei Java die aktuelle Versionen meist zuerst für Windows und Unix-Derivate (z.B. Linux) verfügbar, sowie bei .NET intentionell auf die diversen Windows-Plattformen beschränkt.

Vorteile und Nachteile

Vorteile einer portablen virtuellen Maschine:

Nachteile einer portablen virtuellen Maschine:

  • Die Ausführung in eines portablen Programms in portablen virtuellen Maschine ist meist langsamer als die native Ausführung von Programmen die speziell für die Zielumgebung übersetzt wurden:
    • Vei Verwendung eines Interpreters ergeben sich zusätzliche Indirektionen, was weniger effizient als direkte Ausführung ist
    • Dynamische Übersetzung zur Laufzeit (JIT-Compiler) löst zwar die meisten Indirektionen auf und sorgt für großteils direkte Ausführung, jedoch ist die Übersetzung selbst, bis der Code direkt Code ausgeführt werden kann ein Merhaufwand, der jedoch nur im Moment der Übesetzung anfällt, jedoch nicht mehr bei späteren Durchläufen.

Diese Nachteile können durch geeignete Optimierungen (zum Beispiel dynamische Optimierung) verringert werden. Eine weitere Möglichkeit ist die automatische Kompilierung mittels Ahead-Of-Time-Compiler unmittelbar vor der Ausführung, damit wird das Backend eines hochoptimierenden maschinenorienterten Compiler unmittelbar auf dem Anwendersystem ausgeführt und dabei kann dieser noch spezifischere Optimierungen an das System des Anwenders vorhehmen als die bei einem vorkompilierten Programm möglich wäre.

Weitere virtuelle Maschinen

Neben den Stapelmaschinen der JVM/CLR gibt es auch registerbasierte virtuelle Maschinen, etwa MMIX oder die Parrot-Implementierung von Perl6. Neben der Definition von virtuellen Maschinen für allgemeine Aufgaben gibt es auch spezielle Modelle wie etwa die VM Definition für Shaderprogramme in 3D-Systemen, die an den Grafikprozessor übergeben werden.

Ein verbreitetes, aber unbekannt gebliebenes VM System ist OpenFirmware, auf der Basis einer Forth Stapelmaschine mit festgelegten F-Codes und Laufzeitumgebung für den speziellen Einsatz zur BIOS Programmierung. Eingesetzt wird dieses System heute überwiegend bei PowerPC-Rechnern auf CHRP-Basis.

Umgekehrt findet sich die Möglichkeit, die Hardware einer CPU um die Möglichkeit zur Ausführung mehrerer verschiedener VM Modelle zu erweitern. Wie bei einem Emulator in Software wird dabei meist eine fremde virtuelle Maschine in den internen Maschinencode (Microcode) der Hardware-CPU übersetzt und ausgeführt. Der Transmeta Prozessor besitzt keine äußerlich sichtbare eigene Modelldefinition.

Siehe auch