Présentation du langage JAVA Cours "Réseaux et systèmes répartis" NFP 214 par Jacques LAFORGUE ([email protected]) version du 27/11/2014 slide numéro 1 JAVA est un vrai langage JAVA est un langage de programmation à part entière L’objectif premier de ce langage était de définir un langage de programmation portable sur toutes les plates-formes existantes (1990). Il est devenu un langage moderne et incontournable A ne pas confondre avec Javascript Cours "Systèmes et réseaux répartis" NFP 214 par Jacques LAFORGUE ([email protected]) version du 27/11/2014 slide numéro 2 Historique de Java 1993 : projet Oak (langage pour l'électronique grand public) Mai 95 : Netscape prend la licence Sept. 95 : JDK 1.0 b1 Mai 96 : JDK 1.0.2, première version réellement utilisable Fin 96 : RMI, JDBC, JavaBeans, ... Fév. 97 : JDK 1.1 Déc. 98 : Java 2 SDK 1.2, apparition du terme Plate-forme Java 1999 : Forte orientation de Sun vers le coté serveur plate-forme J2EE : Servlets, JSP et serveurs d ’application. 2000 : Java 2 SDK 1.3 2001 : Java 2 SDK 1.4 2006 Java 2 EE (SDK 1.5) 2007 Java 2 EE (SDK 1.6) Cours "Systèmes et réseaux répartis" NFP 214 par Jacques LAFORGUE ([email protected]) version du 27/11/2014 slide numéro 3 JAVA est : simple, orienté objet, familier, distribué, robuste, sûre, portable, dynamique et multithread JAVA est plus qu'un langage Cours "Systèmes et réseaux répartis" NFP 214 par Jacques LAFORGUE ([email protected]) version du 27/11/2014 slide numéro 4 JAVA est robuste A l’origine, c'est un langage pour les applications embarquées. Gestion de la mémoire par un garbage collector. Pas d’accès direct à la mémoire. Mécanisme d'exception. Accès à une référence null exception. compilateur contraignant (erreur si exception non gérée, si utilisation d’une variable non affectée, ...). Tableaux = objets (taille connue, débordement exception). Seules les conversions sûres sont automatiques. Contrôle des cast à l'execution Cours "Systèmes et réseaux répartis" NFP 214 par Jacques LAFORGUE ([email protected]) version du 27/11/2014 slide numéro 5 L'architecture de JAVA (1/3) Cours "Systèmes et réseaux répartis" NFP 214 par Jacques LAFORGUE ([email protected]) version du 27/11/2014 slide numéro 6 L'architecture de JAVA (2/3) Les Java SDK (Software Development Kit) J2SE (Java 2 Platform, Standard Edition) J2EE (Java 2 Platform Enterprise Edition) JSTL : Java server page Standard Tag Library C'est un ensemble de tags personnalisés développé sous la JSR 052 qui propose des fonctionnalités souvent rencontrées dans les JSP : Tag de structure (itération, conditionnement ...) Internationalisation Exécution de requête SQL Utilisation de document XML AVK permet d'évaluer le niveau de portabilité d'une application (après tout si on a choisi Java et J2EE c'est au moins en partie pour ses qualités de portabilité). Ce kit propose des outils pour vérifier de manière statique et dynamique (exécution de l'application) tout code J2EE 1.2, 1.3 ou 1.4. Cours "Systèmes et réseaux répartis" NFP 214 par Jacques LAFORGUE ([email protected]) version du 27/11/2014 slide numéro 7 L'architecture de JAVA (3/3) JSF simplifie le développement d'interface utilisateur Web. Rendre indépendant la logique de présentation et ses rendus JSF permet de représenter des composants IHM et gérer leurs états, gérer leurs événements, valider les saisies, définir la navigation des pages, supporter l'internationalisation et accessibilité. Cours "Systèmes et réseaux répartis" NFP 214 par Jacques LAFORGUE ([email protected]) version du 27/11/2014 slide numéro 8 JAVA est un LOO JAVA est un langage orienté objet : Tout est classe (pas de fonctions) sauf les types primitifs (int, float, double, ...) et les tableaux Toutes les classes dérivent de java.lang.Object Héritage simple pour les classes Une classe peut implémenter plusieurs interfaces : héritage multiple des méthodes. Les objets se manipulent via des références Une API objet standard est fournie La syntaxe est proche de celle de C Cours "Systèmes et réseaux répartis" NFP 214 par Jacques LAFORGUE ([email protected]) version du 27/11/2014 slide numéro 9 JAVA est portable JAVA est portable : Le compilateur Java génère du byte code. La Java Virtual Machine (JVM) est présente sur Unix, Win32, Mac, OS/2, Linux, Netscape, IE, ... Le langage a une sémantique très précise. La taille des types primitifs est indépendante de la plate-forme. Java supporte un code source écrit en Unicode. Java est accompagné d'une librairie standard. Cours "Systèmes et réseaux répartis" NFP 214 par Jacques LAFORGUE ([email protected]) version du 27/11/2014 slide numéro 10 Les "exécutables" de JAVA Il n'y a pas vraiment d'exécutable au sens commun Tout programme Java est interprété soit c'est une classe contenant une méthode main soit c'est un package qui contient une classe qui contient une méthode main soit c'est un applet qui s'exécute dans un AppletViewer ou un navigateur Cours "Systèmes et réseaux répartis" NFP 214 par Jacques LAFORGUE ([email protected]) version du 27/11/2014 slide numéro 11 La classe JAVA La création de classe est la base de l'architecture logicielle d'un programme JAVA. Elle représente le seul composant logiciel du langage. Il est impossible d'écrire un programme JAVA sans créer au moins une classe. Il est possible de créer des classes publiques, privées, ou abstraites Depuis la version 1.2 de JDK, il est possible d'imbriquer les classes. Quelle que soit sa nature, une classe : est constituée d' attributs (private, public, protected, final, static) et de méthodes hérite d'une autre classe (par défaut hérite de la classe Object) appartient ou non à un package Le type "Record" n'existe pas dans le langage JAVA. La seule manière de créer une structure de données est de créer une classe dont chaque attribut est un élément de la structure de donnée. Cette contrainte oblige le programmeur de toujours créer des classes pour ses données. Cours "Systèmes et réseaux répartis" NFP 214 par Jacques LAFORGUE ([email protected]) version du 27/11/2014 slide numéro 12 Exemple d'un fichier JAVA class Individu { public String nom; public String prenom; public int age; public String toString() { return(nom+" "+prenom+" ("+age+"ans)"); } } ..... public class Couple { Individu mari; Individu femme; Individu enfants[]; public void afficher() { int i; System.out.println(mari.toString+" marié à "+femme.toString()); String s=new String(); for(i=0;i<enfants.length;i++) s=s+enfants[i].toString()+" "; System.out.println("Enfants: "+s); } ..... } Cours "Systèmes et réseaux répartis" NFP 214 par Jacques LAFORGUE ([email protected]) version du 27/11/2014 slide numéro 13 Les phases de génération Fichiers sources .java de type texte appartenant ou non à un package contenant une ou plusieurs classes mais une seule classe publique La classe publique contenue dans le fichier doit être de même nom que celui du fichier. Les classes non publiques ne sont pas visibles par les autres classes des autres fichiers. On appelle ces classes des classes locales de l'unité de programmation (à ne pas confondre avec les classes imbriquées). Il n’existe pas de séparation entre l’interface et l’implémentation d’une classe, comme cela peut être le cas en C++ ou en ADA. Cela est inutile en JAVA. Tout le code nécessaire à l’écriture d’une classe est dans son fichier .java associé. Il n’existe plus de .h !!! Compilation des fichiers sources en .class La compilation d'un fichier .java génère autant de fichier .class que de classes définies dans le fichier. Cela impose que toutes les classes Java doivent être de nom différent, dans un même package Nous verrons que l'utilisation des ces fichiers générés peut devenir complexe (ordre de l'appel en fonction de CLASSPATH, chargement dynamique, transfert à travers le réseau, ...). Cours "Systèmes et réseaux répartis" NFP 214 par Jacques LAFORGUE ([email protected]) version du 27/11/2014 slide numéro 14 La machine virtuelle de JAVA La phase de compilation ne génère pas du code directement exécutable mais un code appelé P-CODE qui est un code intermédiaire. Ce code est ensuite interprété durant la phase d’exécution. Ceci confère à JAVA deux propriétés très importantes : le langage JAVA est un langage à liaison dynamique, le code est portable immédiatement sur des plates-formes différentes Les trois machine virtuelles les plus connues sont : java la commande d'exécution de programme autonome un AppletViewer qui visualise un applet un navigateur (Netscape,InternetExplorer, ...) Ce principe d'interprétation de pseudo-code permet une portabilité de toutes les classes JAVA sur toute plate-forme qui possède un navigateur. Cela explique la généralisation de la création d'applets. De plus, un certain nombre de contrôle peut être réalisés durant l'interprétation afin d'interdire certaines instructions dans certains cas de figure. Comme par exemple: un applet Java ne peut pas exécuter des instructions systèmes. Cours "Systèmes et réseaux répartis" NFP 214 par Jacques LAFORGUE ([email protected]) version du 27/11/2014 slide numéro 15 Compilation et règles de dépendance Il n'existe plus de "makefile". Compiler une classe ou un programme Java consiste à faire la compilation de la classe "principale". Le compilateur compilera les autres classes Java automatiquement si elles ont évoluées. La recherche de ces classes se fait en fonction du "classpath" Cours "Systèmes et réseaux répartis" NFP 214 par Jacques LAFORGUE ([email protected]) version du 27/11/2014 slide numéro 16 L'exécution d'un programme JAVA (1/2) Le langage Java est dynamique et s’adapte à l’évolution du système sur lequel il s’exécute. Les classes sont chargées au fur et à mesure des besoins, à travers le réseau s’il le faut. On peut parler de distribution des classes avant celle des objets. La sécurité est un point fort de Java. Des principes et des classes spécifiques permettent de contrôler l’exécution du code Java sur une machine. Le code java s’exécutant sur une client ne peut pas faire n’importe quoi, comme par exemple gérer les fichiers du système cible. Cours "Systèmes et réseaux répartis" NFP 214 par Jacques LAFORGUE ([email protected]) version du 27/11/2014 slide numéro 17 L'exécution d'un programme JAVA (2/2) Cours "Systèmes et réseaux répartis" NFP 214 par Jacques LAFORGUE ([email protected]) version du 27/11/2014 slide numéro 18 Le typage JAVA est un langage fortement typé. Toute donnée utilisée appartient à un type de classe (ou interface) bien précis. Par contre le mécanisme d'héritage et d'abstraction inhérent à tout langage objet permet de "caster" un objet en un autre type de donnée que sa déclaration. Ce fort typage est essentiel afin d'assurer la robustesse du code développé à travers les nombreux contrôles de compilation de JAVA. Toute entité d'un langage JAVA doit être déclarée, puis initialiser avant son utilisation. L'initialisation d'un objet est assurée par le(s) constructeur(s) définit(s) dans sa classe d'appartenance. Deux familles de type : les types primitifs les types d'objet (classes, interfaces) L'interface joue un grand rôle dans la programmation en Java contrat, abstraction, généricité, polymorphisme, délégation Cours "Systèmes et réseaux répartis" NFP 214 par Jacques LAFORGUE ([email protected]) version du 27/11/2014 slide numéro 19 La syntaxe du langage La syntaxe du langage JAVA est très rigoureuse et grâce à son fort typage la majorité des erreurs de développement est détectée durant la phase de compilation. Par contre, cela implique une certaine habitude à utiliser les mécanismes de conversion de type (casting). On peut résumé la situation en disant qu’il ne faut pas confondre “ fortement ” avec “ souplesse ”. Bien que JAVA type toutes ces données et qu’il soit rigoureux sur ses contrôles, de part la nature objet de ces données, JAVA rend compatible la plupart des types entre eux (dans la mesure où ces types appartiennent même de loin à une autre classe). La syntaxe générale du langage JAVA est celle du langage C et C++. On peut résumer la situation en disant que JAVA a pris ce qu'il y avait de bon dans le C/C++ et éliminer ce qui était mauvais ou peu recommandable à utiliser dans un vrai langage objet. On retrouve notamment toutes les structures de contrôles du langage C et la forme générale de déclaration d'une classe du C++. Il y a eu notamment une grande simplification pour la déclaration des méthodes et la façon de passer les paramètres. Cours "Systèmes et réseaux répartis" NFP 214 par Jacques LAFORGUE ([email protected]) version du 27/11/2014 slide numéro 20 Les mécanismes de JAVA (1/3) Allocation et désallocation dynamique et transparente des objets Ainsi, la notion de "destructeur" disparaît complètement du langage Il existe des cas exceptionnels pour lesquels il est nécessaire de définir un destructeur. Ce sont les cas où des allocations de ressources ne sont pas assurées par le langage (programmation système, utilisation du langage C, …) L'activation du garbage-collector se fait durant l'exécution du programme. Pour des raisons de performances, il peut être utile de maîtriser son activation. Pour cela, la classe System contient la méthode gc() permettant d'activer le garbage-collector. Plus de pointeurs La notion de pointeur en tant qu'élément du langage disparaît complètement. Ainsi, la grande majorité des erreurs désastreuses de pointeurs mal initialisés, confondus, ... n'existent plus en JAVA. Les objets sont référencés Les tableaux contiennent soit des types primitifs, soit des références Les tableaux sont des objets au sens LOO Cours "Systèmes et réseaux répartis" NFP 214 par Jacques LAFORGUE ([email protected]) version du 27/11/2014 slide numéro 21 Les mécanismes de JAVA (2/3) Les exceptions La gestion des exceptions est le seul moyen moderne et robuste de gérer les cas d'erreur d'un programme. Les exceptions en JAVA sont de véritables objets et héritent toutes de la classe prédéfinies Exception. Il est ainsi possible de créer ses propres "familles" d'exception sous forme de sous-classes et de particulariser les traitements d'erreur. Un grand nombre d'exceptions prédéfinies existent. Chacune d'entre elles est liée à une classe bien précise. Toutes les erreurs d'exécution sont récupérées par ces dernières et peuvent être traitées par le programmeur. La pile des appels successifs des méthodes qui a entraîné l'erreur est accessible et permet de situer très facilement le problème. La difficulté réside dans la connaissance de toutes ces exceptions qui sont très nombreuses. Chaque package défini ses exceptions. Cours "Systèmes et réseaux répartis" NFP 214 par Jacques LAFORGUE ([email protected]) version du 27/11/2014 slide numéro 22 Les mécanismes de JAVA (3/3) La réflexivité du langage exploration du contenu des classes et des interfaces création dynamique de classe invocation par nom des éléments du langage Le chargement dynamique des classes Les mutex sont intégrés dans les classes du langage Cours "Systèmes et réseaux répartis" NFP 214 par Jacques LAFORGUE ([email protected]) version du 27/11/2014 slide numéro 23 Le passage de paramètre L'unique forme de passage des paramètres à une méthode est le passage par valeur La seule manière de retourner un résultat est de retourner cette valeur par la valeur de la méthode Les méthodes Java peuvent retourner un objet, un type primitif ou un void L'objet retourné est unique Cela impose de formaliser sous forme d'objet les valeurs retournées (ce qui n'est pas plus mal en programmation objet). Pour changer le contenu d'un objet le passage par valeur est suffisant puisque c'est la référence à l'objet qui est passée en paramètre Mais attention à cette pratique: elle est contraire à tous les usages d'une programmation objet Cours "Systèmes et réseaux répartis" NFP 214 par Jacques LAFORGUE ([email protected]) version du 27/11/2014 slide numéro 24 Les API de JAVA (1/3) Cours "Systèmes et réseaux répartis" NFP 214 par Jacques LAFORGUE ([email protected]) version du 27/11/2014 slide numéro 25 Les API de JAVA (2/3) Cours "Systèmes et réseaux répartis" NFP 214 par Jacques LAFORGUE ([email protected]) version du 27/11/2014 slide numéro 26 Les API de JAVA (3/3) Cours "Systèmes et réseaux répartis" NFP 214 par Jacques LAFORGUE ([email protected]) version du 27/11/2014 slide numéro 27 Propriétés avancées Java est sécurisé Indispensable avec le code mobile. Pris en charge dans l'interpréteur. Trois couches de sécurité : Verifier : vérifie le byte code. Class Loader : responsable du chargement des classes. Security Manager : accès aux ressources. Code certifié par une clé. Java est multi-thread Intégrés au langage et aux API : synchronized garbage collector dans un thread de basse priorité java.lang.Thread, java.lang.Runnable Accès concurrents à objet gérés par un monitor. Implémentation propre à chaque JVM. Java est distribué API réseau (java.net.Socket, java.net.URL, ...). Chargement de code dynamique. Applet. Servlet. Remote Method Invocation. JavaIDL (CORBA) Cours "Systèmes et réseaux répartis" NFP 214 par Jacques LAFORGUE ([email protected]) version du 27/11/2014 slide numéro 28 Résumé des différences avec le C++ (1/2) Pas de structures ni d’unions Pas de typedef Pas de préprocesseur Pas de variables ni de fonctions en dehors des classes Pas d'héritage multiple de classes Pas de "template" (sauf depuis la 1.5) Pas de surcharge d’opérateurs Pas de passage par référence des paramètres Pas de pointeurs, seulement des références Exceptions : plus formels et plus étendues Cours "Systèmes et réseaux répartis" NFP 214 par Jacques LAFORGUE ([email protected]) version du 27/11/2014 slide numéro 29 Résumé des différences avec le C++ (2/2) Garbage-collector intégré: inutile de détruire les objets créés Pas de « makefile » Packages = répertoires Archivages (.jar) Les tableaux sont des objets Les chaînes de caractères sont toutes des constantes La syntaxe est celle du C++ Pas de .h L'interface Les commentaires sont ceux du C++ (// /*..*/) Commentaires de documentation (/**..*/) Pas de "dynamic-cast" : un cast unique Java est un langage objet à liaison dynamique A partir de la version 1.5, "auto-boxing" des types primitifs Cours "Systèmes et réseaux répartis" NFP 214 par Jacques LAFORGUE ([email protected]) version du 27/11/2014 slide numéro 30 Les outils (1/2) Développement et exécution Environnements de développement : Sun JDK 1.1.x (compilateur, JVM, appletviewer,...) Sun Java 2 SDK 1.x (x > 2) (compilateur, JVM, appletviewer,...) java-mode emacs IDE : IBM Visual Age, Borland JBuilder, Sun Forte, Symantec Visual Café, Metrowerks CodeWarrior, MS Visual J++, ... Browsers : Netscape Navigator Internet Explorer Sun HotJava Machines virtuelles Sun JRE Autre JVM : IBM, ... Autres Convertisseur : c2j, j2c, Tabo... Décompilateur/ 'obscurcisseur' : Mocha / Crema Générateur de parseurs : JavaCC, JavaCUP Profiler : Jprobe, Optimize It, Quantify, ... Cours "Systèmes et réseaux répartis" NFP 214 par Jacques LAFORGUE ([email protected]) version du 27/11/2014 slide numéro 31 Les outils (2/2) Java / Software Développement Kit javac : compilateur de sources java java : interpréteur de byte code appletviewer : interpréteur d'applet javadoc : générateur de documentation (HTML, MIF) javah : générateur de header pour l'appel de méthodes natives javap : désassembleur de byte code jdb : debugger javakey : générateur de clés pour la signature de code rmic : compilateur de stubs RMI rmiregistry : "Object Request Broker" RMI …. Cours "Systèmes et réseaux répartis" NFP 214 par Jacques LAFORGUE ([email protected]) version du 27/11/2014 slide numéro 32