Laufzeitsysteme und virtuelle Maschinen
Laufzeitsysteme und virtuelle Maschinen stellen die Ausführungsumgebung für Programme bereit, indem sie Zwischencode interpretieren oder kompilieren und die Dienste verwalten, die ein laufendes Programm benötigt.
Definition
Ein Laufzeitsystem ist die Softwareumgebung, die die Ausführung eines Programms über dessen eigenen Code hinaus unterstützt, und eine virtuelle Maschine ist eine abstrakte Ausführungs-Engine, die einen portablen Befehlssatz interpretiert oder kompiliert und Portabilität sowie Laufzeitdienste bereitstellt.
Scope
Dieses Thema behandelt die Schicht zwischen kompiliertem Code und Hardware: Bytecode-Interpreter und abstrakte Maschinen, Just-in-Time (JIT)-Kompilierung, dynamische Dispatch- und Methoden-Lookup, Aufrufkonventionen und Stack-Management sowie Laufzeitdienste wie Ausnahmebehandlung und Reflexion. Es befasst sich mit dem Design portabler virtueller Maschinen und den Techniken, die verwaltete Sprachen effizient machen.
Core questions
- Wie ermöglichen virtuelle Maschinen Portabilität über Hardware hinweg?
- Wie kombiniert die Just-in-Time-Kompilierung Interpretation und nativen Code?
- Wie werden dynamischer Dispatch und Methoden-Lookup effizient gestaltet?
- Welche Laufzeitdienste müssen eine verwaltete Sprache unterstützen?
Key theories
- Architektur portabler virtueller Maschinen
- Die Spezifikation der Java Virtual Machine definiert einen portablen, verifizierbaren Bytecode und ein Ausführungsmodell, das zeigt, wie eine virtuelle Maschine eine Sprache von einer bestimmten Hardware entkoppelt.
- Just-in-Time-Kompilierung
- Aycock untersucht die Techniken, mit denen Laufzeitsysteme Code während der Ausführung in native Form kompilieren, wobei sie den Interpretationsstart mit dem Durchsatz des kompilierten Codes unter Verwendung von Laufzeitinformationen abgleichen.
- Inline-Caching für dynamischen Dispatch
- Deutsch und Schiffmans Smalltalk-Implementierung führte Inline-Caching und dynamische Übersetzung ein, Schlüsseltechniken, um den Methoden-Lookup in dynamisch dispatchenden Sprachen schnell zu machen.
Clinical relevance
Virtuelle Maschinen und verwaltete Laufzeitsysteme treiben weit verbreitete Plattformen für Java, .NET, JavaScript und Python an und bieten Portabilität, Sicherheit und adaptive Optimierung. JIT-Kompilierung und Inline-Caching sind der Grund, warum hochrangige, dynamische Sprachen eine wettbewerbsfähige Leistung erzielen können.
History
Abstrakte Maschinen reichen bis zu frühen portablen Systemen und Smalltalk zurück, dessen Implementierung von 1984 Pionierarbeit bei der dynamischen Übersetzung und Inline-Caches leistete. Die Java Virtual Machine popularisierte Mitte der 1990er Jahre portablen Bytecode, und adaptive JIT-Compiler wie HotSpot und später JavaScript-Engines brachten aggressive Laufzeitoptimierung in gängige verwaltete Sprachen.
Debates
- Interpretation versus Just-in-Time-Kompilierung
- Laufzeitdesigner wägen einfache Interpreter mit schnellem Start und geringem Speicherverbrauch gegen JIT-Compiler ab, die eine höhere Spitzenleistung auf Kosten der Aufwärmzeit und Implementierungskomplexität erzielen, wobei oft beide in gestuften Systemen kombiniert werden.
Key figures
- Peter Deutsch
- John Aycock
- James Gosling
- Gilad Bracha
Related topics
Seminal works
- lindholm2014
- aycock2003
- deutsch1984
Frequently asked questions
- Was ist in diesem Kontext eine virtuelle Maschine?
- Hier ist eine virtuelle Maschine eine Software-Ausführungs-Engine, die einen portablen Befehlssatz (wie Bytecode) ausführt, die zugrunde liegende Hardware abstrahiert und Laufzeitdienste bereitstellt, anstatt einen ganzen Computer zu emulieren.
- Wie trägt die Just-in-Time-Kompilierung zur Leistungssteigerung bei?
- Ein JIT-Compiler übersetzt häufig ausgeführte Teile eines Programms zur Laufzeit in nativen Code, wobei er Profiling-Informationen verwendet, die einem Ahead-of-Time-Compiler fehlen, sodass 'heißer' Code nahezu mit nativer Geschwindigkeit läuft.