|
||
| Spécification du langage JAVA | Complément du langage JAVA | APPENDICES JAVA |
Les pages actuelles que l'on visualise sur le World Wide Web souffrent d'un défaut majeur: ces pages statiques, codées en HTML, sont incapables d'effectuer le moindre traitement local. Un browser Web reçoit un flux d'informations d'un serveur sur lequel il est connecté, mélangeant codes de présentation et données à afficher. A moins de lancer une application externe "helper" pour effectuer des tâches d'appoint, chaque action sur ces informations nécessite un aller-retour vers le serveur distant.
Le système JAVA apporte une solution à ce problème. Il permet de transformer le Web de simple instrument de publication passive en un réseau universel pleinement client-serveur. Ce système inclut un langage de programmation également appelé JAVA, un compilateur, un chargeur de byte codes, un vérificateur de byte codes, un interpréteur et un système runtime. Nous verrons plus en détail ces éléments dans la suite de ce présent rapport.
Le principe de JAVA est simple: un programme précompilé stocké sur le serveur, associé à une page HTML spécifiée, est téléchargé automatiquement sur le client lorsqu'un browser Web lit cette page, permettant ainsi au browser doté d'un interpréteur JAVA de l'exécuter. Un programme JAVA est aussi appelé Applet.
Les origines de JAVA remontent à 1990, quand un groupe de chez Sun cherchait à développer des programmes pour des appareils de type PDA (assistant numérique personnel). Las des lourdeurs de C++, le groupe a décidé d'en créer une variante allégée mais reposant entièrement sur l'approche par les objets identique à celle de Smalltalk.
JAVA a été conçu pour réaliser de petits programmes interactifs sur des microprocesseurs différents sans recompilation.
A présent, nous allons étudier plus en détail les principaux aspects de JAVA, la sécurité au sein de ce nouveau système pour conclure en effectuant une comparaison entre le langage JAVA et d'autres langages couramment utilisés.
2. Les Principaux Aspects de JAVA
2.1. Langage Orienté Objet
JAVA est un langage orienté objet. Il répond bien aux besoins des logiciels client-serveur et répartis car il permet de créer des objets sur un site, de les faire circuler à travers le réseau et de les stocker sur un autre site.
Un objet est un modèle de programmation. Toute application contient des objets: boutons, tableurs, listes, menus, etc. Ces objets ont un état et un comportement.
Dans l'implémentation d'un objet, son état est défini par ses variables d'instance. Celles-ci sont propres à l'objet. Le comportement d'un objet est défini par ses méthodes. Celles-ci manipulent les variables d'instance pour créer de nouveaux états. Les méthodes d'un objet peuvent aussi créer de nouveaux objets. Une classe est une structure qui définit les variables d'instance et les méthodes d'un objet.
En tant que langage objet, JAVA possède les quatre caractéristiques suivantes:
- Encapsulation: le contenu d'un objet nous est inconnu et on ne peut agir ou avoir des informations sur cet objet que par l'intermédiaire de certains points d'entrée.
- Polymorphisme: une méthode d'une classe peut être invoquée par toute instance de cette classe mais aussi par toute instance de ses sous-classes. Un même message envoyé à plusieurs objets sera interprété différemment suivant le comportement des objets qui le reçoivent.
- Héritage: mécanisme permettant à une nouvelle classe de posséder automatiquement les variables et les méthodes de la classe dont elle dérive.
- Liaison Dynamique: la détermination de la méthode à invoquer suite à un envoi de messages a lieu à l'exécution et non à la compilation.
Le système JAVA inclut un certain nombre de librairies contenant des classes et des méthodes d'utilisation, permettant de développer des applications sur plusieurs plates-formes.
Voici en bref ces librairies:
java.lang: cette librairie contient la collection des types de base qui sont toujours importés dans n'importe quelle unité de compilation.
java.io: cette librairie est équivalente à la Standard I/O Library qu'on trouve sur la plupart des systèmes UNIX.
java.util: cette librairie contient les classes d'utilité courante telles que Dictionary, Stack, Date ...
java.awt: il s'agit d'un ensemble d'outils fournissant un moyen de transporter facilement une application JAVA d'une fenêtre système à une autre.
2.2. Portabilité des programmes: Principe de la machine virtuelle
2.2.1. ArchitectureNeutre
JAVA a été conçu pour développer des applications qui doivent pouvoir s'exécuter n'importe où sur le réseau. Ces applications doivent donc être indépendantes des architectures matérielles, des interfaces des systèmes d'exploitation et des fenêtres systèmes sur lesquels elles sont utilisées.
Au lieu d'être traduit dans le code natif de chaque machine, un programme JAVA est précompilé dans un format intermédiaire appelé "byte codes", indépendant des architectures matérielles, qui est interprété au moment de l'exécution. Ses programmes peuvent donc être exécuter, sans modification, sur n'importe quelle machine, à condition que l'interpréteur de byte codes y soit installé.
2.2.2. Langage Interprété
Le précompilateur JAVA génère des byte codes pour la machine virtuelle JAVA. Celle-ci est une machine virtuelle strictement définie pour laquelle un interpréteur doit être disponible pour chaque architecture matérielle et pour chaque système d'exploitation sur lesquels on désire exécuter des applications écrites en JAVA.
Tout comme Visual Basic ou Perl, le modèle interprété de JAVA facilite le travail du développeur en lui supprimant le cycle "compiler-linker-tester".
La phase de liaison après compilation n'existe pas en JAVA. En fait, cette phase correspond au processus de chargement de nouvelles classes par le " Class Loader ". Ce processus est croissant et léger.
Le compilateur JAVA n'associe pas les références à des valeurs numériques. En fait, il transmet des références symboliques au vérificateur de byte codes et à l'interpréteur. Ce dernier réalise la résolution du nom final une fois, lorsque les classes ont été liées. Une fois que le nom est résolu, la référence est réécrite comme un numérique, permettant à l'interpréteur JAVA de travailler rapidement.
Finalement, le stockage des objets n'est pas déterminé par le compilateur. La disposition des objets en mémoire est différée à l'exécution et déterminée par l'interpréteur. Les classes mises à jour avec de nouvelles variables d'instance et méthodes peuvent être liées sans affecter le code existant.
Les programmeurs en JAVA peuvent utiliser les techniques de programmation orienté objet sans avoir à tout recompiler constamment. Les librairies peuvent librement ajouter de nouvelles méthodes et variables d'instance sans aucun effet sur leurs clients.
2.3. Multitâche
2.3.1 Les Tâches
Si une application a besoin d'exécuter des animations et de jouer de la musique, tout en déroulant une page et en chargeant un fichier texte à partir d'un serveur, le multitâche est la meilleure solution à adopter.
Le multitâche est une clé essentielle de JAVA. Une librairie de JAVA fournit une classe Thread qui supporte une riche collection de méthodes pour lancer, exécuter, arrêter et vérifier le statut d'une tâche.
JAVA possède une collection sophistiquée de primitives de synchronisation basée sur les moniteurs ou les variables de condition.
2.3.2. La Synchronisation
JAVA permet d'exécuter sans problème de conflit des applications concurrentes en utilisant un mécanisme de synchronisation. Des méthodes déclarées synchronized dans une même classe ne peuvent pas s'exécuter en même temps. De telles méthodes s'exécutent sous le contrôle de moniteurs pour assurer que les variables restent bien dans un état cohérent. A cet effet, dans JAVA, chaque classe et chaque objet instancié possède son propre moniteur qui peut être appelé à tout moment.
L'exemple suivant montre deux méthodes, déclarées dans une même classe, qui ne peuvent pas s'exécuter de manière concurrente:
public synchronized void stop() {
if (kicker != null) {
kicker.stop();
kicker = null;
}
}
private synchronized void startSort() {
if (kicker == null || !kicker.isAlive()) {
kicker = new Thread(this);
kicker.start();
}
}
...
Ces deux méthodes possèdent la variable kicker en commun. Elles ne peuvent pas s'exécuter en parallèle puisqu'elles sont déclarées synchronized et qu'elles sont déclarées dans la même classe. La variable kicker, grâce à cette déclaration, conserve tout au long de l'exécution un état logique. Quand une méthode synchronized est exécutée, elle acquiert un moniteur sur l'objet courant, qui empêche l'exécution de toutes les autres méthodes déclarées synchronized.
Lorsqu'on écrit des applications en JAVA, il faut prendre soin de bien implémenter les classes et les méthodes afin d'assurer le fait qu'une seule méthode à la fois puisse modifier l'état d'un objet.
Conçu pour exécuter des programmes transmis par le réseau Internet, JAVA nécessite des mécanismes de sécurité renforcés. L'interpréteur JAVA vérifie chaque programme avant de le lancer, si nécessaire avec un algorithme d'authentification à clé publique, et lui empêche d'accéder au disque local ou au réseau sans autorisation expresse.
3.1. Allocation et Représentation de la Mémoire
Une des premières lignes de défense du compilateur JAVA réside dans son allocation mémoire et dans son modèle de référence. Avant tout, les décisions de représentation de la mémoire ne sont pas prises par le compilateur JAVA comme en C et C++. En fait, la représentation de la mémoire est différée à l'exécution et sera différente selon les caractéristiques des plates-formes sur lesquelles le système JAVA s'exécute.
De plus, JAVA, contrairement au C et au C++, n'a pas de pointeurs vers des cellules de mémoire contenant les adresses d'autres cellules de mémoire. Le code JAVA compilé référencie la mémoire via des références symboliques qui sont converties lors de l'exécution par l'interpréteur JAVA en des adresses mémoires réelles. Les programmeurs en JAVA ne peuvent pas créer de pointeurs vers la mémoire car l'allocation de la mémoire et le modèle de référence sont entièrement gérés par le système runtime.
Une autre différence entre JAVA et C++ réside dans le modèle de la mémoire JAVA qui élimine les possibilités de réécriture sur la mémoire et donc de corruption des données.
3.2. Processus de Vérification des Byte codes
Le compilateur JAVA effectue un contrôle étendu et rigoureux lors de la compilation, de manière à détecter très tôt les erreurs de syntaxe. De plus les déclarations des classes et des méthodes doivent être explicites, ce qui accroît le degré de sécurité.
Le système runtime JAVA vérifie tout code importé en le soumettant à une vérification: on parle de " byte code verification ".
Des tests permettent de vérifier que le format d'un fragment de code est correct, c'est à dire qu'il respecte les règles suivantes:
- Il ne crée pas de pointeurs.
- Il ne viole pas les restrictions d'accès.
- Il accède aux objets tels qu'ils sont.
Vérificateur de Byte code
Le vérificateur de byte code parcourt les byte codes, construit l'information sur l'état du type et vérifie le type des paramètres de toutes les instructions byte cod
Ce schéma montre que quelle que soit l'origine du source, le chargeur de byte codes et le vérificateur de byte codes effectuent systématiquement un contrôle du code avant l'exécution.
Le vérificateur de byte codes agit comme un gardien: il assure que le code passé à l'interpréteur est dans un état correct pour être exécuté. Une fois que la vérification est effectuée, le code satisfait les propriétés suivantes:
- Pas de débordement ou de sous-débordement de piles.
- Le type des paramètres de toutes les instructions en byte code est connu pour être toujours correct.
- Les champs d'accès des objets sont connus pour être légaux (private, public ou protected).
Une fois que le vérificateur de byte codes a achevé son travail, l'interpréteur JAVA peut procéder de manière rapide car il n'a plus aucun contrôle à effectuer.
3.3. Sécurité au niveau du Réseau
JAVA fournit des interfaces pour manipuler les différents protocoles (FTP, HTTP, Telnet, ...). Cela constitue la ligne de défense au niveau de l'interface réseau. On peut ainsi:
- Empêcher tous les accès au réseau.
- Permettre les accès au réseau aux seuls sites d'où provient le code importé.
- Permettre les accès au réseau seulement en dehors d'une zone de protection si le code provient de l'extérieur.
- Permettre tous les accès au réseau.
4.1. Performance
JAVA a été porté sur une grande variété de plates-formes. Des programmes écrits en JAVA ont été exécutés sur des ordinateurs, tels que des stations Sun et des P.C. à haute performance, et on en tire les résultats suivants:
new Object 119 000 par seconde
new C() (une classe contenant plusieurs méthodes) 89 000 par seconde
o.f() (la méthode f invoquée sur un objet o) 590 000 par seconde
o.sf() (méthode synchronisée f invoquée sur un objet o) 61 500 par seconde.
Ainsi, on peut voir que pour créer un objet il faut environ 8,4 ms, pour créer une nouvelle classe contenant plusieurs méthodes il faut 11 ms et l'invocation d'une méthode sur un objet nécessite environ 1,7 ms.
Généralement, ces performances sont largement suffisantes pour exécuter des applications graphiques interactives. Pour accroître ces performances, les byte codes JAVA peuvent être traduits en code machine lors de l'exécution pour le processeur particulier sur lequel s'exécute l'application.
Le format byte code a été conçu dans l'esprit de générer du code machine, de telle sorte que le processus actuel de génération de code machine soit simple. Du code bon est produit: il effectue l'allocation de registre automatiquement et le compilateur réalise des optimisations lorsqu'il produit des byte codes.
4.2. Comparaison avec d'autres Langages
L'environnement du langage JAVA crée un juste milieu entre les langages de haut niveau, portables mais nécessitant beaucoup de lignes de code, et les langages de bas niveau, rapides, non portables, et peu fiables.
JAVA utilise une syntaxe très proche de celle du C++. Il a de nombreux points communs avec d'autres langages orientés objets comme Smalltalk, notamment en ce qui concerne les principes suivants:
- Arborescence des classes
- Machine virtuelle (langage précompilé et interprété)
- Pas de manipulation explicite de pointeur mais tout est pointeur
- Tout est objet
- Toute classe possède une super classe et une seule.
Le tableau suivant illustre une comparaison entre JAVA et d'autres langages couramment utilisés, résultant de notre avis personnel.
JAVA SmallTalk Perl C C++
Simple Bon Bon Moyen Moyen Mauvais
Orienté Bon Bon Bon Mauvais Moyen
Objet
Robuste Bon Bon Bon Mauvais Mauvais
Sûr Bon Moyen Bon Mauvais Mauvais
Interprété Bon Bon Bon Mauvais Mauvais
Dynamique Bon Bon Bon Mauvais Mauvais
Portable Bon Moyen Bon Moyen Moyen
Neutre Bon Moyen Bon Mauvais Mauvais
Multitâche Bon Mauvais Bon Mauvais Mauvais
Garbage Bon Bon Mauvais Mauvais Mauvais
Collection
Exception Bon Bon Mauvais Mauvais Moyen
Performance Bon Moyen Moyen Bon Bon
On remarque que JAVA, Perl et SmallTalk sont des environnements de programmation comparables, offrant le plus riche ensemble de moyens pour les développeurs d'applications.
Annexe : Où trouver de l'aide sur Internet ?
Sun Microsystems : http://java.sun.com/
Une collection de documents, de programmes, d'exemples. L'intérêt principal de ce site est sans aucun doute la documentation complète sur les API de Java. L'adresse exacte pour cette documentation est http://java.sun.com/JDK-1.0/api/packages.html.
Les applets qui se trouvent sur ce site offrent peu d'intérêts, dans le sens où ils sont classiques. Ils sont cependant une bonne base pour débuter la programmation Java. De plus, une série d'applets présente des "trucs" pour rendre un programme plus attrayant.
Le site Gamelan : http://www.gamelan.com
Il s'agit sans aucun doute du site actuel de référence en ce qui concerne les ressources d'exemples. Le site Gamelan inclue une très grande collection de liens vers des applets de toutes sortes. Un service de recherche très pratique est proposé, et permet souvent de trouver un applet ou un site parlant d'un problème particulier.
On trouve notamment dans ce site des exemples de liaisons entre programmes Java et bases de données.
Le plus souvent, les programmes proposés sont fournis avec les sources, ce qui permet d'avoir un exemple d'utilisation pour certaines classes.
The Java Boutique : http://www.javaboutique.com
Une autre collection d'applets. Elle est moins complète que celle proposée par Gamelan, mais propose tout de même un large éventail d'exemples, avec les sources. La recherche est facile et agréable, et permet de trouver rapidement un exemple sur le thème voulu.
Pause Java : http://pausejava.u-strasbg.fr
Ce site se situe en France, et offre donc l'avantage d'être très facilement accessible. Les applets qui sont présentés sont peu intéressants. Par contre, les informations qui sont contenues dans les différentes pages de ce serveur sont très attractives. Il s'agit aussi bien des dernières informations sur le langage que sur ce qui tourne autour du langage: outils de développement, versions de JDK, etc...
L'intérêt de ce serveur est aussi de proposer un lien vers des informations sur la liste Java en France (liste de Mail sur Internet). Les instructions pour s'abonner à cette liste se trouvent à l'adresse: http://www.cru.fr/listes/.
Cette liste permet de poser des questions concernant Java à tous les abonnés de cette liste. La plupart du temps, quelqu'un a la réponse à la question, et peut y répondre.
The Java Developper : http://www.digitalfocus.com/faq
Ce site est très instructif. Il est construit sur le principe des questions/réponses, et est divisé en différents thèmes : le graphisme, le multimédia, la communication, les bases de données...etc. Chacun des thèmes est divisé en questions auxquelles il est répondu.
Des liens sur Java : http://www.teamjava.com/links/
Cette page présente une grande quantité de liens vers des serveurs consacrés à Java, ou qui parlent plus ou moins de Java. L'ensemble des adresses qui sont données dans cette section se retrouvent dans cette page. L'accès à ce serveur peut cependant être trés long, et il est conseillé d'y accéder le matin.
JavaWorld de Borland : http://www.inprise.com/products/
L'intérêt principal de ce serveur est de proposer un debugger pour Java, écrit en langage Java. L'ensemble des liens présentés dans cette page sont présents sur le serveur précédent.