Caractéristiques remarquables de Java

Code portable
"write once , run anywhere": la machine "serveur" à partir de laquelle on télécharge les codes est peut-être différente de la machine qui exécute ces codes … et pourtant le même code peut-être exécuté sur n’importe quelle machine qui effectue ce chargement: on a donc un code portable … et pourtant ce n’est pas un code "source" mais un code "binaire". En principe les codes "binaires" sont spécifique à un type de machine; ce n’est pas le cas ici: on a un code binaire portable! Nous allons découvrir comment cela est possible.
Chargement et exécution dynamique

une application peut "découvrir" des codes au run-time (au moment où elle s’exécute: ce n’est pas évident avec d’autres systèmes de codes binaires)

  • les "composants" (les éléments du programme) peuvent être relativement indépendants les uns des autres ("programmation à objets").
  • quand les codes sont téléchargés un système de sécurité en contrôle l’intégrité
  • plusieurs codes peuvent s’exécuter en parallèle (threads)

--Exercices--

La machine virtuelle Java (J.V.M.)

schema: la machine virtuelle java

C’est un exécuteur spécifique à la plate-forme locale qui émule le "processeur virtuel".

On doit donc installer sur la machine locale un runtime (J.R.E) qui contient aussi les bibliothèques de code fondamentales (appelées ici "logithèques"). La plupart des codes de ces bibliothèques sont des codes java mais certains sont des codes natifs (spécifiques à la plate-forme): ces codes servent à interagir à un bas niveau avec le système d’exploitation (et aussi avec le système graphique).

On a donc deux standards :

  • Le langage Java proprement dit (défini par un document de spécification -J.L.S-)
  • La machine virtuelle: son comportement est décrit mais son implantation est "ouverte"(ce qui veut dire qu’on peut trouver des exécuteurs java "fabriqués" par des organismes différents. Assez curieusement on pourra trouver ainsi des exécuteurs optimisés pour des applications particulières - par ex. des machines qui sont des serveurs intensifs -).
[Note]

La machine virtuelle peut être utilisée par d’autres langages de programmation (Groovy, Scala, Jython -Python sur JVM- , Ceylon, Kotlin, …).

Nous reviendrons ultérieurement sur le fonctionnement de cette machine virtuelle et sur les détails de l’exécution.

Origines et objectifs du langage

La langage Java est issu d’un projet de recherche pour l’informatisation de petits appareils (téléphones, décodeurs TV, robots divers, etc…). Ce contexte implique des contraintes particulières: diversité des matériels, interconnexion des codes en réseau, mise à jour dynamique de logiciels, …

Le projet (initialement baptisé OAK) cherchait à mettre au point en environnement de développement adapté à ces contraintes et tenant compte de l'évolution de l'état de l’art en matière de langages de programmation. Si le C++ a été abandonné pour diverses raisons (sémantique byzantine, liens étroits avec l’esprit des codes compilés "natifs", …) il a été choisi de concevoir un langage avec quelques principes plus simples mais avec une syntaxe proche pour que les développeurs C/C++ puissent rapidement faire la transition -même si les paradigmes sont fondamentalement différents-

Java est donc un compromis. Par exemple:

  • On a une syntaxe complexe à analyser (d’un point de vue informatique) mais le code a une structure très reconnaissable du premier coup d’oeil ("squint test").
  • Le langage supporte très peu d’implicites (ce qui est compilé EST ce qui est écrit!) mais certains pourront alors trouver le code "bavard"
  • …. (voir les nombreuses discussions sur les mérites et défauts de Java! -et bien réfléchir avant d’accepter les arguments des uns et des autres!-)

Les aspects génie logiciel ont largement pris le dessus sur les préoccupations liées à l’embarqué (non temps réél): Java se trouve adapté à de gros projets mené par de grandes équipes (éventuellement géographiquement réparties). Comme tout langage de programmation des utilisations "hors cadre" conduiront à des déconvenues en terme de maintenabilité et de performances matérielles ou économiques.

Moralité: penser en Java! pour réaliser en Java!

image: penser en java

On a ici deux concepts à traiter avec leurs spécifications propres et leurs interactions. Les deux parties de l’application peuvent être traitées par des programmeurs différents (situés à des endroits différents, avec des évolutions de codes suivant un rythme différent!).

De plus certains codes (comme "Client") peuvent être des composants réutilisables dans plusieurs applications.

Pourquoi Java?

Au risque de se répéter, tentons de lister les caractéristiques importantes du langage qui doivent orienter le choix de développement d’applications avec cette technologie:

  • Très large gamme de niveaux d’intervention. Permet de traiter des opérations de bas niveau (proches de la machine) et des abstractions de haut niveau définies par le programmeur.

    Avec ses objectifs initiaux qui étaient de piloter des matériels divers on a des points d’accès suffisamment proches de la machine … mais avec une petite indirection permettant d’assurer la portabilité (processeur "virtuel"). Si les comportements des types primitifs scalaires numériques (int, double,…) vous ont surpris vous devez comprendre qu’en fait vous avez manipulé une représentation proche des processeurs; cela permet des manipulations de données qui ne sont pas réservées à des applications de calcul.

    Un exemple d’opération sur une couleur:

    int couleur= .....
    //donne le rouge d'une couleur
    (couleur >> 16) & 0xFF;

    Parmi les comportements de relativement bas niveau la gestion du parallélisme est sophistiquée mais aussi très difficile à maitriser. Acquérir des compétences dans ce domaine sera nécessaire mais va demander du travail.

    Ceci dit il faut éviter d'écrire des codes de trop bas niveau en espérant gagner en performances. L’exécuteur (la "machine virtuelle") est dotée de ses propres mécanismes d’optimisation.

  • Portabilité. La philosophie profonde de java est qu’un code doit pouvoir être indépendant des plate-formes. Le même code doit pouvoir s’exécuter de la même manière sur différentes machines.

    Une partie de cette portabilité est assurée par les données de base (int, char, etc. portables) et par les logithèques (par exemple pour réaliser des interfaces graphiques indépendantes du système de fenêtrage).

    MAIS le programmeur doit aussi avoir un comportement responsable: s’il dit que le nom d’un fichier doit être C:\Program Files\monAppli il a violé les principes de portabilité!

  • Vision claire de la modularité. La répartition des rôles appelant/réalisant , l’encapsulation (limitation des accès à certaines parties du code), le découpage, les paradigmes (voir article wikipedia), … font de Java un langage adapté à de gros projets impliquant différentes équipes.
  • Clarté du code. Une fois qu’on est habitué aux structures du code la lecture devient rapide. Il y a peu d’implicites (tout doit être écrit explicitement au risque de donner un code "bavard"). La documentation est intégrée au langage: on peut générer des documents à partir du code source lui-même.
  • Très nombreuses logithèques standard pour des types d’applications très variées. De plus il existe de nombreuses passerelles avec des codes écrits dans d’autres langage de programmation.

En résumé: un langage professionnel dont la maitrise demande du temps et un certain investissement!

La documentation Java

images/orangebelt.png

Ouvrir avec un navigateur le fichier index.html situé dans le sous-répertoire docs ou se connecter à un site WEB : "comme http://docs.oracle.com/javase/10/docs/api/"

Les logithèques standard

Suivre le lien "Java Platform API Specification"

Le document présente une liste de modules (les blocs de logithèques que l’on peut utiliser dans un projet)

Visiter successivement:

  • Le module java.desktop (qui regroupe des logithèques pour réaliser des codes graphiques)
  • Dans ce module voir le package awt (un package est un ensemble de codes associés à un groupe de fonctionnalités: ici c’est ce qui concerne le Abstract Windowing Toolkit une forme - relativement - simple de mise en place d’interactions à base de fenêtres)
  • Dans ce package la classe Button (une classe "class" est l’unité de base du langage)

Si vous avez installé les sources (souhaitable!) allez dans le sous-répertoire src (là ou les sources ont été "dézippées")

Aller dans les sous-répertoires java.desktop puis java puis awt et lire Button.java

[Note]

Les sources de la documentation elle même se trouvent dans le fichier du code source Java! Pour documenter ce code source on ajoute des commentaires spéciaux et on les exploite ensuite avec l’outil javadoc