Capsule : Simuler un ordinateur avec un ordinateur

Si l’on admet qu’un ordinateur est équivalent à une machine de Turing universelle, c’est-à-dire une machine de Turing capable de simuler n’importe quelle machine de Turing et donc n’importe quelle machine de Turing universelle, il s’en suit qu’un ordinateur peut simuler n’importe quel ordinateur. Cette possibilité peut être exploitée de plusieurs manières selon le but recherché. Dans cette capsule de théorie, nous allons en distinguer trois :

  • Interpréteur : Le but est de permettre la réalisation d’une application qui peut être utilisée sur n’importe quel système d’exploitation et n’importe quel matériel.
  • Émulateur : Le but est de simuler du matériel qui n’existe plus, trop coûteux à exploiter ou indisponible (console de jeu rétro, ordinateurs historiques, équipements réseau).
  • Hyperviseur : Le but est de faire fonctionner plusieurs systèmes d’exploitation indépendants de manière aussi performante que possible (machines virtuelles) simultanément sur le même hôte.

Interpréteur

Un interpréteur est un programme capable de charger et d’exécuter un programme écrit dans un langage de programmation (JavaScript, PHP, Python, etc.) ou dans un langage machine portable (Java bytecode, MSIL, pcode, etc.). L’utilisation d’un interpréteur permet l’exécution de programme sur n’importe quelle plateforme (système d’exploitation et processeur) pour peu que l’interpréteur existe pour cette plateforme.

Un interpréteur fait généralement partie d’un système composé d’une bibliothèque standard (.NET Framework Class Library, Java Class Library, WebAPI, etc.), de divers outils (compilateur, débogueur, etc.). La JVM (Java Virtual Machine) ou le .NET CLR (Common Language Runtime) sont des exemples d’un tel système.

Émulateur

Un émulateur permet de simuler le comportement d’un système sur un autre système. Il exécute généralement un langage machine différent de celui de l’hôte.

On peut utiliser cette technique pour maintenir en activité des logiciels conçus pour des ordinateurs qui ne sont plus fabriqués ou dont l’exploitation est devenue trop coûteuse, mais aussi pour découvrir et s’amuser avec de vieilles consoles de jeux (Nintendo NES, Atari 2600, etc.) ou de vieux mini ou micro-ordinateurs (PDP11, Apple II, Commodore 64, etc.).

Hyperviseur

Un hyperviseur permet de faire fonctionner plusieurs systèmes d’exploitation simultanément sur une même machine de manière aussi performante que possible. Pour cela, l’hyperviseur utilise, autant que possible, directement les ressources matérielles de la machine hôte et émule le moins possible de matériel. Avec un hyperviseur, les machines virtuelles le même langage machine que leur hôte. Les processeurs modernes disposent souvent d’un support matériel pour la virtualisation (AMD-V et Intel VT)

Cette technique existe depuis les années 1960 sur des ordinateurs centraux (mainframe) et depuis la seconde moitié des années 2000 sur des micro-ordinateurs. C’est en principe ce à quoi l’on fait référence lorsque l’on parle aujourd’hui de machines virtuelles. Ces machines virtuelles sont notamment utilisées dans le domaine du développement pour tester des applications sur différentes plateformes et dans l’administration système pour tester des solutions logiciels, ou pour regrouper plusieurs serveurs sur une même machine physique (consolidation de serveurs).

On distingue deux types d’hyperviseurs :

  • Hyperviseur de type 1 : Un hyperviseur de type 1 fonctionne directement sur le matériel sans système d’exploitation (Vmware vSphere ou Citrix XenServer)

  • Hyperviseur de type 2 : Un hyperviseur de type 2 fonctionne au-dessus d’un système d’exploitation appelé système d’exploitation hôte (Oracle VM VirtualBox ou VMware Workstation). Le système d’exploitation d’une machine virtuelle est appelé système d’exploitation invité.