Du code source au code binaire

images/whitebelt.png

Les codes jshell que nous avions expérimentés s’exécutaient directement (langage "interprété"). Il n’en est pas de même en java où il faut passer par une phase intermédiaire: le code source (le texte du code) doit être "compilé". C’est à dire un programme particulier (le "compilateur") lit le texte du code source et génère un fichier exécutable java (si tout se passe bien!).

Compilation

Nous allons expérimenter les processus suivants:

image: le processus de compilation

Pour bien comprendre les bases nous allons opérer depuis un terminal … l’utilisation d’un outil intégré (I.D.E) est bien plus confortable mais a tendance à vous cacher le détails des procédures … Il faut avoir un minimum de conscience de qui se passe "sous le capot"!

Nous reporterons donc un petit peu plus loin l’utilisation d’un outil intégré.

Code Source

Utiliser un éditeur de texte basique (genre textedit - ou vi/vim pour les spécialistes -) et recopiez le texte suivant dans un fichier appelé Calimero.java que vous mettrez dans un répertoire de test sur votre ordinateur. (Attention: il faut éventuellement enlever des notes qui se recopient sous la forme <2>, <3> etc.)

(Attention: nous disons bien "éditeur de texte basique" car le texte sauvegardé doit être brut et ne comporter aucune indication de mise en page - par exemple générer un format ".txt" puis changer le nom du fichier en ".java" - )

Un Code source simple : Calimero.java. 

/** 1
 * Un code source simplissime
 * lancer l'exécution par la commande: <TT>java Calimero</TT>.
 * c'est un code de démonstration: il n'est pas emblématique de la programmation objet
 */
public class Calimero { 2
    public static void main(String[] args) { 3
        System.out.println("Bonjour Monde Cruel!") ; 4
        // imprime un message sur la console 5
    }
}

1

Un commentaire de documentation intégrée

2

Définition d’une classe ( le bloc de base du langage)

3

Une méthode spéciale nommée main (regroupe des instructions)

4

Une instruction (quelque chose à faire!)

5

Un commentaire

Code binaire

Depuis un terminal:

  • se rendre dans le répertoire dans lequel vous avez mis le fichier "source" Calimero.java
  • lancer la commande javac Calimero.java

La compilation du fichier source Calimero.java produit un fichier binaire nommé Calimero.class.

Lister le contenu du répertoire pour s’en assurer (sinon lisez le message d’erreur donné par le compilateur et corrigez le tir!)

Maintenant pour exécuter le code lancer depuis le terminal la commande:

java Calimero

Et le message prévu s’affichera sur le terminal!

Que contient ce fichier "binaire" Calimero.class ?

Image en hexadecimal de Calimero.class (extrait "petit boutien"). 

feca beba 0000 3200 2200 000a 0006 0914
1500 1600 0008 0a17 1800 1900 0007 071a
1b00 0001 3c06 6e69 7469 013e 0300 2928
0156 0400 6f43 6564 0001 4c0f 6e69 4e65
6d75 6562 5472 6261 656c 0001 4c12 636f
6c61 6156 6972 6261 656c 6154 6c62 0165
0400 6874 7369 0001 4c08 654e 7373 6569

Normalement on peut décompiler un fichier binaire: on affiche alors un code ("assembleur") propre au processeur qui anime votre ordinateur…. mais ici ce n’est pas le cas!

Lancer la commande de décompilation: javap -c Calimero

Décompilation de Calimero.class (extrait). 

public static void main(java.lang.String[]);
  Code:
   0:   getstatic   #2; //Field java/lang/System.out:Ljava/io/PrintStream;
   3:   ldc   #3; //String Bonjour Monde Cruel!
   5:   invokevirtual   #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   8:   return

Apparemment cet assembleur n’est pas destiné à un processeur connu! Le "processeur" qui va exécuter ce code est purement virtuel! Il est émulé par un code particulier (java) qui exécute le code binaire. On parle alors de "machine virtuelle".

Nous reviendrons ultérieurement sur le fonctionnement de cette machine virtuelle.

En attendant revenons sur quelques point pour éclairer les caractéristiques de la technologie Java.

Un exemple d’une petite application java: les Applets

[Note]

Les "Applets" (petites applications dans une page Web) sont un dispositif historique de Java: elles sont appelées à disparaître car remplacées par d’autre types de codes hébergés au sein d’une page.

Nous les présentons ici pour introduire la technologie Java.

Un exemple sur le Web

Voici un code java qui s’exécute dans un navigateur (demo/applets/SortDemo/example1.html : disponible uniquement dans le répertoire "demo" des anciennes installations)

image: un schema de l’architecture d’ensemble

Cette image présente une "Applet" c’est à dire un code java référencé à l’intérieur d’une page HTML.

Ici l’image représente trois séries de nombres pris au hasard: on va les trier en déclenchant trois algorithmes différents. Si on clique sur les images les tris commencent et on peut visualiser les différences de performances.

Ce qui est intéressant ici (à part le fait d’attirer l’attention sur le choix d’un bon algorithme quand on code) est que les trois tris s'éxécutent en parallèle.

Principes Architecturaux

Il y a longtemps de cela il y avait un navigateur écrit en Java ("HotJava")

Lorsque ce navigateur téléchargeait une Applet voici ce qui se passait:

image: un schema de l’architecture d’ensemble

A partir de cet exemple on doit pouvoir remarquer quelques unes des propriétés les plus importantes d’une architecture basée sur Java: