Java (langage) - Définition et Explications

Source: Wikipédia sous licence CC-BY-SA 3.0.
La liste des auteurs de cet article est disponible ici.

Introduction

Java
Java Logo.svg

Apparu en 23 mai 1995
Auteur Sun Microsystems
Paradigme Programmation orientée objet (La programmation par objet (du terme anglo-saxon Object-Oriented Programming ou OOP), est un...), structurée et impérative
Typage Statique (Le mot statique peut désigner ou qualifier ce qui est relatif à l'absence de mouvement. Il peut...), fort, sûr, nominatif
Influencé par Objective-C (L'Objective-C est un langage de programmation orienté objet réflexif. C'est une extension...), C++, Smalltalk, Eiffel
A influencé C#, D, J#, Ada 2005, Gambas
Implémentations Liste de JVM
Système d'exploitation Multiplateformes
Licence GNU (GNU est un projet de système d'exploitation composé exclusivement de logiciels libres.) GPL
Site Web (Un site Web est un ensemble de pages Web hyperliées entre elles et mises en ligne à une...) www.java.com

Le langage Java est un langage de programmation informatique (La programmation dans le domaine informatique est l'ensemble des activités qui permettent...) orienté objet (De manière générale, le mot objet (du latin objectum, 1361) désigne une entité définie dans...) créé par James Gosling (James Gosling (né en 1956) est un informaticien canadien. Il est surtout connu comme le concepteur...) et Patrick Naughton employés de Sun Microsystems (Sun Microsystems (NASDAQ : JAVA) est un constructeur d'ordinateurs et un éditeur de...) avec le soutien de Bill Joy (William N. Joy (né en 1954), plus connu sous le nom de Bill Joy, est co-fondateur de Sun...) (cofondateur de Sun (Sun Microsystems (NASDAQ : SUNW) est un constructeur d'ordinateurs et un éditeur de...) Microsystems en 1982), présenté officiellement le 23 mai 1995 au SunWorld.

Aperçu

Le langage Java a la particularité principale que les logiciels écrits avec ce dernier sont très facilement portables sur plusieurs systèmes d’exploitation tels que UNIX (UNIX (marque déposée officiellement comme UNIX, parfois aussi écrit comme Unix avec...), Windows (Windows est une gamme de systèmes d'exploitation produite par Microsoft, principalement destinées...), Mac OS (Mac OS (pour Macintosh Operating System) est le nom du système d'exploitation d'Apple pour ses...) ou GNU/Linux avec peu ou pas de modifications. C’est la plate-forme qui garantit la portabilité (Selon le contexte, le mot portabilité peut avoir plusieurs significations :) des applications développées en Java.

Le langage reprend en grande partie la syntaxe du langage C++, très utilisé par les informaticiens. Néanmoins, Java a été épuré des concepts les plus subtils du C++ et à la fois les plus déroutants, tels que les pointeurs et références, et l’héritage multiple remplacé par l’implémentation des interfaces. Les concepteurs ont privilégié l’approche orientée objet de sorte qu’en Java, tout (Le tout compris comme ensemble de ce qui existe est souvent interprété comme le monde ou...) est objet à l’exception des types primitifs (nombres entiers, nombres à virgule flottante, etc.)

Java permet de développer des applications client-serveur (L'architecture client/serveur désigne un mode de communication entre plusieurs ordinateurs d'un...). Côté client (Le mot client a plusieurs acceptations :), les applets sont à l’origine de la notoriété du langage. C’est surtout côté serveur que Java s’est imposé dans le milieu de l’entreprise grâce aux servlets, le pendant serveur des applets, et plus récemment les JSP (JavaServer Pages) qui peuvent se substituer à PHP (PHP (sigle de PHP: Hypertext Preprocessor), est un langage de scripts libre principalement...), ASP et ASP.NET.

Java a donné naissance à un système d'exploitation (JavaOS), à un environnement (L'environnement est tout ce qui nous entoure. C'est l'ensemble des éléments naturels et...) de développement (eclipse/JDK), des machines virtuelles (MSJVM, JRE) applicatives multi plates-formes (JVM), une bibliothèque Java (J2ME) avec interface (Une interface est une zone, réelle ou virtuelle qui sépare deux éléments. L’interface...) graphique (AWT/Swing), des applications Java (logiciels, servlet, applet). La portabilité du code Java est assurée par la machine virtuelle (Le sens originel de machine virtuelle (ou Virtual Machine (VM) en anglais) est la création de...). JRE – la machine virtuelle qui effectue la traduction et l'exécution du bytecode en code natif – supporte plusieurs processus de compilation (à la volée/bytecode, natif). La portabilité est dépendante de la qualité de portage des JVM sur chaque OS.

Aujourd'hui, Java (sous la forme de JavaFx) trouve une nouvelle niche dans la création d'applications RIA (Rich Internet (Internet est le réseau informatique mondial qui rend accessibles au public des services...) Applications), des applications qui proposent des fonctionnalités, notamment des interfaces, plus évoluées à la fois sur Internet et sur les téléphones portables. Le langage JavaFx est un langage agile dérivé de Java, sous le contrôle (Le mot contrôle peut avoir plusieurs sens. Il peut être employé comme synonyme d'examen, de...) de Sun Microsystems, qui met à profit la portabilité de Java ainsi que les vastes bibliothèques déjà disponibles dans le langage java.

Philosophie

Lors de la création du langage Java, il avait été décidé que ce langage devait répondre à 5 objectifs :

  1. simple, orienté objet et familier ;
  2. robuste et sûr ;
  3. indépendant de la machine employée pour l'exécution ;
  4. très performant ;
  5. interprété, multi-tâches et dynamique (Le mot dynamique est souvent employé désigner ou qualifier ce qui est relatif au mouvement. Il...).

Un langage orienté objet et familier

La première caractéristique, le caractère orienté objet (« OO ») et familier, fait référence à une méthode de programmation (La programmation dans le domaine informatique est l'ensemble des activités qui permettent...) et de conception du langage et le fait qu'un programme écrit en Java ressemble assez fort à un programme écrit en C++.

Bien qu’il existe plusieurs interprétations de l’expression orienté objet, une idée phare dans ce type de développement est que les différents types de données doivent être directement associés avec les différentes opérations qu’on peut effectuer sur ces données. En conséquence, les données (appelées Propriétés) et le code les manipulant (appelé Méthodes) sont combinés dans une même entité appelée Classe d'objet. Le code devient logiquement découpé en petites entités cohérentes et devient ainsi plus simple à maintenir et plus facilement réutilisable, étant intrinsèquement modulaire.

D’autres mécanismes tels l’héritage permettent d’exploiter toutes les caractéristiques d’une Classe précédemment écrite dans ses propres programmes sans même avoir à en connaître le fonctionnement interne (En France, ce nom désigne un médecin, un pharmacien ou un chirurgien-dentiste, à la...), on n’en voit que l’interface (l'interface décrit les propriétés et les méthodes sans fournir le code associé). Java interdit la notion d'héritage depuis plusieurs classes parent sauf si elles sont des interfaces.

Dans la version 1.5 du langage ont été rajoutés les génériques, un mécanisme de polymorphisme semblable (mais différent) aux templates du langage C++ ou aux foncteurs d’Objective Caml. Les génériques permettent d’exprimer d’une façon plus simple et plus sûre les propriétés d’objets comme des conteneurs (listes, arbres…) : le type liste est alors considéré génériquement par rapport au type d’objet contenu dans la liste.

Mécanisme du ramasse-miettes (Garbage Collector)

Cet élément contribue à la robustesse et à la performance des programmes, le ramasse-miettes est appelé régulièrement et automatiquement pendant l'exécution du programme. Sur les systèmes multi-processeurs et/ou multi-cœurs celui-ci emploie même des threads multiples à faible priorité afin de perturber le moins possible l'exécution de programme. En outre, le programmeur (En informatique, un développeur (ou programmeur) est un informaticien qui réalise du logiciel en...) peut au besoin (Les besoins se situent au niveau de l'interaction entre l'individu et l'environnement. Il est...) suggérer de lancer le ramasse-miettes à l’aide de la méthode System.gc().

Un grief récurrent à l’encontre de langages comme C++ est la lourde tâche d’avoir à programmer manuellement la gestion de la mémoire (D'une manière générale, la mémoire est le stockage de l'information. C'est aussi le souvenir...). En C++, la mémoire allouée par le programme pour créer un objet est désallouée lors de la destruction de celui-ci (le plus souvent par un appel explicite à l'opérateur (Le mot opérateur est employé dans les domaines :) delete). Si le programmeur oublie de coder la désallocation, ceci aboutit à une « fuite mémoire », et le programme en consomme de plus en plus. Pire encore, si par erreur un programme demande plusieurs fois une désallocation, ou emploie une zone de mémoire après avoir demandé sa désallocation, celui-ci deviendra très probablement instable et se plantera.

En Java, une grande partie de ces problèmes est évitée grâce au ramasse-miettes. L'espace mémoire nécessaire à chaque objet créé est alloué dans un tas de mémoire (en anglais : memory heap) réservé à cet usage (L’usage est l'action de se servir de quelque chose.). Le programme peut ensuite accéder à chaque objet grâce à sa référence dans le tas. Quand il n'existe plus aucune référence permettant d'atteindre un objet, le ramasse-miettes le détruit automatiquement — puisque qu'il est devenu inaccessible — libérant la mémoire et prévenant ainsi toute fuite de mémoire.

Le ramasse-miettes emploie un algorithme de marquage puis libération (en anglais : mark and sweep) qui permet de gérer les cas complexes d'objets se référençant mutuellement ou de boucles de références (cas d'une liste à chaînage double par exemple). En pratique il subsiste des cas d'erreur de programmation où le ramasse-miettes considèrera qu'un objet est encore utile alors que le programme n'y accèdera plus, mais dans l’ensemble, le ramasse-miettes rend plus simple et plus sûre la destruction d’objets en Java (en supprimant la nécessité de placer au bon endroit du code l'appel à l'opérateur delete).

Indépendance vis-à-vis de la plate-forme

L’indépendance vis-à-vis de la plate-forme, signifie que les programmes écrits en Java fonctionnent de manière parfaitement similaire sur différentes architectures matérielles. On peut effectuer le développement sur une architecture (Architectures est une série documentaire proposée par Frédéric Campain et Richard Copans,...) donnée (Dans les technologies de l'information (TI), une donnée est une description élémentaire, souvent...) et faire tourner l’application sur toutes les autres.

Ce résultat est obtenu par les compilateurs Java qui compilent le code source (Le code source (ou les sources voire le source) est un ensemble d'instructions écrites dans un...) « à moitié » afin d’obtenir un bytecode (plus précisément le bytecode Java, un langage machine (Le langage machine est la suite de bits qui est interprétée par le processeur de l'ordinateur...) spécifique à la plate-forme Java). Le code est ensuite interprété sur une machine virtuelle Java (JVM en anglais), un programme écrit spécifiquement pour la machine cible qui interprète et exécute le bytecode Java. De plus, des bibliothèques standard sont fournies pour pouvoir accéder à certains éléments de la machine hôte (le graphisme, le multithreading, la programmation réseau…) exactement de la même manière sur toutes les architectures. Notons que même s’il y a explicitement une première phase (Le mot phase peut avoir plusieurs significations, il employé dans plusieurs domaines et...) précoce de compilation, le bytecode Java est interprété ou alors converti à la volée en code natif par un compilateur (Un compilateur est un programme informatique qui traduit un langage, le langage source, en un...) juste-à-temps (Le juste-à-temps (JAT), de l'anglais just–in–time (JIT), peut désigner :) (just in time, JIT).

Il existe également des compilateurs Java qui compilent directement le Java en code objet (En informatique (développement), un fichier objet est un fichier intermédiaire...) natif pour la machine cible, comme par exemple GCJ, supprimant la phase intermédiaire du bytecode mais le code final produit par ces compilateurs ne peut alors être exécuté que sur une seule architecture (L’architecture peut se définir comme l’art de bâtir des édifices.).

La licence de Sun pour Java insiste sur le fait que toutes les implémentations doivent être compatibles. Ceci a abouti à la plainte en justice contre Microsoft (Microsoft Corporation (NASDAQ : MSFT) est une multinationale américaine de solutions...) après que Sun ait constaté que l’implémentation de Microsoft ne supportait pas les interfaces RMI et JNI et comportait des éléments spécifiques à certaines plates-formes par rapport à la plate-forme initiale de Sun. Sun obtint des dommages et intérêt (20 millions de dollars) et l’acte de justice renforça encore les termes de la licence de Sun. En réponse, Microsoft arrêta le support de Java sur ses plates-formes et, sur les versions récentes de Windows, Internet Explorer (Internet Explorer (officiellement Windows Internet Explorer depuis la version 7), parfois...) ne supporte pas les applets Java sans ajouter de plug-in. Cependant, Sun met à disposition gratuitement des environnements d’exécution de Java pour les différentes plates-formes Microsoft.

Les premières implémentations du langage utilisaient une machine virtuelle interprétée pour obtenir la portabilité. Ces implémentations produisaient des programmes qui s’exécutaient plus lentement que ceux écrits en C (Le C++ est un langage de programmation permettant la programmation sous de multiples paradigmes...) ou en C++, si bien que le langage souffrit d’une réputation de faibles performances. Des implémentations plus récentes de la machine virtuelle Java (JVM) produisent des programmes beaucoup plus rapides qu’auparavant, en utilisant différentes techniques.

La première technique est de compiler directement en code natif comme un compilateur traditionnel, supprimant complètement (Le complètement ou complètement automatique, ou encore par anglicisme complétion ou...) la phase de bytecode. On obtient ainsi de bonnes performances mais aux dépens de la portabilité. Une autre technique appelée compilation juste-à-temps (just in time, JIT) traduit le byte code en code natif durant la phase de lancement du programme. Certaines machines virtuelles plus sophistiquées utilisent une recompilation dynamique durant laquelle la machine virtuelle analyse le comportement du programme et en recompile sélectivement certaines parties. La recompilation dynamique permet d’obtenir de meilleurs résultats que la compilation statique car les compilateurs dynamiques peuvent optimiser en fonction de leur connaissance de l’environnement cible et des classes qui sont utilisées. La compilation JIT et la recompilation dynamique permettent à Java de tirer profit de la rapidité du code natif sans perdre la portabilité.

La portabilité est techniquement un objectif difficile à atteindre et le succès de Java en ce domaine est mitigé. Quoiqu’il soit effectivement possible d’écrire des programmes pour la plate-forme Java qui fonctionnent correctement sur beaucoup de machines cibles, le nombre (La notion de nombre en linguistique est traitée à l’article « Nombre...) important de plates-formes avec de petites erreurs et des incohérences a abouti à un détournement du slogan (Un slogan est une phrase facilement énoncée et retenue, qui exprime bien une idée qu'on veut...) de Sun « Write once, run anywhere » (« Écrire une fois, exécuter partout ») en « Write once, debug everywhere » (« Écrire une fois, déboguer partout ») !

L’indépendance de Java vis-à-vis de la plate-forme est cependant un succès avec les applications côté serveur comme les services web, les servlets et le Java Beans aussi bien que les systèmes embarqués sur OSGi, utilisant l’environnement Embedded Java.

Exécution sécurisée de code distant

La plate-forme Java fut l’un des premiers systèmes à offrir le support de l’exécution du code à partir de sources distantes. Une applet peut fonctionner dans le navigateur web (Un navigateur Web est un logiciel conçu pour consulter le World Wide Web. Techniquement, c'est...) d’un utilisateur, exécutant du code téléchargé d’un serveur HTTP. Le code d’une applet fonctionne dans un espace très restrictif, ce qui protège l’utilisateur des codes erronés ou mal intentionnés. Cet espace est délimité par un objet appelé gestionnaire de sécurité. Un tel objet existe aussi pour du code local, mais il est alors par défaut inactif.

Le gestionnaire de sécurité (la classe SecurityManager) permet de définir un certain nombre d’autorisations d’utilisation des ressources du système local (système de fichiers, réseau (Un réseau informatique est un ensemble d'équipements reliés entre eux pour échanger des...), propriétés système, …). Une autorisation définit

  1. un code accesseur (typiquement, une applet - éventuellement signée - envoyée depuis un serveur web) ;
  2. une ressource locale concernée (par exemple un répertoire) ;
  3. un ensemble (En théorie des ensembles, un ensemble désigne intuitivement une collection...) de droits (par exemple lire/écrire).

Les éditeurs d’applet peuvent demander un certificat pour leur permettre de signer numériquement une applet comme sûre, leur donnant ainsi potentiellement (moyennant l’autorisation adéquate) la permission de sortir de l’espace restrictif et d’accéder aux ressources du système local.

Page générée en 0.569 seconde(s) - site hébergé chez Amen
Ce site fait l'objet d'une déclaration à la CNIL sous le numéro de dossier 1037632
Ce site est édité par Techno-Science.net - A propos - Informations légales
Partenaire: HD-Numérique