Systèmes d'exécution et machines virtuelles
Les systèmes d'exécution et les machines virtuelles fournissent l'environnement d'exécution pour les programmes, interprétant ou compilant le code intermédiaire et gérant les services dont un programme en cours d'exécution a besoin.
Definition
Un système d'exécution est l'environnement logiciel qui prend en charge l'exécution d'un programme au-delà de son propre code, et une machine virtuelle est un moteur d'exécution abstrait qui interprète ou compile un jeu d'instructions portable, offrant portabilité et services d'exécution.
Scope
Ce sujet couvre la couche entre le code compilé et le matériel : les interpréteurs de bytecode et les machines abstraites, la compilation juste-à-temps (JIT), le dispatch dynamique et la recherche de méthodes, les conventions d'appel et la gestion de la pile, ainsi que les services d'exécution tels que la gestion des exceptions et la réflexion. Il aborde la conception de machines virtuelles portables et les techniques qui rendent les langages gérés efficaces.
Core questions
- Comment les machines virtuelles assurent-elles la portabilité entre différents matériels ?
- Comment la compilation juste-à-temps combine-t-elle l'interprétation et le code natif ?
- Comment le dispatch dynamique et la recherche de méthodes sont-ils rendus efficaces ?
- Quels services d'exécution doivent prendre en charge un langage géré ?
Key theories
- Architecture de machine virtuelle portable
- La spécification de la machine virtuelle Java définit un bytecode et un modèle d'exécution portables et vérifiables, démontrant comment une machine virtuelle découple un langage d'un matériel particulier.
- Compilation juste-à-temps
- Aycock examine les techniques par lesquelles les systèmes d'exécution compilent le code en forme native pendant l'exécution, équilibrant le démarrage de l'interprétation et le débit du code compilé en utilisant les informations d'exécution.
- Mise en cache en ligne pour le dispatch dynamique
- L'implémentation de Smalltalk par Deutsch et Schiffman a introduit la mise en cache en ligne et la traduction dynamique, des techniques clés pour accélérer la recherche de méthodes dans les langages à dispatch dynamique.
Clinical relevance
Les machines virtuelles et les environnements d'exécution gérés alimentent des plateformes largement utilisées pour Java, .NET, JavaScript et Python, offrant portabilité, sécurité et optimisation adaptative. La compilation JIT et la mise en cache en ligne expliquent pourquoi les langages de haut niveau et dynamiques peuvent atteindre des performances compétitives.
History
Les machines abstraites remontent aux premiers systèmes portables et à Smalltalk, dont l'implémentation de 1984 a été pionnière de la traduction dynamique et des caches en ligne. La machine virtuelle Java a popularisé le bytecode portable au milieu des années 1990, et les compilateurs JIT adaptatifs tels que HotSpot, puis les moteurs JavaScript, ont apporté une optimisation agressive à l'exécution aux langages gérés grand public.
Debates
- Interprétation versus compilation juste-à-temps
- Les concepteurs de systèmes d'exécution mettent en balance les interpréteurs simples avec un démarrage rapide et une faible utilisation de la mémoire par rapport aux compilateurs JIT qui atteignent des performances de pointe plus élevées au prix d'un temps de chauffe et d'une complexité d'implémentation, combinant souvent les deux dans des systèmes à plusieurs niveaux.
Key figures
- Peter Deutsch
- John Aycock
- James Gosling
- Gilad Bracha
Related topics
Seminal works
- lindholm2014
- aycock2003
- deutsch1984
Frequently asked questions
- Qu'est-ce qu'une machine virtuelle dans ce contexte ?
- Ici, une machine virtuelle est un moteur d'exécution logiciel qui exécute un jeu d'instructions portable (tel que le bytecode), faisant abstraction du matériel sous-jacent et fournissant des services d'exécution plutôt que d'émuler un ordinateur entier.
- Comment la compilation juste-à-temps améliore-t-elle les performances ?
- Un compilateur JIT traduit les parties fréquemment exécutées d'un programme en code natif au moment de l'exécution, en utilisant des informations de profilage qu'un compilateur anticipé (ahead-of-time) ne possède pas, de sorte que le code « chaud » s'exécute à une vitesse proche du natif.