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