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
|