Présentation de Java

JVM

Historique

Java est à l’origine du projet  »GREEN » entrepris par des chercheurs et par un  ingénieur Bill Joy de chez Sun Microsystems.
Ce projet consiste à développer en C++ des applications destinées aux périphériques et systèmes embarqués. Or C++ a montré ses lacunes et limites :
– incompatibilités avec les différents architectures matérielles et les différents OS
– interfaces applicatives inadaptables
– problèmes d’interconnexion entre les différents appareils

Face à ces difficultés rencontrées avec C++, deux développeurs de SUN James Gosling et Patrick Naughton ont développé une nouvelle plateforme avec un nouveau langage nommé C++– (C++ sans les défauts) qui fut finalement rebaptisé Java (grossièrement voulant dire café en raison d’une grande quantité de café ingurgitée par les développeurs pendant leur travail).
Ainsi en 1991 est né le langage Java et racheté en 2009 par Oracle.

Caractéristiques de Java

– orienté objet
– distribué
– compilé et interprété
– robuste
– sécurisé
– indépendant des architectures
– portable
– performant
– multitâche
– dynamique

Simple

– 3 types primitifs : caractères, booléen, et numérique (entiers signés et des réels)
héritage simple (héritage multiple par implémentation d’un ou plusieurs interfaces)
– instructions comme break et continue pour sortir d’un ou plusieurs niveaux  d’imbrications
– Garbage collector (ramasse miettes)
+ allocation mémoire lors de la création d’objets
+ libération mémoire lorsque les objets ne sont plus référencés

Orienté objet

Mis à part des primitifs, tout est objet en Java. Mais on peut également encapsuler ces primitifs dans des objets via des classes dites « wrapper classes ».
La plateforme Java (JDK) met à disposition une librairie de classes standard permettant de manipuler toutes sortes d’objets (interface graphique, accès au réseau, gestion des entrées/sorties …)

Avantages de la POO :
+ meilleure maîtrise de la complexité (diviser pour régner)
+ un réemploi plus facile
+ facilité de correction et d’évolution

Distribué

Java est un langage distribué dans le sens où il permet de récupérer les données sur un serveur distant grâce à l’implémentation des protocoles de réseau standard et en se basant sur des architectures n-tiers client/serveur.
Java fournit 2 API permettant de créer des applications client/serveur :
– RMI (Remote Method Invocation) pour faire communiquer différents objets entre eux sur différentes machines virtuelles Java y compris différentes machines physiques.
– CORBA (Common Object request Broker Architecture), API permettant à différents langages (Java, C++, Python, COBOL, Ada, …) de communiquer sur différentes machines physiques.

Compilé & Interprété

Java est d’abord compilé puis interprété par la machine virtuelle JVM (Java Virtual Machine) ce qui le rend plus lent mais l’avantage est celui de ne pas être obligé de recompiler un programme Java d’un système à un autre et ce grâce à la JVM justement.

Robuste

Java est un langage fortement typé et stricte. Par exemple, une déclaration de variable doit être obligatoirement explicite.
Le code (syntaxe, types) est vérifié à la compilation et aussi à l’exécution ce qui réduit le risque de plantage et d’incompatibilité de versions.
De plus, la gestion des pointeurs est entièrement prise en charge et le programmeur n’a aucun moyen d’y accéder, ce qui lui évite d’écraser accidentellement des données en mémoire et de manipuler des données corrompues.

Sécurisé

Le mécanisme en charge de veiller à la sécurité des applications et des systèmes, c’est le moteur d’exécution de Java (JRE incluant la JVM).
Pour accomplir cette tâche, le JRE va se baser sur le fichier java.policy contenant des infos sur le paramétrage et la sécurité.

Voici les autres tâches du JRE :
– planification mémoire des objets
– traduction des identifiants des objets (en java, tout objet référencé possède un identifiant) en adresses mémoire
– au moment de l’exécution, chargement du bytecode contenu dans les classes Java via le processus ClassLoader
– analyse du bytecote et interdiction de manipuler les pointeurs et de violer l’accès.

Java est un langage distribué via l’implémentation des divers protocoles(FTP, HTTP, Telnet …). Pour permettre aux applications d’accéder et manipuler les données à distance via ces protocoles, il va falloir paramétrer le JRE :
– interdire tous les accès
– autoriser seulement l’accès à une machine hote qui détient le code de l’application (cas des applets par défaut)
– donner les accès aux machines sur le réseau externe(au delà du firewall), dan le cas où le code de l’application provient d’un hote distant
– autoriser tous les accès (cas par défaut pour les applications de type client lourd)

Indépendant des architectures

Le compilateur Java génère le bytecode (langage binaire intermédiaire) qui est indépendant de toute plateforme matérielle (chaque plateforme dispose d’une JVM qui leur est spécifiquement dédié), de tout OS, et de tout dispositif de gestion des interfaces (GUI).
Pour rappel, c’est la JVM qui est en charge de traduire le bytecode en code natif.

Portable

Java étant un langage interprété, il est donc portable.
Les types de données primaires ont tous la même taille quelque soit la plateforme sur laquelle le code est exécuté.
De plus, il n’y a pas besoin d’adapter le code Java selon les plateformes et ce grâce à la JVM dédiée qui interprète le bytecode.

Performant

Java est interprété, ce qui le rend plus lent certes mais il est optimisé pour avoir les mêmes performances que le C ou C++ et cela grâce au processus JIT (Just In Time) ou HotSpot qui consiste à compiler à la volée le bytecode Java en code natif.

Multitâche

Java permet de développer des applications capables d’exécuter simultanément plusieurs processus légers (multi-threads).
Par conséquent, cela permet aux applications de gagner en rapidité en partageant soit :
– le temps du CPU
– les traitements entre plusieurs processus.

Dynamique

En Java, la modification d’une ou plusieurs classes n’entraîne la mise à jour complète de l’ensemble du programme.
C’est le compilateur qui prend en charge la vérification de l’existence des classes et établit des liens entre elles si besoin. Ensuite l’appel au code de ces classes a lieu au moment de l’exécution du programme.
Ce mécanisme permet de  réduire la taille mémoire des applications.

Leave a Comment