Licence ST mention math´
ematiques-informatique
Informatique / MIP
Architecture des ordinateurs
Projet : une JVM cˆabl´ee (Partie I)
Universit´e de Provence
Ann´ee 2008-2009
1 Pr´esentation
Il existe deux fa¸cons d’ex´ecuter un programme ´ecrit dans un langage de haut niveau :
– traduire le programme de haut niveau dans un programme en langage machine, que le
processeur sait ex´ecuter directement ; on parle alors de compilation (gcc est un compilateur
pour le langage C).
– un programme ex´ecute le programme de haut niveau en traduisant `a la vol´ee ce dernier dans
un langage de bas niveau et en ex´ecutant cette traduction ; on parle alors d’interpr´etation
(php est une langage interpr´et´e).
Java a adopt´e une solution mixte : un programme Java est compil´e `a l’aide de la commande
javac vers un fichier de ”bas niveau” ind´ependant de toute architecture mat´eriel, un fichier .class.
Ce fichier .class est ensuite interpr´et´e en utilisant la commande java. Cet interpr´eteur java est
bas´e sur une mod`ele appel´e machine virtuelle java (Java Virtual Machine - JVM). Cette JVM est
bien sˆur logiciel.
L’objectif de ce projet est de faire une r´ealisation ”cˆabl´ee” de cette JVM. Cependant, pour que
cela reste r´ealiste, nous n’allons consid´erer qu’un fragment de Java et qu’une version simplifi´ee des
des fichiers .class.
1.1 Fichiers .class, bytecode java et JVM
Fichiers .class Les fichiers .class sont des fichiers binaires qui contiennent une version com-
pil´e des fichiers .java. Le langage ”machine” utilis´e dans les fichiers .class est ce qui est com-
mun´ement appel´e le bytecode java. Ce bytecode est le ”langage machine” de la JVM mais c’est
un ”langage machine” orient´e objet.
La structure des fichiers .class est quelque peu complexe et ne nous int´eressera pas, nous
n’allons donc pas la d´ecrire. Cependant, il est int´eressant de voir ce qu’est ce fichier dans une
forme plus lisible pour un ˆetre humain. De mˆeme qu’un programme assembleur est une forme
lisible d’un programme en langage machine, on peut obtenir une version ”lisible” d’un fichier
.class en utilisant sur ce fichier .class la commande javap -c. On peut voir `a la figure 1 un
programme Java `a gauche et `a droite le contenu du fichier .class correspondant (en version
”lisible”).
Bytecode java Nous d´etaillerons plus tard ce qu’est le programme de droite et chacune de ses
instructions (disons simplement que iadd sert `a faire une addition de deux entiers).
Une instruction de la machine virtuelle Java consiste en un opcode sur 1 byte (1 octet) sp´ecifiant
l’op´eration `a effectuer, suivie par z´ero ou plusieurs op´erandes servant d’arguments ou de donn´ees
qui seront utilis´es par l’op´eration. Plusieurs instructions n’ont pas d’op´erande et consiste donc
simplement en un opcode.
Concernant les types manipul´es par les programmes bytecode, ils correspondent essentiellement
au types manipul´es par Java, `a savoir les objets, les tableaux et les types primitifs ; ces types
primitifs sont notamment byte (8 octets), short (16 octets) , int (32 octets), long (64 octets)
pour les entiers ainsi que float (32 octets), double (64 octets) pour les flottants.
Afin de simplifier le probl`eme, nous n’allons consid´erer que le type primitif byte et donc toutes
nos donn´ees seront des entiers cod´ees sur 8 bits en compl´ement `a 2.
JVM La JVM (qui se lance par la commande java) est le programme qui charge (en m´emoire)
et qui ex´ecute le programme contenu dans un fichier .class. L’´el´ement le plus important de la