Initiation à Java
aka Java RuleZ

Edito
J'ai écris ce document pour plusieurs raisons : Pour le faire avant HZV, parce que l'on me l'avait demandé et surtout parce que j'avais envie de la faire. Evidemment il vient avec un autre article de cet opus sur les Applet Java (merci ki ?).
Prérequis : Pour comprendre ce qui vas suivre il est nécessaire d'avoir acquis la 'logique' de programmation. Je veux dire par là que je n'analyserais pas les structures conditionnelles, les boucles, etc.
Ce document peut vous être utile même si vous ne comptez pas programmer en Java car nous étudierons le modèle 'objet' (programmation objet). Toutefois si vous savez programmer en C++ alors ces concepts ne vous poserons aucune difficulté.

Historique de Java
L'ancêtre de Java est un langage appelé Oak, crée par Joy Gosling, programmeur chez Sun, durant l'année 90. Les caractéristiques de Java sont déjà bien définies : le but est de faire un langage qui puisse marcher sur toutes les plateformes ainsi que sur les 'systèmes embarqués' (Télévision, Electro-Ménager, Téléphonie...). Le projet est finalement abandonné en 92.
En 1996 le projet est relancé sous le nom de Java et avec pour logo une tasse de café. De nouveaux objectifs sont ajoutés : Java doit être orienté Web et secure (un point que l'on verra en détail plus tard).

Présentation de Java
Java est un langage très spécial dans sa façon de fonctionner. En effet comment Sun s'est t'il prit pour faire un langage qui puisse être aussi portable (la portabilité est le fait de fonctionner sous différentes plateformes) ? Un fichier exécutable Windows (.exe) ne peut par exemple pas fonctionner sous Linux qui n'accepte que le format ELF.
La solution n'est donc pas de faire du code exécutable. On pourrait donc faire en sorte que le code source compile sous toutes les plates formes (contrairement aux programmes win32 par exemple)... mais là ça n'a rien d'un exploit car énormément de programmes en sont capables.
Une solution est de faire un langage interprété comme le perl, le batch, le bash, le Tcl...
La solution adoptée par Sun est un hybride des langages compilés et des langages interprétés. En effet le compilateur Java ne génére pas du code natif (MZ pour Windows, ELF pour Linux...) mais ce que l'on appelle du 'bytecode' ou 'pseudo-code' en Français. Ce bytecode prend la forme d'un fichier avec l'extension .class.
Pour exécuter ce bytecode il faut ensuite un programme qui puisse l'interpréter : c'est le rôle de la JVM, la Java Virtual Machine (Machine Virtuelle Java).
L'avantage de cette méthode hybride ? Honnêtement je me suis cassé la tête pour vous trouver un avantage... C'est vrai que donner les sources reviendrait au même puisque dans tous les cas le code est interprété... J'ai cherché des avantages du fait qu'avec Java il n'y a pas d'édition de lien (avec les librairies comme en C)... Mais est-ce qu'il y a des éditions de liens dans les langages interprétés ? Me semble pas ! Alors désolé mais j'ai pas trouvé pourquoi ils compilent du code source si c'est pour en faire un programme interprétable.

Les caractèristiques de Java sont la simplicité (on y reviendra), la surêté, la portabilité. Java est aussi orienté objet, distribué (réseaux), interprété, multithread et surtout incroyablement riche en librairies.

Comment ça marche
Pour programmer en Java vous avez besoin du JDK : le Java Developper's Kit. Ce kit de dévellopement contient deux programmes principaux.
Le premier est javac, le compilateur java.
Pour compiler une source en java il faut tapper :
javac mon_programme.java
Ceci génére un fichier mon_programme.class qui est du bytecode (ne l'oubliez pas).
Le second programme est java, il s'agit de l'interpréteur qui va faire appel à la machine virtuelle Java pour exécuter le programme que vous avez créé. Pour lancer son programme il faut taper :
java mon_programme
Remarquez que l'on ne met pas l'extension du fichier.

Java et la sécurité
Je suppose que le titre en a fait rire certain car ils savent à quel point il est facile de décompiler un fichier .class.
Pourtant Java est vraiment sécure. Mais par sécurité il faut plutôt comprendre 'robustesse, efficacité' etc.
Déjà le compilateur Java est un vrai miracle pour les programmeurs. Pour chaque erreur il affiche le numéro de ligne, la ligne, et souligne le caractère à partir duquel se situe l'erreur. Il rajoute même un commentaire pour expliquer la raison de l'erreur. Bref finis le débuggage interminable des programmes en C.
Java s'inspire beaucoup du C mais certains concepts on changés, apportant plus de sécurité à Java :
Pas de structures (struct), tout est objet en Java, on utilise des classes avec un système de droits (on verra plus tard).
Pas de pointeurs, pas de malloc(), pas de free(). Les accès en dehors de la mémoire n'existe plus.
Comment tout cela est possible ?
On a vu que le compilateur effectuait une tonne de vérification mais ce n'est pas tout : lorsque vous lancez l'interpréteur Java, la machine virtuelle java effectue de nouveau des vérifications, fait des tests de mémoire etc..
La force de Java est sa gestion de la mémoire. Chaque fois que vous déclarez un objet vous faites un new(), comme en C++. Java va alors réserver une place en mémoire pour cet objet. Mais contrairement à C++ vous n'avez pas de delete() pour détruire l'objet : Java se charge de le détruire tout seul. Ce concept se nomme le garbage collector. Dès qu'un objet est inutilisé sa mémoire est libérée. De même si un objet demande plus de mémoire que nécessaire, Java lui donne plus de mémoire. Dans tous les cas Java utilise le minimum de mémoire possible.
Vous ne compreniez pas pourquoi Java est dit sûr ? Et bien par exemple les buffers overflows sont tout bêtement impossibles.
De plus la machine virtuelle inclut un vérificateur de bytecode qui ne vérifie pas bêtement les instructions mais regarde minutieusement si le code est malveillant etc.
Pour ce qui est des droits des objets nous allons voir cela dans quelques instants. Pour les applets reportez vous à l'article dédié à ce sujet.
Petit résumé de ce que fait le vérificateur de bytecode :
Vérifie les accès mémoires : gestion de la pile, accès au dehors d'un tableau
Vérification des paramêtres, de la façon dont les fonctions s'enchainent etc.
Vérification du typage afin d'éviter les conversion de données interdites
Vérification des accès aux objets (privés, public, protégés...)
En dehors du vérificateur de bytecode on trouve le class loader. On verra plus en détail ce qu'est une classe. Pour l'instant il faut retenir que la JVM possède un module appelé class loader qui donne plus ou moins de droits à un programme Java selon qu'il vienne de votre PC ou de l'internet etc.
Bref une Applet Java ne peut pas effacer votre disque dur ou installer un cheval de Troie.

Plus de sécurité
Je ne suis pas encore un Java Guru et je ne souhaite pas aborder un sujet trop vaste et trop technique. Cependant Java est, comme tous les logiciels, faillible. Il existe queqlues virus en Java (AppletKiller.class) et il est possible de passer par dessus les règles de sécurité de Java (pas des failles techniques mais des failles de réglementation). Je vous invite si cela vous intéresse à lire les documents écrits par les Last Stage of Delirium (LSD), ceux qui ont découvert la faille RPC.

Les programmes pour Java
Pour coder en Java vous aurez besoin du JDK. La première version de JDK comportait seulement 6 packages (équivalent des librairies). Maintenant il est quasiment possible de tout faire : coder un client IRC, POP3, SMTP, HTTP, faire un fichier Excell, accéder à une base de données MySQL, Oracle ou MSSQL, Zipper un fichier ; ya des packages pour tout ça !!
Il existe des logiciels offrant toute une interface pour la programmation Java. Par exemple il y a le JBuilder de Borland ou encore le SunOne de Sun.
Personnelement je dispose de SunOne et je ne vous le recommande pas. Il est fait en Java et il faut avouer que Java est lent (du aux vérifications etc..). J'en parlerai à la fin. Mais bon, c'est le prix à payer pour ne avoir les bugs et profiter de la portabilité.
Si vous ne désirez pas programmer mais par exemple juste profiter des applets sur Internet, alors vous devez télécharger le JRE (Java Runtime Environment). Vous le trouverez un peu partout (sur le site de Sun, de Netscape... plus difficilement sur le site de Microsoft car Microsoft et Sun s'envoient régulièrement des procès).
Il est bien évidemment possible de programmer sous Unix, Linux et autres.

Le problème c'est que les ditributions donnent des versions de Java qui apparemment ne fonctionnent pas (ya un exécutable java par défaut mais je sais pas à quoi il sert). Il vous faudra alors chercher un JDK. Sous Linux le plus connu est le j2sdk : Java2 Standart Develloper's Kit (Java est dans sa version 2 pour l'instant).
L'installation est assez étrange car il ne s'agit pas d'un tar.gz mais d'un fichier bin. Si on regarde le contenu de ce fichier on comprend qu'il y a une partie script au début du fichier puis ensuite du code binaire. Ce fichier est un fichier auto extractible. Pour installer Java sous Linux faites comme suit :
Loggez vous en root
Faites un répertoire du style /usr/local/java
Mettez vous dans ce répertoire
Copiez le fichier auto extractible (.bin) dans le réprtoire
Lancez le ( ./j2sdk*.*-*.bin où les étoiles représentent la version)
Faites un ls pour savoir quel répertoire il a créé et visitez le tant que vous y êtes
Modifiez votre .bashrc ou votre .profile afin que la PATH aille chercher dans le répertoire qui contient java et javac (/usr/local/java/j2sdk*.*-*/bin je crois)
Relancez une console et tappez 'java' pour voir ce qu'il se passe
Sous Windows, si vous n'utilisez pas un logiciel avec interface, le j2sdk est en général acompagné d'une doc d'install car il faut créer des variables d'environnement : JAVA_HOME et CLASSPATH.
Sous XP pour accèder aux variables d'environnement vous faites un click droit sur le poste de travail > Propriétés > Avancé > Variables d'environnement et vous tombez sur un panneau qui ressemble à ça :

Evidemment chez vous les variables ne sont pas fixées.

Maintenant vous êtes prêts pour dévelloper votre premier programme Java