• Aucun résultat trouvé

Machines virtuelles. Brique ASC. Samuel Tardieu Samuel Tardieu (ENST) Machines virtuelles 1 / 40

N/A
N/A
Protected

Academic year: 2022

Partager "Machines virtuelles. Brique ASC. Samuel Tardieu Samuel Tardieu (ENST) Machines virtuelles 1 / 40"

Copied!
33
0
0

Texte intégral

(1)

Machines virtuelles

Brique ASC

Samuel Tardieu sam@rfc1149.net

École Nationale Supérieure des Télécommunications

Samuel Tardieu (ENST) Machines virtuelles 1 / 40

(2)

Machines virtuelles

La compilation peut avoir des désavantages : Le résultat n’est en général pas portable

Le résultat ne suit pas les évolutions des architectures :

Un programme compilé pour un Pentium 4 ne tournera pas sur un 386 (instructions manquantes)

Un programme compilé pour un 386 ne sera pas optimisé pour Pentium 4 (pas d’instructions MMX, ordonnancement)

(3)

Principes

Une machine virtuelle :

possède un jeu d’instructions virtuel, prédéterminé ou dynamique est émulée sur une ou plusieurs plates-formes (par le biais d’un moteur d’exécution)

peut posséder des instructions simples ou complexes

Samuel Tardieu (ENST) Machines virtuelles 3 / 40

(4)

Quelques machines virtuelles

Forth

Pascal UCSD

NeWS (serveur X11 PostScript) Python, Objective CAML, Erlang Parrot (pour Perl 6)

Java, .NET

(5)

Processus de compilation

Programme source

Bytecode

compilation

Samuel Tardieu (ENST) Machines virtuelles 5 / 40

(6)

Processus de compilation

Programme source

Bytecode

compilation

Machine virtuelle

(7)

Processus de compilation

Programme source

Bytecode

compilation

Machine virtuelle

Bibliothèques

référence

Samuel Tardieu (ENST) Machines virtuelles 5 / 40

(8)

Processus de compilation

Programme source

Bytecode

compilation

Machine virtuelle

Bibliothèques

référence

Interfaces natives

référence

implémente

(9)

Langages à pile

Les langages à pile :

peuvent être destinés à l’humain (exemple : Forth) ou à la machine sont plus efficaces lors d’un appel

permettent une représentation compacte

sont utilisés dans certaines machines virtuelles (exemple : Java)

Samuel Tardieu (ENST) Machines virtuelles 6 / 40

(10)

Exemple Java

Le code suivant :

static int t (int x, int y, int z) { return x+y*z;

}

se compile en

0:iload_0 // push x 1:iload_1 // push y 2:iload_2 // push z 3:imul // y*z 4:iadd // x+y*z

5:ireturn // return result

(11)

Remarques

La pile n’est utilisée que pour les constructions internes

Entre les méthodes, une pile de retour (arguments et variables locales, comme en C) est utilisée

La pile de données est vide à l’entrée d’une méthode Ces piles peuvent être implémentées avec une paire “frame pointer”/”stack pointer”

Samuel Tardieu (ENST) Machines virtuelles 9 / 40

(12)

Interprétation virtuelle

Il existe plusieurs techniques d’interprétation, dont : direct threaded code

indirect threaded code token threaded code subroutine threaded code compilation au vol

(13)

Direct threaded code

Un pointeur d’instruction (IP) pointe à l’endroit contenant la prochaine instruction à exécuter

À la fin de chaque mot,next est exécuté : Le pointeur d’instruction est incrémenté

On saute à la valeur précédente du pointeur d’instruction L’interpréteur peut être rappelé pour un mot non natif

Samuel Tardieu (ENST) Machines virtuelles 12 / 40

(14)

Coeur du Direct TC

; next permet de sauter au mot suivant next:

movl ip,%eax incl ip jmp *%eax

; Exemple: execution de a b c .section ".data"

abc: .long a b c ip: .long abc

(15)

Interpréteur Direct TC imbriqué

; sauvegarde de ip et du sommet de la pile de retour do_list:

movl (%esp),%eax movl ip,%edx

movl %edx,(%esp) ; Sauvegarde ancien IP movl %eax,ip ; Installation nouveau IP jmp next

; restauration de ip depuis la pile exit:

popl %eax movl %eax,ip jmp next

Samuel Tardieu (ENST) Machines virtuelles 16 / 40

(16)

Exemple de Direct TC

Les mots Forth : square dup * ; : cube dup square * ; se traduit par

square:

call do_list

.long dup,times,exit cube:

call do_list

.long dup,square,times,exit

(17)

Code natif et Direct TC

Voici des implémentations natives dedup ettimes (la pile Forth est indexée par %ebx) :

dup: movl (%ebx),%eax addl -4,%ebx movl %eax,(%ebx) jmp next

times: movl (%ebx),%eax addl 4,%ebx

imull (%ebx),%eax movl %eax,(%ebx) jmp next

Samuel Tardieu (ENST) Machines virtuelles 20 / 40

(18)

Caractéristiques du Direct TC

Tous les mots sont directement exécutables, ce qui facilite l’interface avec d’autres langages

Cela coûte un saut au début de chaque mot

Utilisation non-optimale des caches par le mélange de code et de données

Toutefois, le direct threaded code est un des moyens d’exécution les plus performants et les plus simples à implémenter.

(19)

Indirect Threaded Code

L’indirect threaded code ressemble au direct threaded code avec un niveau d’indirection supplémentaire : l’adresse où sauter est stockée plutôt que le saut lui-même.

Exemple : square:

.long do_list,dup,times,exit

Les mots ne sont pas exécutables, mais le code peut être plus compact.

Samuel Tardieu (ENST) Machines virtuelles 23 / 40

(20)

ITC : boucle d’interprétation

La boucle d’interprétation contient un niveau d’indirection supplémentaire : next:

movl ip,%eax incl ip

movl (%eax),%eax ; <--- ici jmp *%eax

(21)

Token threaded code

Plutôt que des adresses, on utilise des identificateurs (tokens).

Une table est utilisée pour associer chaquetoken à l’adresse à exécuter.

Si ces identificateurs sont fixés a priori : on obtient du code portable ;

il est possible de faire un “gros switch”.

Samuel Tardieu (ENST) Machines virtuelles 26 / 40

(22)

Boucle d’interprétation

void next (unsigned int *ip) { for (;;) {

switch (*ip++) { case OP_PLUS:

PUSH (POP() + POP());

break;

case METHOD_CALL:

next (FIND_METHOD (*ip++));

break;

case EXIT:

return;

...

(23)

Subroutine threaded code

Dans le subroutine threaded code, des appels sont insérés directement, c’est la voie vers la compilation native :

square:

call dup call times return

La première optimisation est immédiate square:

call dup jmp times

Samuel Tardieu (ENST) Machines virtuelles 30 / 40

(24)

Subroutine threaded code

Dans le subroutine threaded code, des appels sont insérés directement, c’est la voie vers la compilation native :

square:

call dup call times return

La première optimisation est immédiate square:

call dup jmp times

(25)

STC et compilation native

La compilation native est similaire au subroutine threaded code, sauf qu’il est possible de remplacer des appels par du code inline, comme ici : : foo drop bar ;

devient foo:

addl 4,%ebp \ Drop jmp bar

Samuel Tardieu (ENST) Machines virtuelles 32 / 40

(26)

Compilation au vol

La compilation au vol (Just In Time, ou JIT) :

transforme du bytecode en code natif au chargement ou à la première exécution ;

peut produire plusieurs alternatives natives d’un même code pour s’accomoder d’architectures différentes ;

a un surcoût fixe important ;

peut être plus efficace en « régime de croisière » qu’un interpréteur.

(27)

Exemple de la machine Java

Le code Java pour la JVM (Java Virtual Machine) :

est token threaded (avec des opcodes fixés à l’avance) ; peut être compilés au vol ;

a des tokens (opcodes) de très haut niveau (appel de méthode, exceptions, etc.)

fait appel à un grand nombre de bibliothèques externes.

Samuel Tardieu (ENST) Machines virtuelles 34 / 40

(28)

JVM et langages

D’autres langages que Java ciblent la machine virtuelle Java : Ada 95

Python Forth

Scheme, Basic, Logo, ...

(29)

Vérifications

Au moment du chargement (en général dynamique), la JVM vérifie : la bonne construction du fichier d’entrée

l’absence de débordement de pile (chaque méthode indique la place dont elle a besoin)

Sur certaines JVM, il est possible de précharger tous les modules utilisés potentiellement par une application Java, pour éviter une mauvaise surprise à l’exécution.

Samuel Tardieu (ENST) Machines virtuelles 36 / 40

(30)

Précompilation portable

Il est possible de partager du code machine s’exécutant, sans compilation au vol, à la vitesse du code natif.

Il suffit d’inclure les deux (bytecode et code natif pour une ou plusieurs plates-formes) dans la même distribution.

Au moment de l’exécution, choisir soit le code natif (plus rapide) s’il est disponible, soit le code à interpréter (plus facile à déboguer).

Le compilateur du langage Erlang et sa machine virtuelle ont adopté cette pratique.

(31)

Interface avec le système

Tout ne peut pas se faire en byte code.

La machine virtuelle s’interface avec le système.

En général, la VM permet d’appeler le système directement (appels systèmes ou appels de bibliothèques).

Écrire des parties en code natif permet d’accélérer certaines routines critiques.

Samuel Tardieu (ENST) Machines virtuelles 38 / 40

(32)

Java vs .NET

Java :

est contrôlé par Sun Microsystems ; offre un bytecode portable ; n’offre qu’une interface objet .NET :

est contrôlé par Microsoft ; offre un bytecode portable ;

permet d’accéder aux données des autres objets directement.

(33)

Émulation et VM

Certaines machines virtuelles émulent de vraies architecture :

émulateur 68LC040 d’Apple pour ses systèmes à base de PowerPC émulateur DragonBall de Palm Inc pour ses assistants personnels à base d’ARM

émulateur PlayStation pour Unix

Samuel Tardieu (ENST) Machines virtuelles 40 / 40

Références

Documents relatifs

Prérequis : Néant Évaluation : Contrôle continu et examen final Mentions concernées : L3 Mathématiques et Informatique Horaires hebdomadaires : 3 h

Figure 6: Effect of the SC number on the hydrogen consumption in FC_DLC mode Figure 7: Effect of number of SCs on the hydrogen consumption over one cycle Figure 8: Effect of the

Article numérisé dans le cadre du programme Numérisation de documents anciens

• Partage d’une machine physique entre plusieurs machines virtuelles. • Gestionnaire de machines virtuelles

peut être suffisamment rapide par rapport à code compilé car le code de l'interpreteur réside dans le cache L1 d'instructions du processeur. note: Il n'y a pas de d'instruction

● On vérifie que le type de l'expression de return est bien compatible avec le type de retour de

Lors du premier appel à invokedynamic, la VM appel la méthode de bootstrap qui doit créer un object CallSite qui contiendra un pointer de. fonction vers la fonction qui sera

Contrairement au Xen qui stocke les données de la machine virtuelle sur l'espace de stockage local de la machine hôte, notre cluster Proxmox stocke quant à lui, l'ensemble des