Comment JAVA ?

eric@netline.be

Java, une saveur de café mais plus encore un langage, est né chez Sun d'un besoin de développer des applications distribuées dans des réseaux hétérogènes. Java est un langage orienté objet, distribué, interpreté, portable, multi-thread et dynamique. Il s'agit d'une version du langage C++ qu'on aurait allégé de sa complexité formelle. Java est conçu pour la programmation distribuée et est capable d'ouvrir et accéder des objets à distance via différents protocoles. Java utilise pour ses transferts une technique d'encryption basée sur le système de clé publique. Pour accentuer le caractère portable des données, Java utilise un format neutre de fichier objet capable d'être interprété puis utilisé sur un grand nombre de plates-formes et processeurs différents. La création d'applications incluant plusieurs processes ou threads est facilitée par la présence de primitives vouées à la synchronisation de ces threads.

Les opérateurs sont identiques à ceux du langage C, des librairies C pouvant aussi être ajoutées à une application Java. Il y a quelques différences mineures par rapport au langage C. Si les entiers sont de type byte sur 8 bits, int sur 32 bits ou long sur 64 bits, il n'y a pas de types unsigned. Par contre, pour jouer sur le signe, on dispose d'un opérateur >>> pour des décalages logiques vers la droite. Les nombres réels sont soit des float sur 32 bits soit des double sur 64 bits. Le type char est particulier puisqu'il supporte d'office le standard Unicode et est stocké sur 16 bits comparé aux 8 bits du C. Le type Array permet de créer des tableaux multidimensionnels pour n'importe quel type d'objet. Il n'est pas possible en Java de bidouiller comme en C en faisant de l'arithmétique de pointeurs pour se ballader dans de tels tableaux. La String est un objet et non un tableau. Elle se déclare aussi simplement que ceci

String hello = "salut à tous"

On peut aisément concaténer de telles chaînes avec un simple opérateur +. Finie la programmation spaghetti, l'infâme goto a disparu du langage Java. Par contre, Java dispose contrairement au C d'un véritable garbage collector, l'allocation et la désallocation de la mémoire est gérée automatiquement. Pas de malloc ou de free ici. Ceux qui se méfient des garbage collectors lents et poussifs comme en LISP peuvent être rassurés, le garbage collector de Java tourne dans un thread à basse priorité et n'intervient que pendant des périodes d'inactivité.

Java est décrit à travers une machine virtuelle, un modèle abstrait et logique incluant un jeu d'instructions, un jeu de registres, un stack, un heap et une espèce de segment texte baptisé ici "method area". Un interpréteur Java peut directement exécuter du code sur n'importe quelle machine où il a été porté.

Toute une série de classes prédéfinies permettent de jongler avec des objets de base aux noms évocateurs d'Url, Ftp, Http, telnet, smtp, nntp ou sockets. Bref, on dispose d'une librairie de classes World Wide Web très fournie et le développement d'applications Internet en est considérablement simplifié

Si, à côté de Objective C, Eiffel ou Dylan, Java fait autant parler de lui, c'est à cause de son intérêt crucial pour les applications Internet. Wide Web est encore jeune et ses navigateurs souffrent de lacunes. Ils ont été pensés en terme d'information statique, ne s'accomodent que de données de type texte, son ou image et se prêtent encore difficilement à la programmation dynamique. L'ambition de Sun avec son langage Java est d'insuffler une philosophie dynamique à l'information, de transférer en même temps que l'objet le module logiciel qui sera capable de le traiter, le représenter ou le visualiser. Netscape a été la première société à acquérir une licence pour java qu'on retrouve dans la version 2.0 de son célèbre navigateur Web.

Lorsqu'un navigateur traditionnel rencontre un nouveau type d'objet pour lequel il n'est pas préparé, il doit céder la main à une application extérieure ou sauver l'objet sur disque, faute d'outil de traitement adéquat. Un navigateur Java par contre peut délivrer via Internet un objet et la pièce de code nécessaire à son décodage. La même conception objet est appliquée à la gestion des protocoles de transfert de données. A côté du protocole HTTP, HotJava ou Netscape 2 peuvent accepter dynamiquement de nouvelles formes de protocoles incluant par exemple de l'encryption. Chaque concepteur d'un protocole propriétaire peut intégrer dans un navigateur Java le code nécessaire à son bon fonctionnement. Si le client Java ne connaît pas encore le nouvel objet ou le nouveau protocole, il réclame simplement au serveur les portions logicielles requises.

L'arôme Java vous allèche ? Lancez-vous à l'eau tant qu'il est gratuit. La première chose à faire est de vous rendre sur le site http://java.sun.com pour y télécharger la dernière version du JDK, le Java Developer Kit. Nous prendrons ici comme exemple la version 32 bits pour Windows qui fonctionne aussi bien sous Windows 95 que Windows NT. Comme la version beta 1.0 ne contient pas encore de navigateur HotJava, il vous faudra télécharger un navigateur Web compatible comme la version 2.0 de Netscape disponible sur http://www.netscape.com.

Décompressez le fichier exécutable dans un répertoire c:\java. Modifiez ensuite votre fichier autoexec.bat pour qu'il comporte au minimum les mentions suivantes

PATH=c:\java\bin

set INCLUDE=c:\java\include

set LIB=c:\java\lib

set CLASSPATH=.;./classes;/java/classes

Commençons par créer l'incontournable application Hello World pour vérifier si tout fonctionne. Il y en aura deux car, en Java, on distingue les "applets" qui sont des programmes écrits en langage Java qui ne fonctionnent qu'avec un navigateur compatible Java et les programmes Java qui peuvent fonctionner seuls indépendamment de tout navigateur.

Voici d'abord la version indépendante

class HelloWorld 
  {
  public static void main (String args[]) 
    {
    System.out.println("Hello World");
    }
  }

La même application sous forme d'applet devant être visualisée à partir d'un navigateur Web, il faudra d'abord créer une page HelloWorld.html faisant appel à cette application :

<html>
<head>
<title>Le retour d' "Hello World" </title>
</head>
<body>
<h1>Hello World Strikes again</h1>
<p>

Voici ce qu'affiche le programme Hello World :

<p>
<applet CODE="HelloWorld.class" WIDTH=150 HEIGHT=25>
<APP CLASS="HelloWorld">
</applet>
</body>
</html>

Puis créons un fichier HelloWorld.java contenant :

import java.awt.Graphics;
public class HelloWorld extends java.applet.Applet 
   {
   public void init() 
      {
      resize(150,25);
      }
   public void paint(Graphics g) 
     {
     g.drawString("Hello world!", 50, 25);
     }
   }

Compilons le fichier HelloWorld.java en lançant la commande

>javac HelloWorld.java

Si tout va bien, le compilateur javac crée alors un fichier HelloWorld.class dans le même répertoire. Il ne reste plus qu'à charger la page HelloWorld.html dans votre navigateur HotJava ou Netscape pour visualiser le résultat de votre premier programme.

Revenons à notre code. La première ligne du programme importe la class Graphics du répertoire java/awt. Importer une classe de la sorte la rend disponible pour le fichier dans lequel elle est importée. import est en quelque sorte l'équivalent de la commande include du langage C.

Toutes les applets sont des sous classes de browser.Applet. Les classes que vous réalisez en Java doivent faire appel au mot clé "extends" pour spécifier qu'il s'agit d'une classe dérivée d'Applet.

La méthode init() est appelée à la création d'une applet pour définir certains paramètres d'initialisation. Nous l'utilisons ici pour réserver un espace de travail via la commande resize(largeur, hauteur).

Dans g.drawString("HelloWorld",50,25), l'objet g fait appel à la méthode drawString pour s'envoyer lui-même un message et afficher "HelloWorld" à l'écran avec les coordonnées x=50, y = 25. g est déclaré comme un objet de la classe "Graphics".

Si dans un même fichier source, vous décrivez deux classes, Hello et Goodbye par exemple, il en résultera deux fichiers Hello.class et Goodbye.class totalement indépendants.

Java supporte la programmation par évènement et génère les méthodes suivantes :

public void start() {
    ...
    repaint();
  }
 
destroy() 
update(Graphics g) 
mouseUp(int x, int y) 
mouseDown(int x, int y) 
mouseDrag(int x, int y) 
mouseMove(int x, int y) 
mouseEnter() 
mouseExit() 
getFocus() 
gotFocus() 
lostFocus()
keyDown(int x) 

Si vous avez l'habitude de programmer l'API de Windows, du Mac ou de l'Amiga, vous ne devriez avoir aucune difficulté à vous familiariser avec les classes primitives de Java. Le langage est encore jeune, en perpétuelle évolution, il ne dispose pas de comité de normalisation et comme tout ce qui est relatif à World Wide Web, il progresse à une allure exponentielle. Les outils sont encore un peu instables, la doc papier est inexistante mais il existe de nombreux sites Web où vous trouverez des centaines de démos, des applets, du code source, des tutoriels. Mon préféré parmi tous est situé à http://www.gamelan.com. 60 % des programmeurs du Benelux gagnent encore leur croûte avec le Cobol ou le RPG III, une majorité d'informaticiens sortent des études sans avoir appris autre chose que du Pascal, la majorité des gens croient que le Visual Basic c'est de l'orienté-objet, vous aurez donc peut-être autant de peine à imposer Java comme langage de programmation dans votre école ou entreprise que Galilée à faire passer sa conception d'une terre ronde. Mais dans comp.lang.java, vous pouvez compter sur des milliers d'amis !