Java 5

Java 5

Java (langage)

Page d'aide sur l'homonymie Pour les articles homonymes, voir Java.
Page d'aide sur l'homonymie Ne doit pas être confondu avec JavaScript.
Java Logo.svg

Apparu en 23 mai 1995
Auteur Sun Microsystems
Paradigme Programmation orientée objet, structurée et impérative
Typage Statique, fort, sûr, nominatif
Influencé par Objective-C, C++, Smalltalk, Eiffel[1]
A influencé C#, D, J#, Ada 2005, Gambas
Implémentations Liste de JVM
Système d'exploitation Multiplateformes
Licence GNU GPL
Site Web www.java.com

Le langage Java est un langage de programmation informatique orienté objet créé par James Gosling et Patrick Naughton employés de Sun Microsystems avec le soutien de Bill Joy (cofondateur de Sun Microsystems en 1982), présenté officiellement le 23 mai 1995 au SunWorld.

Sommaire

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 dexploitation tels que UNIX, Microsoft Windows, Mac OS ou GNU/Linux avec peu ou pas de modifications. Cest la plate-forme qui garantit la portabilité 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 lhéritage multiple remplacé par limplémentation des interfaces. Les concepteurs ont privilégié lapproche orientée objet de sorte quen Java, tout est objet à lexception des types primitifs (nombres entiers, nombres à virgule flottante, etc.)

Java permet de développer des applications client-serveur. Côté client, les applets sont à lorigine de la notoriété du langage. Cest surtout côté serveur que Java sest imposé dans le milieu de lentreprise grâce aux servlets, le pendant serveur des applets, et plus récemment les JSP (JavaServer Pages) qui peuvent se substituer à PHP, ASP et ASP.NET.

Java a donné naissance à un système d'exploitation (JavaOS), à un environnement de développement (eclipse/JDK), des machines virtuelles (MSJVM, JRE) applicatives multi plates-formes (JVM), une bibliothèque Java (J2ME) avec interface graphique (AWT/Swing), des applications Java (logiciels, servlet, applet). La portabilité du code Java est assurée par la machine virtuelle. 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.

Historique

Cet historique provient dune traduction libre dun article du wikipedia anglophone Java programming language.
Nhésitez pas à vérifier la qualité de la traduction pour être certain quil ny ait pas de contresens.

L'origine du langage

Duke, la mascotte de Java

La plate-forme et le langage Java sont issus dun projet de Sun Microsystems datant de 1990. Lingénieur Patrick Naughton nétait pas satisfait par le langage C++ utilisé chez Sun, ses interfaces de programmation en langage C, ainsi que les outils associés. Alors quil envisageait une migration vers NeXT, on lui proposa de travailler sur une nouvelle technologie et cest ainsi que le Projet Stealth (furtif) vit le jour.

Le Projet Stealth fut rapidement rebaptisé Green Project avec larrivée de James Gosling et de Mike Sheridan. Ensemble, et aidés dautres ingénieurs, ils commencèrent à travailler dans un bureau de la rue Sand Hill de Menlo Park en Californie. Ils essayèrent délaborer une technologie pour le développement dapplications dune nouvelle génération, offrant à Sun la perspective dopportunités uniques.

Léquipe envisageait initialement dutiliser le langage C++, mais labandonna pour différentes raisons. Tout dabord, ils développaient sur un système embarqué avec des ressources limitées, estimaient que lutilisation du C++ demandait un investissement trop important et que cette complexité était une source derreur pour les développeurs. Les lacunes de ce langage au niveau du ramasse-miettes impliquaient que la gestion de la mémoire devait être programmée manuellement, un défi mais aussi une source derreur. Léquipe était aussi troublée par les lacunes du langage au niveau de la sécurité, de la programmation distribuée, du multi-threading. De plus, ils voulaient une plate-forme qui puisse être portée sur tout type dappareils.

Bill Joy avait envisagé un nouveau langage combinant le meilleur du langage de programmation Mesa et du langage C. Dans un article appelé Plus loin (Further), il proposa à Sun que ses ingénieurs développent un environnement orienté objet basé sur le langage C++. À lorigine, Gosling envisageait de modifier et daméliorer le langage C++, quil appelait C++ ++ --, mais lidée fut bientôt abandonnée au profit du développement dun nouveau langage de programmation quils appelèrent Oak (chêne) en référence, on pense, à un arbre planté juste devant la fenêtre de leur bureau.

Léquipe travailla avec acharnement et, à lété 1992, ils furent capables de faire une démonstration incluant le système dexploitation Green, le langage Oak (1992), les bibliothèques et le matériel. Leur première réalisation, présentée le 3 septembre 1992, fut la construction dun PDA appelé Star7 ayant une interface graphique et un agent intelligent appelé Duke pour prêter assistance à lutilisateur. En novembre de la même année, le Green Project fut abandonné pour devenir FirstPerson, Inc, appartenant en totalité à Sun Microsystems et léquipe fut relocalisée à Palo Alto. Léquipe FirstPerson était intéressée par la construction doutils hautement interactifs et quand Time Warner publia un appel doffres en faveur dun décodeur multifonction, FirstPerson changea dobjectif pour proposer une telle plate-forme. Cependant, lindustrie de la télé par câble trouva quelle offrait trop de possibilités à lutilisateur et FirstPerson perdit le marché au profit de Silicon Graphics. Incapable dintéresser lindustrie audiovisuelle, la société fut réintroduite au sein de Sun.

Java rencontre Internet

De juin à juillet 1994, après trois jours de remue-méninge avec John Gage, James Gosling, Joy, Naughton, Wayne Rosing et Eric Schmidt, léquipe recentra la plate-forme sur le web. Ils pensaient quavec lavènement du navigateur Mosaic, Internet était le lieu allait se développer le même genre doutil interactif que celui quils avaient envisagé pour lindustrie du câble. Naughton développa comme prototype un petit navigateur web, WebRunner qui deviendra par la suite HotJava.

La même année le langage fut renommé Java après quon eut découvert que le nom Oak était déjà utilisé par un fabricant de carte vidéo. Le nom Java fut inventé dans un petit bar fréquenté par quelques membres de léquipe. Il na pas été déterminé clairement si oui ou non le nom est un acronyme, bien que certains prétendent quil signifie James Gosling, Arthur Van Hoff et Andy Bechtolsheim ou tout simplement Just Another Vague Acronym (littéralement « juste un acronyme vague de plus »). . La croyance selon laquelle Java doit son nom aux produits vendus dans le bar est le fait que le code sur 4 octets (également appelé nombre magique) des fichiers de classe est en hexadécimal 0xCAFEBABE. Certaines personnes prétendent également que le nom de Java vient du fait que le programme était destiné à pouvoir tourner sur des systèmes embarqués, comme des cafetières (Java signifie café en argot américain). En octobre 1994, HotJava et la plate-forme Java furent présentés pour Sun Executives. Java 1.0a fut disponible en téléchargement en 1994 mais la première version publique du navigateur HotJava arriva le 23 mai 1995 à la conférence SunWorld. Lannonce fut effectuée par John Gage, le directeur scientifique de Sun Microsystems. Son annonce fut accompagnée de lannonce surprise de Marc Andressen, vice président de lexécutif de Netscape que Netscape allait inclure le support de Java dans ses navigateurs. Le 9 janvier 1996, le groupe Javasoft fut constitué par Sun Microsystems pour développer cette technologie[2]. Deux semaines plus tard la première version de Java était disponible.

Histoire récente

Utilisation Web

Côté client

La possibilité des navigateurs web de lancer des applets Java garantit la pérennité de lutilisation de Java par le grand public. Les concurrents récents des applets Java sont principalement Macromedia Flash et Javascript, mais bientôt Xul ou XAML concurrenceront ces technologies.

Les avantages de Java par rapport à Javascript sont essentiellement la portabilité. Plus linterface est lourde, plus il est épuisant voire impossible dadapter linterface à tous les navigateurs du marché. Les avantages de Java par rapport à Flash sont aussi valables par rapport à Javascript : Java propose un style de langage plus élégant[réfnécessaire], et extrêmement bien documenté et propose surtout un environnement de développement intégré très efficace.

Les applets sur le poste Client peuvent communiquer avec des servlets sur le Serveur, tout comme Javascript peut communiquer avec le Serveur au moyen dAJAX. Flex utilise la technologie Flash par le biais du Adobe Flash Player.

La puissance de Java est souvent utilisée pour des applications plus consistantes comme les jeux Yahoo et plus récemment les lecteurs vidéo multi plates-formes.

Côté serveur

Côté serveur, on retrouve des classes Java qui permettent de définir des objets (classes POJO) et d'autres classes qui permettent de définir des actions sur ces objets (classes métiers). On effectue ici un travail sur les données en les modélisant sous formes d'objets. Ces objets peuvent être modifiés par des méthodes issues de classes spécialement conçues pour effectuer des opérations. Ainsi on pourra trouver par exemple une classe pour définir une pomme en tant qu'objet (taille, poids, calibre) et une autre classe pour définir des opérations sur une pomme (acheter, vendre, manger). Avec les serveurs dapplications, on utilise des EJB pour encapsuler les classes définies précédemment. Ces éléments sont utilisés dans des architectures J2EE pour des applications multi-couches. L'avantage qu'on tire de ce travail est de pouvoir cacher au client l'implémentation du code côté serveur.

Utilisation sur le poste de travail

Lutilisation native du langage Java pour des applications sur un poste de travail restait jusqu'à présent relativement rare à cause de leur manque de rapidité. Cependant, avec laccroissement rapide de la puissance des ordinateurs, les améliorations au cours de la dernière décennie de la machine virtuelle Java et de la qualité des compilateurs, plusieurs technologies ont gagné du terrain comme par exemple Netbeans et lenvironnement Eclipse, les technologies de fichiers partagés Limewire et Azureus. Java est aussi utilisé dans le programme de mathématique Matlab au niveau de linterface homme machine et pour le calcul formel. Les applications Swing apparaissent également comme une alternative à la technologie .NET.

Microsoft et autres systèmes

  • Microsoft a fourni un environnement de travail de type Java, dénommé J++, avec ses systèmes dexploitation avant la sortie de Windows XP en 2001. Suite à décision de justice, et au vu du non-respect des spécifications de ce langage, Microsoft a abandonner celui-ci et créer un nouveau langage de nom C# (cf. chapitre « Indépendance vis-à-vis de la plate-forme » plus bas)
  • Beaucoup de fabricants dordinateurs continuent dinclure un environnement JRE sur leurs systèmes Windows.
  • Java apparaît également comme un standard au niveau du Mac OS X dApple aussi bien que pour les distributions Linux. De nos jours, la plupart des utilisateurs peuvent lancer des applications Java sans aucun problème.

Passage sous licence libre

Le 13 novembre 2006, Sun annonce le passage de Java, cest-à-dire le JDK (JRE et outils de développement) et les environnements Java EE (déjà sous licence CDDL) et Java ME sous licence GPL. En mai 2007, Sun publie effectivement OpenJDK sous licence libre. Cependant OpenJDK dépend encore de fragments de code non libre que Sun ne détient pas. C'est pourquoi la société Redhat lance en juin 2007 le projet IcedTea qui vise à remplacer les fragments de code non libre et ainsi rendre OpenJDK utilisable sans aucun logiciel propriétaire. En juin 2008, le projet IcedTea a passé les tests rigoureux de compatibilité Java (TCK) [3]. On peut donc dire que Java devient un logiciel libre.

Historique des versions

Le langage Java a connu plusieurs évolutions depuis le JDK 1.0 (Java Development Kit) avec lajout de nombreuses classes et packages à la bibliothèque standard. Depuis le J2SE1.4, lévolution de Java est dirigée par le JCP (Java Community Process) qui utilise les JSR (Java Specifications Requests) pour proposer des ajouts et des changements sur la plate-forme Java. Le langage est spécifié par le JLS (Java Language Specification). Les modifications du JLS sont gérées sous le code JSR 901[4].

  • JDK 1.0 (23 janvier 1996 - 211 classes et interfaces) — Version initiale[5].
  • JDK 1.1 (19 février 1997 - 477 classes et interfaces) — De nombreux ajouts[6] avec notamment :
    • une refonte complète du modèle événementiel AWT.
    • Les classes internes sont ajoutées au langage.
    • JavaBeans.
    • JDBC.
    • Java Remote Invocation (RMI).
  • J2SE 1.2 (9 décembre 1998 - 1 524 classes et interfaces) — Nom de code Playground. Cette version et les suivantes jusque J2SE 5.0 sont rebaptisées Java 2 et la version nommée J2SE (Java 2 Platform, Standard Edition) remplace JDK pour distinguer la plate-forme de base de la version J2EE (Java 2 Platform, Enterprise Edition) et de la version J2ME (Java 2 Platform, Micro Edition). Plusieurs ajouts [7] dont :
    • le mot-clé strictfp
    • la réflection
    • lAPI graphique Swing est intégrée.
    • Pour la première fois, la machine virtuelle Java de Sun inclut un compilateur « Juste à temps » (Just in Time).
    • Java Plug-in
    • Java IDL, une implémentation de IDL pour linteropérabilité avec CORBA.
    • le framework Collections.
  • J2SE 1.3 (8 mai 2000 - 1 840 classes et interfaces) — Nom de code Kestrel. Changements principaux[8] :
    • HotSpot JVM inclus (La machine virtuelle HotSpot sortit en avril 1999 pour la machine virtuelle du J2SE 1.2)
    • Changement pour les RMI pour être basé sur CORBA.
    • JavaSound
    • JNDI (Java Naming and Directory Interface) inclus de base (disponible auparavant comme extension)
    • JPDA (Java Platform Debugger Architecture)
  • J2SE 1.4 (6 février 2002 - 2 723 classes et interfaces) — Nom de code Merlin. Ce fut la première révision de la plate-forme sous JCP (Java Community Process)[9]. Les principaux changements[10] sont :
    • le mot-clé assert (Spécifié dans JSR 41.)
    • les expressions rationnelles modélisées en sinspirant du langage Perl.
    • Le chaînage dexception permet à une exception dencapsuler lexception de base niveau dorigine. (Spécifié dans (en) JSR 51.)
    • API de journalisation (Spécifiée dans (en) JSR 47.)
    • lAPI Image I/O pour lire et écrire des images dans des formats comme JPEG et PNG.
    • intégration dun parser XML et du moteur XSLT nommé JAXP (Spécifié dans (en) JSR 5 et (en) JSR 63.)
    • intégration des extensions de sécurité JCE (Java Cryptography Extension), JSSE et JAAS.
    • Java Web Start (introduit pour la première fois en mars 2001 pour J2SE 1.3 - Spécifié dans (en) JSR 56.)
  • J2SE 5.0 (30 septembre 2004 - 3 270 classes et interfaces) — Nom de code Tiger. (initialement numérotée 1.5, qui est toujours utilisé comme numéro de version interne[11]). Développé par (en) JSR 176, Tiger ajoute un nombre significatif de nouveautés[12] au langage :
    • Programmation générique — (Spécifié par (en) JSR 14.)
    • Metadataégalement appelées annotations, permet au langage de construire des classes et des méthodes étiquetées avec des données additionnelles qui peuvent être utilisées en tant que méta-données (Spécifiée dans (en) JSR 175.)
    • Autoboxing/unboxingconversion automatique entre des types primitifs (comme le type int) et le Wrapper de classe correspondant (comme la classe Integer) (Spécifié dans (en) JSR 201).
    • Énumérationsle mot-clé enum permet de créer une liste ordonnée de valeurs sans type. Auparavant, ceci pouvait seulement être réalisé par des entiers constants (Spécifié dans JSR 201).
    • Varargsla syntaxe Object utilisée dans une déclaration de méthode permet de spécifier un nombre variable darguments pour cette méthode. Cest un fonctionnement équivalent à la fonction « printf » en C.
    • Imports statiquesCette fonctionnalité permet dutiliser les constantes dune classe sans spécifier le nom de cette classe et sans passer par « lanti-pattern Constant Interface » (cest lexpression utilisée sur le site de Sun).
    • Extension du for pour les bouclesla syntaxe du for est étendue avec une syntaxe spéciale pour itérer sur nimporte quel objet itérable comme un tableau, ou une collection en utilisant la syntaxe :
        void displayWidgets (Iterable<Widget> widgets) {
            for (Widget w : widgets) {
                w.display();
            }
        }
cet exemple parcourt le contenu de lobjet widgets de la classe Iterable et contenant uniquement des références vers des objets de la classe Widget, assignant chacun de ces éléments à la variable w et ensuite appelle la méthode display() sur lélément w (spécifié dans JSR 201).
  • Java SE 6 (11 décembre 2006 - 3 777 classes et interfaces) — Nom de code Mustang[13]. Une version bêta est sortie le 15 février 2006, une autre bêta en juin 2006, une version « release candidate » en novembre 2006, et la version finale le 12 décembre 2006. Avec cette version, Sun remplace le nom J2SE par Java SE et supprime le .0 au numéro de version[14].
  • Java SE 7Nom de code Dolphin. Une des nouveautés majeures de cette version sera lajout des closures (en cours de spécifications). Il sagira de la première version sous la licence GPL. Sortie pressentie pour début 2010[15].

En plus des changements au niveau du langage, des changements plus importants ont eu lieu au fil des années qui ont conduit des quelques centaines de classes dans le JDK 1.0 à plus de 3 000 dans J2SE 5.0. Des API entières, comme Swing ou Java2D ont été ajoutées et beaucoup de méthodes de loriginal JDK 1.0 ont été déclarées deprecated (cest-à-dire obsolètes et pouvant être supprimées à tout moment).

Philosophie

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

  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.

Un langage orienté objet et familier

Article connexe : Programmation orientée objet.

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

Bien quil existe plusieurs interprétations de lexpression 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 quon 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.

Dautres mécanismes tels lhéritage permettent dexploiter toutes les caractéristiques dune Classe précédemment écrite dans ses propres programmes sans même avoir à en connaître le fonctionnement interne, on nen voit que linterface (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 dObjective Caml. Les génériques permettent dexprimer dune façon plus simple et plus sûre les propriétés dobjets comme des conteneurs (listes, arbres…) : le type liste est alors considéré génériquement par rapport au type dobjet 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 totalement transparent pour le développeur : il 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[17]. En outre, le programmeur peut au besoin suggérer de lancer le ramasse-miettes à laide de la méthode System.gc().

Un grief récurrent à lencontre de langages comme C++ est la lourde tâche davoir à programmer manuellement la gestion de la mémoire. 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 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. 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)[17] 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 le ramasse-miettes considèrera qu'un objet est encore utile alors que le programme n'y accèdera plus, mais dans lensemble, le ramasse-miettes rend plus simple et plus sûre la destruction dobjets 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

Articles connexes : Bytecode Java et Compilation à la volée.

Lindé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 donnée et faire tourner lapplication sur toutes les autres.

Ce résultat est obtenu par les compilateurs Java qui compilent le code source « à moitié » afin dobtenir un bytecode (plus précisément le bytecode Java, un langage machine 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 sil y a explicitement une première phase précoce de compilation, le bytecode Java est interprété ou alors converti à la volée en code natif par un compilateur juste-à-temps (just in time, JIT).

Il existe également des compilateurs Java qui compilent directement le Java en code objet 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.

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 après que Sun a constaté que limplé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 lacte 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 ne supporte pas les applets Java sans ajouter de plug-in. Cependant, Sun met à disposition gratuitement des environnements dexé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 sexécutaient plus lentement que ceux écrits en C ou en C++, si bien que le langage souffrit dune réputation de faibles performances. Des implémentations plus récentes de la machine virtuelle Java (JVM) produisent des programmes beaucoup plus rapides quauparavant, en utilisant différentes techniques.

La première technique est de compiler directement en code natif comme un compilateur traditionnel, supprimant complètement 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 dobtenir de meilleurs résultats que la compilation statique car les compilateurs dynamiques peuvent optimiser en fonction de leur connaissance de lenvironnement 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é. Quoiquil soit effectivement possible décrire des programmes pour la plate-forme Java qui fonctionnent correctement sur beaucoup de machines cibles, le nombre important de plates-formes avec de petites erreurs et des incohérences a abouti à un détournement du slogan de Sun « Write on, run anywhere » (« Écrire une fois, exécuter partout ») en « Write once, debug everywhere » (« Écrire une fois, déboguer partout ») !

Lindé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 lenvironnement Embedded Java.


Exécution sécurisée de code distant

La plate-forme Java fut lun des premiers systèmes à offrir le support de lexécution du code à partir de sources distantes. Une applet peut fonctionner dans le navigateur web dun utilisateur, exécutant du code téléchargé dun serveur HTTP. Le code dune applet fonctionne dans un espace très restrictif, ce qui protège lutilisateur 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 dautorisations dutilisation des ressources du système local (système de fichiers, réseau, 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 de droits (par exemple lire/écrire).

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

Le langage

Voici un exemple dun programme Hello world typique écrit en Java :

 class HelloWorld {
     public static void main(String[] args) {
         System.out.println("Hello world!");
     }
 }

Le fichier source porte presque toujours le nom de la classe avec l'extension ".java" (ici "HelloWorld.java", ce serait même obligatoire si la classe avait l'attribut public dans sa déclarationla rendant alors accessible à tout autre programme). On peut compiler puis exécuter cet exemple avec les commandes suivantes (sous Linux:

javac HelloWorld.java
export CLASSPATH=.
java HelloWorld

La ligne « export CLASSPATH=. » sert à indiquer à Java quil doit également chercher les programmes class dans le répertoire courant. Ce chemin peut également être spécifié au lancement du programme par loption -classpath (ou -cp en abrégé:

java -cp . HelloWorld

Mots réservés, primitifs et littéraux

abstract        else          instanceof    static          try         boolean    false
assert (1.4)    enum (5.0)    interface     strictfp        volatile    byte       true
break           extends       native        super           while       char      
case            final         new           switch                      double
catch           finally       package       synchronized                float
class           for           private       this                        int
const (*)       goto (*)      protected     throw                       long
continue        if            public        throws                      short      
default         implements    return        transient                   void       null
do              import

Notes :

  • (*) ces mots clefs sont réservés mais n'ont pas de signification pour le compilateur (il est juste interdit d'employer ce nom pour une variable par exemple) ;
  • (1.4) et (5.0) ces mots clefs ont été ajoutés avec la version indiquée du langage.

Structures de contrôle

Les collections d'objets

Il est souvent nécessaire de stocker de nombreuses données dans des collections : liste dachats, notes des élèves, etc. Les collections peuvent être consultées, modifiées, on peut les trier, les recopier, les supprimer etc. Elles peuvent avoir une taille fixe ou variable.
Collections de taille fixe :

  • Les tableaux : Pour initialiser un tableau dentiers de 10 cases on écrit : int[] tab = new int[10]; Les cases du tableau sont numérotées de 0 à 9. Plus généralement, un tableau de taille n, ses cases sont numérotées de 0 à n-1. Un des plus grands avantages des tableaux est laccés en temps constant O(1), à chaque case du tableau. Pour accéder ou modifier le iéme élément du tableau, pour 0<= i <n, on écrit tab[i]=2; pour attribuer la valeur 2 à une case du tableau. Pour connaître la taille du tableau on écrit tab.length;. Si on essaie de modifier une case qui nexiste pas, par exemple tab [10] = 4; on va obtenir le message derreur suivant : IndexOutOfBoundsException car notre tableau tab ne contient que 10 cases (numérotées de 0 à 9 inclus).

Collections de taille variable :

  • ArrayList : pour initialiser une ArrayList il faut importer la classe java.util.ArrayList ; et écrire liste = new ArrayList(); depuis jdk 1.5 on a la possibilité dindiquer le type des éléments contenus dans une ArrayList : entiers, string, etc.
  • Cette collection est vide après lappel du constructeur ;
  • On peut ajouter autant déléments que lon veut.
Pour ajouter un élément on écrit liste.add(Objet);
Pour accéder à un élément de lArrayList : list.get(index);
Pour connaître le nombre déléments que contient une liste : liste.size( );
Pour supprimer un élément : liste.remove(index); les éléments qui suivent lélément supprimés seront décalés à gauche.

Boucles

Bien quelles aient toutes un rôle similaire, chaque boucle est pourtant adaptée à une situation :

Structure tant que (adapté pour effectuer des opérations tant quune condition nest pas rencontrée:

 while (<expression booléenne>) {
 	instruction(s)
 }

Structure fairetant que (adapté pour effectuer des opérations qui demandent le même état dorigine à chaque itération:

 do {
    instruction(s)
 }
 while (<expression booléenne>);

Structure pour (adapté lorsque une collection doit être parcourue dans son entièreté pour traitement:

 for (<initialisation> ; <condition de poursuite> ; <expression dincrémentation>) {
    instruction(s)
 }

Structure pour (java 1.5:

 for(<Objet récupérant loccurrence suivante de la collection> : <collection dobjets>){
    instruction(s)
 }

Structures conditionnelles

Structure si : condition simple

 if (<expression booléenne>) {
    instruction(s)
 }

Structure sisinon : condition avec alternative unique

 if (<expression booléenne>) {
     instruction(s)
 }
 else {
     instruction(s)
 }

Structure siou siou si … : condition avec alternatives multiples

 if (<expression booléenne>) {
     instruction(s)
 }
 else if (<expression booléenne>) {
     instruction(s)
 }
 else if (<expression booléenne>) {
     instruction(s)
 }
 else {
     instruction(s)
 }

Structure atteindrecas xcas y …" : embranchement vers un bloc dinstructions énuméré

 switch (<expression de type numérique>) {
    case <constante de type numérique>:
         instruction(s)
         break;
    case <constante de type numérique>:
        instruction(s)
        break;
    [...]
    default:
         instruction(s)
         break;
 }

Remarque : vous pouvez également utiliser la structure de contrôle switch sur une énumération; par ailleurs le switch ne fonctionne pas sur toutes les constantes de type numérique mais seulement sur les entiers.

La commande break sort immédiatement la boucle en cours (for, while, do), et permet de sortir dune clause contenue dans un switch.

Une expression continue termine litération en cours et continue à la prochaine. Elle sécrit comme suit : continue

Lénoncé return termine une méthode.

Avec return uneValeur, uneValeur sera renvoyée à la méthode appelante.

Opérateur ternaire : : Instruction conditionnelle pouvant être employée comme une expression

 <expression booléenne> ? <valeur si vrai> : <valeur si faux>

Traitement des exceptions

 try {
       instruction(s)
 }
 catch (<type exception> <variable>) {
       instruction(s)
 } 
 [...]
 finally {
       instruction(s)
 }

Le bloc de code finally sera exécuté quel que soit le résultat lorsque le programme sortira du bloc try-catch.

Voici un exemple de capture dune exception :

 
 FileOutputStream fos = null; 
 
 try {
      //Chacune de ces deux instructions peut générer une exception
      // création d'un flux pour écrire dans un fichier
      fos = new FileOutputStream(...);
      // écriture de données dans ce flux
      fos.write(...);
 }
 catch (IOException e) {
      //Gestion de l'erreur de création ou d'écriture dans le flux
      e.printStackTrace();
 }
 finally{
     //Cette section de code est toujours exécutée, quil y ait une exception ou pas
     // fermeture du flux s'il a été ouvert
     if(fos != null) fos.close();
 }

Cet exemple permet dillustrer le mécanisme des exceptions en Java. Dans le cas dune erreur dentrée/sortie dans le bloc try, lexécution reprend dans le bloc catch correspondant à cette situation (exception de type IOException). Dans ce bloc catch, la variable e référence lexception qui sest produite. Ici, nous invoquons la méthode printStackTrace() qui affiche dans la console des informations sur lexception qui sest produite : nom, motif, état de la pile dappels au moment de la levée de lexception et, éventuellement, numéro de ligne auquel lerreur sest produite. Le bloc finally est ensuite exécuté (ici pour refermer les resources utilisées). Il ne sagit ici que dun exemple, laction à mettre en œuvre lorsquune exception survient dépend du fonctionnement général de lapplication et de la nature de lexception.

Encodage du source

Les spécifications du langage Java précisent quil est formé de caractères au format UTF-16, ce qui permet lutilisation dans le code source de tous les caractères existant dans le monde :

 public class hello_world {
    private String text = "hello world";
 }

Pour assurer la portabilité entre plates-formes, les noms de classes devraient néanmoins être formés uniquement de caractères ASCII.

JavaStyle

Les JavaStyle sont des conventions de programmation en langage Java définies par Sun. Le respect de conventions strictes assure une homogénéité dans le code source dune application développée par toute une équipe et favorise la diffusion du code source auprès dune communauté partageant les mêmes conventions de codage.

Cf. Les conventions de nommage édictées par Sun[pdf]

Versions

Java est une marque déposée de Sun Microsystems. Kits de développement Java (Java development kit ou JDK) publiés par Sun, utilisables gratuitement :

  • JDK 1.0, 1996
  • JDK 1.1, 1997
  • JDK 1.2, 1998 dite Java 2
  • JDK 1.3, 2000
  • JDK 1.4, 2002 appelée Java 2 v1.4.2
  • JDK 1.5, 2004 appelée Java 2 5.0 (nom de code Tiger)
  • JDK 1.6, 2006 appelée Java 6 (Mustang)

Le langage est stable depuis le JDK 1.0 ; les bibliothèques de classes fournies se sont agrandies et ont changé en partie. À partir de la version 1.2, les JDK ont été renommés en J2SDK (Java 2 Software Development Kit, kit de développement de logiciels Java 2) et on appelle souvent ces versions Java 2.

Du fait de laccroissement des bibliothèques et des changements entre version, la compatibilité est assurée dans un seul sens : les programmes Java compilés avec une version antérieure du JDK (par exemple 1.2) continueront à fonctionner avec un JRE plus récent (par exemple 1.5), mais le contraire nest pas vrai.

Licence

Le 11 novembre 2006, le code source du compilateur javac et de la machine virtuelle HotSpot ont été publiés en Open Source sous la Licence publique générale GNU[18]

Le 13 novembre 2006, Sun Microsystems annonce que tout le code source de Java sera publié en Open Source sous la Licence publique générale GNU dici mars 2007 sous le nom de projet OpenJDK[19].

Frameworks et API

Sun fournit un grand nombre de frameworks et dAPI afin de permettre lutilisation de Java pour des usages très diversifiés. On distingue essentiellement 4 grands frameworks :

  • J2SE : Ce framework est destiné aux applications pour poste de travail. En théorie, on doit désormais parler de Java SE ;
  • J2EE : Ce framework est spécialisé dans les applications serveurs. Il contient pour ce faire un grand nombre dAPI et dextensions. En théorie, on doit désormais parler de Java EE ;
  • J2ME : Ce framework est spécialisé dans les applications mobiles. En théorie, on doit désormais parler de Java ME ;
  • JavaCard : Ce framework est spécialisé dans les applications liées aux cartes à puces et autres SmartCards.

La persistance est basée sur les standards :

  • JDBC (Java DataBase Connectivity)
  • JDO (Java Data Objects)
  • EJB (Enterprise Java Beans)

On trouve toutefois de nombreuses autres technologies, API et extensions optionnelles pour Java :

Version interprétée

Il existe plusieurs versions interprétées de Java (langages de scripts sexécutant sur une JVM: beanshell et Groovy font lobjet de standardisations au sein du JCP (Java Community Process). Jython, JRuby, Jacl (Tcl) et dautres langages de scripts proposent des langages sur ce même principe. Linterpréteur de ces langages peut être embarqué dans une application Java pour la rendre scriptable. À noter quà partir de Java 6, le moteur Rhino (JavaScript) est embarqué dans la JRE.

Un exemple avec Jython

Pour la réalisation de prototype, dinterface graphique, de fichier XML, … ou pour lapprentissage du JDK, il est possible de coder en Java par script avec Jython

from java.applet import Applet

class HelloWorld(Applet):
    def paint(self, g):
        g.drawString("Hello from Jython!" 20, 30)

Appellation

Dans un premier temps, le langage sappelait Oak (« Chêne »), mais ce nom étant déjà utilisé, il a été renommé Java[20].

Programmation

La programmation peut se faire pour des exemples simples avec le compilateur javac, mais pour avoir plus de confort il est préférable dutiliser un environnement de développement intégré ou IDE, certains sont gratuits.

Construction

Un programme Java peut être produit avec des outils qui automatisent le processus de construction. Les plus utilisés sont :

  • Apache Ant (génération portable, décrite en XML)
  • Apache Maven (génération portable, décrite en XML)
  • SCons (génération portable de Java/C/C++). Exemple :
      Java(target = 'classes', source = 'src')
      Jar(target = 'test.jar', source = 'classes')

Resultats

     % scons -Q
     javac -d classes -sourcepath src src/Exemple1.java src/Exemple2.java src/Exemple3.java
     jar cf test.jar classes

Notes et références

  1. In Java 5.0, several features (the enhanced for loop, autoboxing, varargs, annotations and enums) were introduced, after proving themselves useful in the similar (and competing) language C#. [1][2][3]
  2. (en) Sun Microsystems Announces Formation Of Javasoft
  3. http://blog.softwhere.org/archives/196
  4. (en) The Java Community Process(SM) Program - JSRs : Java Specification Requests - detail JSR# 901
  5. (en) communiqué de presse
  6. (en) communiqué de presse
  7. (en) communiqué de presse
  8. (en) communiqué de presse - (en) liste complète des changements
  9. (en) JSR 59
  10. (en) communiqué de presse - (en) liste complète des changements
  11. (en) Version 1.5.0 or 5.0?
  12. (en) communiqué de presse
  13. (en) JSR 270
  14. (en) Java Naming
  15. eclipsetotale.com, programmez.com
  16. (en) Design Goals of the Java Programming Language
  17. a et b Voir par exemple les détails du fonctionnement et la description des options -XX:+UseParallelGC et -XX:+UseConcMarkSweepGC de la JRE de Sun (en) Java SE Virtual Machine Garbage Collection Tuning
  18. (en) "Q: What components of the JDK software are you open sourcing today? A: Were open sourcing the Java programming language compiler ("javac"), and the Java HotSpot virtual machine."Free and Open Source Java FAQ; the source is being released via the OpenJDK project.
  19. Sun Open Sources Java Platform, 13 novembre 2006. Consulté le 13 novembre 2006
  20. Histoire de Java. Consulté le 1er avril 2008

Voir aussi

Sur les autres projets Wikimedia :

Articles connexes

Liens externes

Bibliographie

  • Portail de la programmation informatique Portail de la programmation informatique

Ce document provient de « Java (langage) ».

Wikimedia Foundation. 2010.

Contenu soumis à la licence CC-BY-SA. Source : Article Java 5 de Wikipédia en français (auteurs)

Игры ⚽ Поможем написать курсовую

Regardez d'autres dictionnaires:

  • java — java …   Dictionnaire des rimes

  • Java EE — Java Platform, Enterprise Edition, abgekürzt Java EE oder früher J2EE, ist die Spezifikation einer Softwarearchitektur für die transaktionsbasierte Ausführung von in Java programmierten Anwendungen und insbesondere Web Anwendungen. Sie ist eine… …   Deutsch Wikipedia

  • Java EE — Java Platform, Enterprise Edition o Java EE (anteriormente conocido como Java 2 Platform, Enterprise Edition o J2EE hasta la versión 1.4), es una plataforma de programación parte de la Plataforma Java para desarrollar y ejecutar software de… …   Wikipedia Español

  • JAVA — Île volcanique de l’Indonésie, Java est séparé de Sumatra par le détroit de la Sonde, à l’ouest, et de Bali par le détroit du même nom à l’est. Sa superficie est de 132 000 kilomètres carrés. Alors que le relief suggère une division en bandes… …   Encyclopédie Universelle

  • Java EE — Java Enterprise Edition, ou Java EE (anciennement J2EE), est une spécification pour la technique Java de Sun plus particulièrement destinée aux applications d’entreprise. Ces applications sont considérées dans une approche multi niveaux[1]. Dans… …   Wikipédia en Français

  • Java SE — Java Platform, Standard Edition o Java SE (conocido anteriormente hasta la versión 5.0 como Plataforma Java 2, Standard Edition o J2SE), es una colección de APIs del lenguaje de programación Java útiles para muchos programas de la Plataforma Java …   Wikipedia Español

  • Java VM — Java Logo Die Java Virtual Machine (abgekürzt Java VM oder JVM) ist der Teil der Java Laufzeitumgebung (JRE) für Java Programme, der für die Ausführung des Java Bytecodes verantwortlich ist. Hierbei wird im Normalfall jedes gestartete Java… …   Deutsch Wikipedia

  • JAVA — Cette page d’homonymie répertorie les différents sujets et articles partageant un même nom …   Wikipédia en Français

  • Java ME — Java Platform, Micro Edition, abgekürzt Java ME [ˈdʒɑːvə ˌɛmˈiː], früher auch als Java Platform 2, Micro Edition oder kurz J2ME bezeichnet, ist eine Umsetzung der Programmiersprache Java für so genannte »embedded consumer products« wie etwa… …   Deutsch Wikipedia

  • Java 2 — Java 2, или Java 2.0 дальнейшее развитие и усовершенствование спецификации исходного стандарта языка и платформы Java, на который теперь принято ссылаться как на Java 1.0. В настоящее время спецификация платформы Java 2 продолжает интенсивно… …   Википедия

Share the article and excerpts

Direct link
https://fr-academic.com/dic.nsf/frwiki/850745 Do a right-click on the link above
and select “Copy Link”