«Bytecode» et machine virutelle Java (JVM)

Produire du «bytecode»

Un programme source Java

Considérons un exemple simple de définition de classe :


   --> cat Simple.java
   class Simple{
      private int x;
      private int y;
      Simple(int x, int y){
         this.x = x;
         this.y = y;
         }
      void add(int val){
         x++;
         y += val;
         }
      int getX() { return x;}    
      int getY() { return y;}
   }       

Sa compilation


Sa sompilation, afin d'obtenir du code interprétable par la machine Java, est réalisée par la commande javac .
Un fichier d'extension .class est produit :

   --> javac Simple.java
   --> ls -l Simple.class
   -rw-r--r--  1 rifflet     users    232 Sep 20 17:30 Simple.java    
   --> 


Le «bytecode» correspondant


Le fichier .class contient du code qui doit être désassemblé pour être rendu lisible. C'est ce que permet de réaliser (entre autres choses) la commande javap (nous avons ajouté quelques commentaires en rouge aux résultats) :

   --> javap -c Simple
   Compiled from Simple.java
   class Simple extends java.lang.Object {
      Simple(int,int);
      void add(int);
      int getX();
      int getY();
   }

   Method Simple(int,int)
      0 aload_0
      1 invokespecial #1 <Method java.lang.Object()>
      4 aload_0
      5 iload_1
      6 putfield #2 <Field int x>
      9 aload_0
      10 iload_2
      11 putfield #3 <Field int y>
      14 return

   Method void add(int)
      0 aload_0
      1 dup // duplique le mot au sommet de la pile
      2 getfield #2 <Field int x>
      5 iconst_1 // met 1 sur la pile
      6 iadd // calcule la somme des 2 entiers sur la pile    
             // et y met le résultat

      7 putfield #2 <Field int x>
      10 aload_0
      11 dup
      12 getfield #3 <Field int y>
      15 iload_1
      16 iadd
      17 putfield #3 <Field int y>
      20 return // libère le frame courant

   Method int getX()
      0 aload_0
      1 getfield #2 <Field int x>
      4 ireturn // met l'entier au sommet de la pile dans
            ;// le frame appelant et supprime le frame


   Method int getY()
      0 aload_0
      1 getfield #3 <Field int y>
      4 ireturn

La machine virtuelle Java (JVM)

L'organisation mémoire


Dernière mise à jour : 15 juin 2005

Valid XHTML 1.0! Valid CSS!