Home Map Index Search News Archives Links About LF
[Top Bar]
[Bottom
Bar]
[Photo of the
Author]
Jose M. Fernández

Ecrivez à l'auteur


Table des matières: 
Introduction 
Origine 
Obtention et installation de JAVA  
Environment de développement 
Caractéristiques  
Premier programme en  JAVA  
Résumé

Java. 1ère Partie 

[Ilustration] 

Résumé: Voici le premier article d'une série sur la programmation Java. Cette première partie décrira Java en tant que langage, ces caractéristiques générales, et l'emplacement des sources d'information les plus intéressantes. 


Introduction

Cet article est le premier d'une série décrivant le langage de programmation Java et son environnement de développement. Comme premier objectif, j'essaierai d'éviter les sujets concernant l'histoire du langage, les micro-ondes, et les machines à laver (si quelqu'un est vraiment intéressé par ces sujets, de nombreuses publications les traitent, même dans la bibliothèque rose). Je resterai aussi éloigné de Duc (Duke, la mascotte de Java), un petit gars avec un gros nez, et un corps triangulaire, qui agite sa main au rythme d'un maracas, et me rappelle ces vieux films de science fiction américains. 

Il y a un peu de snobisme dans ce phénomène Java. Tous les magazines sur l'informatique écrivent à propos de Java, de nombreuses sociétés vendent des outils pour développer des applettes,  et peu de sites n'ont pas une ou deux applettes Java à montrer. 

A travers cette série, j'essaierai autant que possible de décrire et d'approfondir ce langage de programmation, qui est simple pour les tâches de base, mais en même temps devient très complexe pour les projets importants. Il est aussi difficile à maîtriser à cause de sa constante évolution. 

L'objectif de cette première série d'articles est de fournir une description générale du langage, afin de pouvoir dans la suite  approfondir certains sujets comme les applettes, les projets orientés réseaux, JDBC, les beans, etc. 

Je voudrais insister sur le caractère général du langage Java; il n'est pas utilisé exclusivement pour écrire des applettes pour les pages Web, bien que cette application l'ait rendu populaire. Nous ne pouvons pas nous limiter à cet aspect, car il en existe de nombreux autres qui peuvent être plus intéressants que les applettes Java. 

Ce premier article est plus descriptif que pratique. D'abord, nous explorerons les caractéristiques fondamentales du langage, et l'environnement de développement. Ensuite, nous verrons un premier exemple de programmation Java. 

Origine

Java a été conçu par  James Gosling, Patrick Naughton, Chis Warth, Ed Frank et Mike Sherindan chez Sun Microsystems Inc. en 1991, lors de ses 18 premiers mois d'existence. Entre 1992 et 1995 Bill Joy, Arthur Van Hoff, Jonathan Payne, Frank Yellia, Tim Lindolm ont collaboré pour amener le prototype initial à maturité. 

>Ces dates montrent que Java a précédé ou au moins est simultané au WWW -- Tim Berners Lee n'a pas développé le langage HTML avant 1991. 

La syntaxe de Java est très similaire à celle de C, et ses caractéristiques orientées objet sont aussi très similaires à celles de C++. Java est un langage de programmation très cohérent et logiquement uniforme. 

Les similarités avec C et C++ peuvent donner l'impression que Java est une version de C++ pour Internet, mais il y a des différences théoriques et pratiques. En particulier, Java améliore et rafine le comportement objet par rapport à C++. 

Internet a lancé Java et en a fait un langage universellement connu, et simultanément Java a eu un effet notable sur Internet, puisqu'il a élargi le champ des objets librement transportables dans le cyberespace (programmes dynamiques s'exécutant automatiquement). 

Obtention et installation de Java 

Il y a  plusieurs outils indispensables pour la programmation Java. Je ferai toujours référence à l'environnement GNU/ LINUX (au cas où quelqu'un serait perdu): 
  • L'implantation ELF actuelle pour Linux implique une version 1.2.13 ou supérieure du noyau. 
  • J'utiliserai l'environnement JDK (Java Development Kit), Netscape version 2.0.14 ou plus récent, et un éditeur de texte comme Xemacs. Nous travaillerons toujours sous environnement Xwindows. Bien que ça ne soit pas toujours nécessaire, c'est indispensable si l'application a une interface graphique ou si vous développez une applette.

    La distribution JDK peut être obtenue au site Web:  http://www.blackdown.org/java-linux.html 

    De ce site, il est possible de sélectionner un site mirroir pour télécharger les fichiers plus rapidement. Il y a quelques mois, la dernière version était JDK-1.1.3 (j'utiliserai cette version), mais à ma dernière visite j'ai vu que la version 1.1.9 étatit déjà prête. Remarquez qu'un téléchargement complet implique 24 Mo! Néanmoins, le stric nécessaire comporte environ 12 Mo (patiente!). 

    Après décompression de l'archive avec gunzip, le travail peut commencer. 

    La distribution est normalement installée dans le répertoire /usr/local, avec la création d'un sous répertoire JDK1.1.3, et dans celui-ci: 

    /doc Documentation officielle au format HTML 

    /demo Demonstration de programmes Java 

    /lib Bibliothèques 

    /bin Ici se trouvent réellement les outils du JDK. 

    Le répertoire /lib comporte le fichier "classes.zip" (ne le décompressez pas), qui renferme toutes les classes (compilées) utilisées par le JDK. 

    A l'intérieur du répertoire de base, se trouve le fichier "src.zip", qui contient le source des classes de "classes.zip". Elles ne peuvent être compilées, et sont seulement fournies à titre de dcumentation. 

    Environnement de développement

    Comme indiqué précédemment, les outils de développement se trouvent dans le répertoire bin: 
  • javac : compilateur java, transforme le source en bytecode. 
  • java : interprêteur java, exécute le bytecode java. 

    jre : environnement d'exécution de Java. 

    appletviewer: pour tester and lancer des applets. 

    jdb: debogueur. 

    javap: désassemble le bytecode des classes compilées. 

    javadoc : générateur de documentation, produit un ensemble de pages HTML décrivant les classes publiques et protégées, les interfaces, les constructeurs, les méthodes et les champs. Il produit aussi une description de la hiérarchie des classes, et un index de tous les membres. 

    javah : outil pour ajouter des méthodes en C aux programmes Java. 

    jar: archive plusieurs classes Java vers un fichier d'archive Jar. 

    javakey : outil pour maintenir des signatures numériques. 

    updateAWT : met à jour les méthodes AWT1.02 de l'application.

    Pouir travailler sans problème avec la structure de répertoires actuelle, je conseille d'ajouter /usr/local/JDK1.1.3/bin à votre chemin (variable d'environnement PATH). Si vous souhaitez rendre l'environnement de développement disponible à tous, modifiez la variable PATH dans le fichier /etc/profile. 

    Caractéristiques 

    Avant de poursuivre, posons-nous la question: qu'est-ce que Java? On peut répondre, comme dans le manuel JDK, que Java est deux choses, un langage de programmation et une plateforme d'exécution. 

    Comme langage de programmation, Java est un langage évolué disposant des caractéristiques principales suivantes (nous les examinerons en détail plus avant):. 

    • simple,
    • orienté objet,
    • distribué,
    • interprêté,
    • robuste,
    • securisé,
    • neutre vis à vis de l'architecture du système,
    • portable,
    • à unité d'exécution multiples,
    • dynamique.
    La première caractéristique qui attire l'attention est que Java est interprêté. Bien que Java nécessite une première étape de compilation pour produire un objet en bytecode, qui est déjà du code bas niveau, il doit être interprêté sur chaque plate-forme. 

    Grâce au Bytecode Java, on peut "écrire une fois et exécuter toujours". On peut compiler un programme Java sur une plate-forme, puis l'exécuter sur une autre d'architecture totalement différente, pour peu qu'elle dispose d'une Machine Virtuelle Java (JVM). Par exemple, un programme Java peut être compilé sur une plate-forme Windows NT et tourner sans problème (au moins en théorie) sur un Solaris Sun Ultra. 

    En règle générale, une plate-forme est un environnement matériel et logiciel sur lequel fonctionne des applications. Pour Java, une plate-forme est un environnement uniquement logiciel, toute plate-forme Java doit disposer d'une JVM, qui tourne sur une plate-forme matérielle. 

    Une plate-forme Java est constituée de deux composants: 

    • la Machine Virtuelle Java (JVM, Java Virtual Machine),
    • une Interface de Programmation d'Application (API, Application Programming Interface) 
    La machine virtuelle est un ordinateur abstrait sur lequel les programmes Java compilés peuvent s'exécuter. Elle a été conçue pour être simple et compacte, afin de pouvoir être installée sur  la majorité des systèmes. Cette simplicité a permis de la diffuser sur toutes les plate-formes existantes, fournissant ainsi une couche logicielle commune. Cela résoud de nombreux problèmes de portabilité, en particulier dans des environnements très hétérogènes (comme Internet). Comme on l'imagine, c'est une raison très probable à la progression constante de cette technologie. Néanmoins, il ne faut pas voir la machine virtuelle Java sous le seul angle d'une couche logicielle; comme son nom l'indique, elle essaie d'être un véritable ordinateur, et nous verrons petit à petit apparaître sur le marché Java des puces supportant de réelles machines Java, des cartes de crédit, des décodeurs TV, etc. 

    L'API Java est une grande collection de composants logiciels qui fournissent des utilitaires, comme une interface utilisateur graphique (GUI, Graphical User Interface). Grâce à cet ensemble, on peut utiliser Java pour de nombreuses applications au delà des applettes Web bien connues, on peut par exemple développer des serveurs Web,  proxies, et pratiquement tout ce qu'on peut imaginer en relation avec Internet. 

    On peut répartir l'API en plusieurs groupes: 

    • base: objets, matrices, nombres, entrées/ sorties, structures de données, propriétés du système, date, heure, etc.
    • applette: ensemble de fonctions et utilitaires pour écrire des applettes Java,
    • réseau: URL, TCP, UDP, sockets, adresses IP,
    • internationalisation: aide à l'écriture de code aisément adaptable à différents pays,
    • sécurité: bas et au niveau, y compris les signatures numériques, les clés de chiffrement publiques et privées, le contrôle d'accès et les certificats, 
    • composants logiciels: connus sous le nom de JavaBeans,
    • base de données: fournit un accès identique à de nombreuses bases de données relationnelles.
    Au delà de ce noyau d'API fondamentales, il existe des extensions pour la 3D, pour les communications mobiles, les animations, etc. 

    Examinons plus précisément les caractéristiques de Java: 
     
     
    Simplicité: En Java, il y a toujours un nombre réduit de façons bien définies pour réaliser une tâche. Il offre toute les fonctionnalités d'un langage puissant, sans les possibilités plus confuses et peu utilisées. Java hérite de la syntaxe de C/C++ et de nombreuses fonctionnalités objet de C++. Tout programmeur familier avec C/C++ se sentira à l'aise avec Java. Malgré ces similarités, Java élimine un certain nombre de fonctionnalités de C/C++, parmi lesquelles: 
    • l'arithmétique des pointeurs,
    • les structures de données (struct),
    • les définitions de type (typedef),
    • les macros (#define),
    • l'obligation de libérer la mémoire allouée dynamiquement (free),
    • l'héritage multiple,
    • la redéfinition les opérateurs,
    • les unions.
    Orienté objet: Java a été conçu à partir de zéro, et son approche de la programmation objet est très propre, utile et pragmatique. Le modèle objet de Java est simple et facile à utiliser. 
    Distribué: Java a été conçu avec une grande interconnectivité TCP/IP à l'esprit. En réalité, il permet aux développeurs d'accéder à l'information sur le réseau comme sur un fichier local. 
    Robuste: Java est un langage fortement typé, ce qui permet la vérification des type à la compilation. Il effectue aussi des vérifications à l'exécution. La mémoire est gérée automatiquement, car l'interprêteur implémente un destructeur (garbage collector) pour les objets qui ne sont plus utilisés. Java gère les exceptions. Dans une application corectement écrite, toutes les erreurs d'exécution peuvent être gérées par le programme. 
    Indépendant de l'architecture: L'objectif principal des développeurs de Java était "d'écrire une fois, faire fonctionner partout, n'importe quand et toujours". Le code source Java est compilé dans un code intermédiaire (le bytecode) indépendant de la machine. Le bytecode est conçu pour être exécuté sur n'importe quel système, grâce à un interprêteur adapté à chaque type particulier de système.
    Sécurité: Le besoin d'information distribuée implique un haut degré de sécurité pour les systèmes d'exploitation client. Java fournit la sécurité par différentes fonctionnalités de son environnement d'exécution: 
    • un vérificateur de bytecode,
    • la disponibilité de la mémoire à l'exécution,
    • des restrictions sur l'accès aux fichiers.
    Bien que le compilateur génère un code correct, l'interprêteur vérifie que le code n'a pas été modifié (intentionnellement ou non) depuis la compilation. D'autre part, l'interprêteur Java détermine la disponibilité de mémoire pour toutes les classes. Java peut être considéré comme une des applications les plus sûres pour n'importe quel système.
    Portabilité: A côté de la portabilité de base de Java, et afin d'être réellement indépendant du matériel, Java implémente un standard de portabilité: les entiers sont toujours des entiers, la GUI consiste en un système abstrait de fenêtres et donc est indépendante de l'architecture (UNIX, PC, Mac). 
    Interprêté: Pour atteindre un des objectifs principaux, l'indépendance de plate-forme, le compilateur Java génère un code intermédiaire (bytecode). Il peut être exécuté sur n'importe quel système avec l'interprêteur adapté. Ce choix peut nous poser des questions sur la rapidité de Java. Néanmoins, et à cause de ce souci concernant les performances,  les créateurs de Java ont essayé de maintenir le bytecode aussi simple et facile à traduire en code machine que possible, afin d'obtenir les meilleures performances possibles. 
    Multiples unités d'exécution: Il est simple d'écrire des applications Java exécutant plusieurs tâches en parallèle, d'une manière robuste.
    Dynamique: Java ne lie tous les modules formant une application qu'au moment de l'exécution. Ainsi le code est lié dynamiquement et de façon sécurisée.
    Après ce long discours (dont la majorité se retrouve dans la documentation officielle Java), on peut se demander quelle est la position de Java dans le monde GNU/ Linux. Nous avons déjà mentionné la disponibilité du JDK pour Linux, qui n'est autre qu'une implémentation commerciale (bien que distribuable gratuitement) de Sun MicroSystems. 

    Il y a des outils sous licence GPL tel le compilateur GUAVAC, qui permettent de compiler n'importe quel source Java sans problème. Il faut aussi mentionner la machine virtuelle KAFFE sous licence Berkeley. Ces deux projets sont déjà très avancés, mais ils utilisent toujours les bibliothèques de classes de Sun (distribuées gratuitement pour l'instant) pour fournir un environnement de développement complet. 

    Plusieurs autres projets récents tendent à fournir des environnements de développement rapides et viisuels. 

    Enfin, je voudrais signaler l'important mouvement sur Internet concernant les technologies Java et GNU, particulièrement le développement d'une boîte à outils Java complète, librement distribuable et indépendante de Sun. Nous pouvons déjà comprendre l'importance de Java, et quand la mode sera retombée, je suis convaincu qu'il en restera quelque chose (je parie que beaucoup restera). 

    Premier programme en JAVA

    Après avoir décrit quelques caractéristiques générales du langage, jetons un oeil à un vrai programme. Comme mentionné en introduction, je souhaite autant que possible m'éloigner des choses communes, comme le fameux programme "Hello, world"; à la place, nous allons commencer par un programme dessinant un carré de n'importe quelle dimension à l'écran (un peu compliqué mais pas trop):  Fichier Cuadro.Java 
    class Cuadro {
    public static void main (String args[]) {
            int l ,a;
            if (args.length == 2) {
                l = Integer.valueOf(args[0]).intValue();
                a = Integer.valueOf(args[1]).intValue();
             }
             else {
              l= 20;
              a= 15;
             }
              for (int i=l; i>0; i--){
                System.out.print("*");
                }
                System.out.print("\n");
                for (int i= a-2; i>0; i--){
                 System.out.print("*");
                   for(int j=l-2; j>0; j--) {
                      System.out.print(" ");
                      }
                      System.out.print("*\n");
                      }
                    for (int i=l; i>0; i--){
                    System.out.print("*");
                    }
                  System.out.print("\n");
               }
    }
    En Java, le nom donné au fichier source est très important car il définit une "unité de compilation". Le fichire peut contenir une ou plusieurs définitions de classes. Le compilateur attend un nom de la forme *.java (4 caractères), ce qui implique que certains systèmes ne le supporte pas (DOS ou Windows 3.1). 

    Dans l'exemple fourni, le nom de la classe définie coïncide avec le nom du fichier source. Ca n'est pas par hasard. En Java, tout le code doit être dans une classe; par convention, le nom de la classe est le même que le nom du fichier source correspondant. Remarquez que Java distingue la casse (majuscules/ minuscules). 

    Pour compiler l'exemple, tapez à la ligne de commande: 
    > javac Cuadro.java 

    Le compilateur Java (s'il ne rencontre pas d'erreur) génère le fichier Cuadro.class qui contient naturellement le code binaire (bytecode), et il peut être immédiatement exécuté par l'interprêteur en entrant: 
    > java Cuadro 

    Lorsque le code source est compilé, chaque classe est individuellement placée dans un fichier avec le même nom que la classe. C'est donc une bonne habitude de donner aux fichiers source le nom de la classe principale qu'ils contiennent, de sorte que le fichier source ("foo.java") coïncide avec le fichier du bytecode ("foo.class"). 

    Malgré sa simplicité, notre exemple Cuadro.java aide à comprendre les bases de Java, et en particulier de voir la structure typique d'un programme Java. 

    D'abord réalisez que cet exemple n'est pas une applette et ne peut donc pas être intégré dans un fichier HTML. Il s'agit d'un programme indépendant à exécuter par l'interprêteur Java depuis la ligne de commande. 

    La première ligne du programme est: 

    class Cuadro {
    Le premier terme est un mot réesrvé du langage, il indique la définition d'une nouvelle classe nommée ici "Cuadro" -- carré en espagnol. La définition exacte de la classe et de tous ces membres suit entre les deux crochets {}. Notez qu'avec Java, toute l'activité d'un programme réside dans une classe. 

    Ligne suivante: 

    public static void main (String args[]) {
    Elle définit une méthode appelée  main(). Toutes les applications Java doivent implémenter une méthode main() (similaire à C/C++). Laissez-moi maintenant commenter quelques détails nécessaires à la compréhension de l'exemple (nous les reverrons plus précisémment dans d'autres articles). 

    Le mot clé public contrôle la visibilité des méthodes membres de la classe. Quand une classe est déclarée public, alors la classe peut être utilisée par du code en dehors de la classe. Le mot clé static permet d'appeler la  méthode main() sans avoir à créer une instante de la classe. Le mot clé void indique que la méthode ne renvoie pas de valeur. Les pararmètres passés à une fonction ou méthode sont indiqués entre parenthèses après le nom de la méthode; dans notre exemple, main prend comme paramètres une matrice d'instances de la classe String. 

    Evidemment, tout le code appartenant à la méthode est enfermé par les crochets. Ensuite vient la ligne: 

     int l, a ;
    nous déclarons deux variables entières. En Java, chaque variable doit être définie avant d'être utilisée. Remarquez que chaque instruction se termine par un point virgule ";". 

    Le reste du code est un petit algorithme qui: 

    • Test si le bon nombre d'arguments a été fourni
    If (args.length==2)
    • Si des paramètres sont fournis, on les transforme en entiers, et on les stocke dans les variables:
      l = Integer.valueOf(args[0]).intValue();
      a = Integer.valueOf(args[1]).intValue();
    • Sinon les variables prennent des valeurs par défaut:
      l = 20;
      a = 15;
    • Le reste du programme n'est rien d'autres que les instructions pour dessiner le carré à l'écran:
    • System.out.print()
      print() affiche la chaîne de caractères passée en argument. System est une classe prédéfinie qui donne accès au système, et out représente le flux de sortie connecté à la console. Ensuite, 
      for (int i=l; i>0; i--)
      Comme attendu, l'instruction for se comporte comme en C/C++ ou d'autres langages.
    Un bon exercice pour le lecteur, consiste à compiler puis exécuter ce petit programme, mais aussi de tester sa portabilité en exécutant l'objet Cuadro.class sur différentes plates-formes: Linux, Windows 95 (ne prenez pas ça pour un cadeau!) et vérifier qu'il s'exécute à l'identique. 

    Résumé

    Nous avons décrit les fonctionnalités générales de Java en tant que langage de programmation. Nous venons juste de commencer à programmer, et il reste un long chemin à parcourir. Les articles futurs donneront une description plus approfondie du langage. Le prochain article en particulier décrira les définitions et les types des variables, les instructions de base, les classes, en bref les spécifications principales du langage. 

    Dans chaque article, je donnerai les références, publications et URL sur lesquelles je me suis basé pour cette série d'articles: 

    • JAVA Reference Manual. Patrick Naughton Herbert Schildt. McGraw-Hill. 
    • Programming with JAVA. Tim Ritchey. Prentice Hall. 
    • Tutorial de Java . Manuel en espagnol au format HTML disponible à www.fie.us.es/info/internet/J AVA. Agustín Froufe. 
    • The Java Tutorial. Mauel en anglais disponible au format HTML à www.javasoft.com. Sun. 
    • Guide de la distribution JDK. 
    Traduit par Jean-Denis Girard 
    Ce site web est maintenu par Miguel Angel Sepulveda 
    © Jose M. Fernandez 1998 
    LinuxFocus 1998