Java est une technologie composée d'un langage de programmation orienté objet et d'un environnement d'exécution. Préalablement nommé Oak, il a été créé par James Gosling et Patrick Naughton chez Sun Microsystems avec le soutien de Bill Joy.
Le langage Java fut officiellement présenté le 23 mai 1995 au SunWorld.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 ou les templates. Les concepteurs ont privilégié l'approche orientée objet de sorte qu'en Java, tout est objet à l'exception des primitives (nombres entiers, nombres à virgules flotantes, etc.).
Java permet de développer des applications autonomes mais aussi, et surtout, des applications client-serveur. Côté client, 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 (Java Server Pages) qui peuvent se substituer à PHP et ASP.
Les applications Java peuvent être exécutées sur tous les systèmes d'exploitation pour lesquels a été développée une plateforme Java, dont le nom technique est JRE (Java Runtime Environment - Environnement d'exécution Java). Cette dernière est constituée d'une JVM (Java Virtual Machine - Machine Virtuelle Java), le programme qui interprète le code Java et le convertit en code natif. Mais le JRE est surtout constitué d'une bibliothèque standard à partir de laquelle doivent être développés tous les programmes en Java. C'est la garantie de portabilité qui a fait la réussite de Java dans les architectures client-serveur en facilitant la migration entre serveurs, très difficile pour les gros systèmes.
Le Projet Stealth fut rapidement rebaptisé Green Project avec l'arrivée de James Gosling et de Mike Sheridan. Ensemble, et aidés d'autres ingénieurs, ils commencèrent à travailler dans un petit bureau de la rue Sand Hille de Menlo Park en Californie. Ils essayèrent d'élaborer une technologie pour le développement d'applications d'une nouvelle génération, offrant à Sun la perspective d'opportunités uniques.
L'équipe envisageait initialement d'utiliser le langage C++, mais l'abandonna pour différentes raisons. Tout d'abord, ils développaient sur un système embarqué avec des ressources limitées, estimaient que l'utilisation du C++ demandait un investissement trop important et que cette complexité était une source d'erreur pour les développeurs. Les lacunes de ce langage au niveau du garbage collector impliquaient que la gestion de la mémoire devait être programmée manuellement, un challenge mais aussi une source d'erreur. 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 plateforme qui puisse être portée sur tout type d'appareils.
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++. A l'origine, Gosling envisageait de modifier et d'améliorer le langage C++, qu'il appelait C++ ++ --, mais l'idée fut bientôt abandonnée au profit du développement d'un nouveau langage de programmation qu'ils appelèrent Oak (chêne) en référence à un arbre planté juste devant la fenêtre de leur bureau.
L'équipa travailla avec acharnement et, à l'été 1992, ils furent capables de faire une démonstration incluant le système d'exploitation 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 d'un PDA appelé Star7 ayant une interface graphique et un agent intelligent appelé Duke pour prêter assistance à l'utilisateur. 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 d'outils hautement interactifs et quand Time Warner publia un RFP en faveur d'un décodeur multifonction, FirstPerson changea d'objectif pour proposer une telle plateforme. Cependant, l'industrie de la télé par cable trouva qu'elle offrait trop de possibilités à l'utilisateur et FirstPerson perdit le marché au profit de Silicon Graphic. Incapable d'intéresser l'industrie audiovisuelle, la société fut réintroduite au sein de Sun.
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 plateforme sur le Web. Ils pensaient qu'avec l'avènement du navigateur Mosaic, Internet était le lieu où allait se développer le même genre d'outil interactif que celui qu'ils avaient envisagé pour l'industrie du cable. 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 qu'on eut découvert que le nom Oak était déjà utilisé par un fabricant de carte video. Le nom Java fut inventé dans un petit bar fréquenté par quelques membres de l'équipe. Il n'est pas clair de savoir si oui ou non le nom est un acronyme, bien que certains prétendent qu'il signifie James Gosling, Arthur Van Hoff et Andy Bechtolsheim ou tout simplement Just Another Vague Acronym (littéralement juste un autre vague acronyme). 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és nombre magique) des fichiers de classe est en hexadécimal 0xCAFEBABE. En octobre 1994, HotJava et la plateforme 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. L'annonce fut effectuée par John Gage, le directeur scientifique de Sun Microsystems. Son annonce fut accompagnée de l'annonce surprise de Marc Andressen, vice président de l'exé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 *. Deux semaines plus tard la première version de Java était disponible.
Les avantages de Java par rapport à Javascript sont essentiellement la portabilité. Plus l'interface est lourde, plus il est épuisant voire impossible d'adapter l'interface à tous les navigateurs du marché. Les avantages de Java par rapport à Flash sont aussi valable par rapport à Javascript : Java propose un style de langage plus élégant, et extrèmement bien documenté et propose surtout un Environnement_de_d%C3%A9veloppement_int%C3%A9gr%C3%A9 très efficace.
Les applets sur le poste Client peuvent communiquer avec des servlet sur le Serveur, tout comme JavaScript peut communiquer avec le Serveur au moyen d'AJAX. Flash utilise la technologie Flex_%28Macromedia%29.
La puissance de Java est souvent utilisée pour des applications plus consistantes comme les jeux Yahoo et plus récemment les lecteurs video multiplateformes (par exemple *).
strictfp
assert (Spécifié dans JSR 41.)
int) et le Wrapper de classe correspondant (comme la classe Integer) (Specifié dans JSR 201).
enum permet de créer une liste ordonnée de valeurs sans type. Auparavant, ceci pouvait seulement être réalisé par des entiers constants (Specifié dans JSR 201).
Object ... utilisée dans une déclaration de méthode permet de spécifier un nombre variables d'arguments pour cette méthode. C'est un fonctionnement équivalent à la fonction "printf" en C.
for pour les boucles — la syntaxe du for est étendue avec une syntaxe spéciale pour les itérer sur n'importe quel Itérable comme un tableau, ou une collection en utilisant la syntaxe :
| void displayWidgets (Iterable |
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 3000 dans J2SE 5.0. Des API entières, comme Swing ou Java2D ont été ajoutées et beaucoup de méthodes de l'original JDK 1.0 ont été déclarées deprecated (c'est-à-dire obsolètes et pouvant être supprimées à tout moment).
Lors de la création du langage Java, il avait été décidé que ce langage devait répondre à 5 objectifs :
Un autre objectif majeur de la programmation orientée objet est de développer des objets génériques de façon que le code puisse être réutilisable entre différents projets. Un objet "client" générique par exemple doit avoir globalement le même comportement dans les différents projets, en particulier si ces différents projets se recoupent comme c'est souvent le cas dans les grandes organisations. Dans ce sens, un objet doit être peut être vu comme un composant logiciel enfichable, permettant à l'industrie du logiciel de bâtir des projets d'envergure à partir d'éléments de base réutilisables et à la stabilité éprouvée tout en diminuant de manière drastique le temps de développement.
La réutilisation de code, lorsqu'elle est soumise à l'épreuve de la pratique, rencontre deux difficultés majeures : la création d'objets génériques réellement réutilisables est une notion très mal comprise et une méthodologie pour diffuser de l'information nécessaire à la réutilisation de code manque cruellement. Certaines communauté du monde "Open Source" veulent contribuer à résoudre ce problème en fournissant aux programmeurs la possibilité de diffuser largement de l'information sur les objets réutilisables et les bibliothèques objet.
La deuxième caractéristique, l'indépendance vis à vis de la plateforme, signifie que les programmes écrits en Java fonctionne 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 l'application sur toutes les autres.
Ce résultat est obtenu par les compilateurs Java qui compilent le code source "à moitié" afin d'obtenir un bytecode (plus précisément le bytecode Java, un langage machine spécifique à la plateforme 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 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 aboutit à la plainte en Justice contre Microsoft après que Sun a constaté que l'implémentation de Microsoft ne supportait pas les interfaces RMI et JNI et comportait des éléments spécifiques à certaines plateformes par rapport à la plateforme 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 plateformes et, sur les versions récentes de Windows, Internet Explorer ne supporte pas les applets Java sans rajouter de plug-in. Cependant, Sun met à disposition gratuitement des environnements d'exécution de Java pour les différentes plateformes 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 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 la phase de bytecode. On obtient ainsi de bonnes performances mais aux dépends 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 plateforme Java qui fonctionne correctement sur beacoup de machines cibles, le nombre important de plateformes avec de petites erreurs et des incohérences a abouti à un détournement du slogan de Sun "Write once, run anywhere" ("Ecrire une fois, exécuter partout") en "Write once, debug everywhere" ("Ecrire une fois, déboguer partout") !
L'indépendance de Java vis à vis de la plateforme 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.
En java, ce problème est évité grâce au ramasse-miettes (Garbage collector). Les objets sont créés et placés sur un tas. Le programme et les autres objets peuvent faire référence à l'objet grâce à son adresse sur le tas. Quand il ne reste plus aucune référence vers l'objet, le ramasse-miettes détruit automatiquement l'objet devenu inaccessible, libérant la mémoire et prévenant ainsi un manque de mémoire. Les manques de mémoire peuvent néanmoins survenir quand un programmeur garde une référence vers un objet dont il n'a plus besoin; ils continuent à exister, mais uniquement à un niveau concept beaucoup plus élevé. Mais dans l'ensemble, le ramasse-miettes rend la création et la destruction d'objets en Java plus simple, potentiellement plus sûre et souvent plus rapide qu'en C++.
Le ramasse-miettes est transparent pour le développeur. Les développeurs peuvent très bien n'avoir aucune idée du moment où le ramasse-miettes intervient, et ce n'est pas une partie du programme qu'ils doivent écrire eux-même.
Quatre buts primaires présidaient à la création du langage Java. Il devait :
Java est habituellement compilé vers une machine virtuelle standardisée, sous forme de bytecode. Cette machine peut fonctionner avec un interpréteur, un compilateur just-in-time (à la volée), ou, le plus couramment, avec un mélange des deux.
Il existe des variantes de ce schéma :
Ce paradigme de programmation vise à rendre les grands projets logiciels plus faciles à gérer, à améliorer la qualité des logiciels et à réduire le nombre d'échecs de projet.
Dans la version 1.5 du langage ont été rajouté 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.
Ceci est permis en compilant le code source d'un programme Java dans un pseudo-code intermédiaire appelé bytecode Java -- des instructions machine standardisées et destinées à un processeur virtuel. Le code est par la suite exécuté par une implémentation de cette machine virtuelle (JVM), un programme écrit en code natif sur le matériel cible qui traduit le pseudo-code Java en code utilisable pour le matériel concerné. De plus, des bibliothèques sont offertes pour fournir l'accès à des fonctionnalités propres à la machine cible -- comme le graphisme ou le réseau -- d'une manière unifiée. Le langage Java offre aussi le support des programmes avec plusieurs processus légers (threads).
La première implémentation du langage utilisait une machine virtuelle pour offrir la portabilité, et plusieurs implémentations le font encore. Ces dernières produisent des programmes qui fonctionnent plus lentement que les programmes compilés nativement, comme ceux écrits en C. Cette situation a conféré une réputation de lenteur aux programmes Java. Toutefois, des implémentations plus récentes de la machine virtuelle Java produisent des programmes qui s'exécutent beaucoup plus vite grâce à l'utilisation de diverses techniques, mais surtout la puissance des machines à partir de 1,5GHz rendent les interfaces classiques très confortable. C'est maintenant Javascript qui porte le fardeau de la lenteur.
La première technique consiste à compiler directement en code natif, comme les compilateurs traditionnels, sans passer par le pseudo-code. Cette méthode permet une meilleure performance, mais au prix de la portabilité (cf. GCJ). Une autre technique, la compilation à la volée (just-in-time ou JIT), compile le pseudo-code Java en code natif à l'exécution du programme. Les machine virtuelles plus sophistiquées utilisent également la recompilation dynamique, qui permet à la machine d'analyser le comportement du programme et de recompiler et d'optimiser les parties critiques. Ces deux techniques permettent à l'application de prendre avantage de la vitesse d'exécution du code natif tout en conservant la portabilité.
La portabilité est un but techniquement difficile à atteindre, et le succès de Java à ce but est sujet à controverse. Même s'il est en effet possible d'écrire des programmes pour les machines virtuelles Java qui se comportent de façon cohérente sur différentes plates-formes, le grand nombre de plates-formes avec des petites erreurs ou incohérences a mené à une parodie du slogan de Sun Write once, run anywhere (écrire une fois, exécuter n'importe où) en Write once, debug everywhere (écrire une fois, déboguer partout).
Les machines virtuelles développées sous licence par Microsoft ne sont pas étrangères à cette réputation. En effet, l'éditeur de Redmond avait singulièrement 'adapté' ses machines virtuelles à ses besoins propres. Il a été condamné à cesser l'exploitation de la licence et à retirer les machines virtuelles non conformes de ses produits.
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, propriétés système,...). Une autorisation définit
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.
Le fichier source doit s'appeler HelloWorld.java. Vous pouvez le tester avec les commandes suivantes (sous Linux) : javac HelloWorld.java CLASSPATH=. java HelloWorld
La ligne « CLASSPATH=. » est nécessaire pour indiquer à Java qu'il doit également chercher les programmes class dans le répertoire courant. Ce chemin peut également être spécifié par l'option -classpath (ou -cp en abrégé) : javac HelloWorld.java java -cp . HelloWorld
abstract else instanceof strictfp while boolean false assert (JDK 1.4) enum (JDK 1.5) interface super byte null break extends native switch char true case final new synchronized double catch finally package this float class for private throw int const (Non utilisé) goto (Non utilisé) protected throws long continue if public transient short default implements return try void do import static volatile
Structure faire... tant que :
do {
instruction(s)
}
while (
Structure pour :
for (
Structure pour (java 1.5): for(<Objet récupérant l'occurance suivante de la collection> : <Collection d'objets>){ instruction(s) }
Structure si... sinon : condition avec alternative unique
if (
Structure si... ou si... ou si... : condition avec alternatives multiples
if (
Structure ''atteindre... cas x... cas y... " : embranchement vers un bloc d'instructions énuméré
switch (
La commande break sort immédiatement la boucle en cours (for, while, do), et permet de sortir d'une clause contenue dans un switch.
Une expression continue termine l'ité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 ? : : Condition pouvant être utilisée en une ligne de code
try {
instruction(s)
}
catch (
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 d'une exception: FileOutputStream fos = null; try { //<-- Créer un flux pour écrire dans un fichier. Le fichier //n'est pas spécifié puisque ce n'est pas essentiel pour //l'exemple. fos = new FileOutputStream(...); fos.write(a); //'a' aurait reçu une valeur ultérieurement } catch (IOException e) { e.printStackTrace(); } finally{ //Fermer le flux, qu'il y ait une exception lancée ou pas if(fos != null) fos.close(); }
Cet exemple permet d'illustrer le mécanisme des exceptions en Java. Dans le cas d'une erreur d'entrée/sortie dans le bloc "try", l'exécution reprend dans le bloc "catch" correspondant à cette situation (exception de type "IOException"). Dans ce bloc "catch", la variable "e" référence l'exception qui s'est produite. Ici, nous invoquons la méthode "printStackTrace()" qui affiche dans la console des informations sur l'exception qui s'est produite : nom, motif, état de la pile d'appels au moment de la levée de l'exception et, éventuellement, numéro de ligne auquel l'erreur s'est produite. Le bloc finally est ensuite exécuté (ici pour refermer les resources utilisées). Il ne s'agit ici que d'un exemple, l'action à mettre en œuvre lorsqu'une exception survient dépend du fonctionnement général de l'application et de la nature de l'exception.
public class 你好世界 { private string 文本 = "你好世界"; }
Pour assurer la portabilité entre plateformes, les noms de classes devraient néanmoins être formés uniquement de caractères ASCII.
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 l'accroissement 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 n'est pas vrai.
Sun fournit un grand nombre de frameworks et d'API afin de permettre l'utilisation de Java pour des usages très diversifiés. On distingue essentiellement 4 grands frameworks :
La persistance est basée sur les standards :
On trouve toutefois de nombreuses autres technologies, API et extensions optionnelles pour Java :
from java.applet import Appletclass HelloWorld(Applet): def paint(self, g): g.drawString("Hello from Jython!" 20, 30)
Java(target = 'classes', source = 'src')
Jar(target = 'test.jar', source = 'classes')
Resultats
% scons -Q
javac -d classes -sourcepath src src/Example1.java src/Example2.java src/Example3.java
jar cf test.jar classes
Langage de programmation Langage orienté objet | Java
جافا | Java | Llenguatge Java | Java | Java (programmeringssprog) | Java (Programmiersprache) | Java | Java programming language | Java | Lenguaje de programación Java | Java | زبان برنامهنویسی جاوا | Java | Linguaxe Java | Java | Java (programski jezik) | Java programozási nyelv | Java | Java (forritunarmál) | Java (linguaggio) | Java言語 | Java პროგრამული ენა | 자바 프로그래밍 언어 | Java (kalba) | Java (valoda) | Јава (програмски јазик) | Java (programmeertaal) | Java (programmeringsspråk) | Java | Java (linguagem de programação) | Java | Java | Programski jezik Java | Java | Java (programspråk) | ஜாவா நிரலாக்க மொழி | ภาษาจาวา | Java programlama dili | Мова програмування Java | Java (ngôn ngữ lập trình) | Java
This article is licensed under the GNU Free Documentation License.
It uses material from the
"Java (langage)".
Home Page • arts • business • computers • games • health • hospitals • home • kids & teens • news • physicians • recreation• reference • regional • science • shopping • society • sports • world