|
Cette appliquette Java tente d'illustrer les fonctionnalités de base qu'un éditeur vectoriel tel que ''Inkscape'' devrait posséder, selon moi, pour positionner mathématiquement les entités graphiques.
Je suis bien conscient qu'il y a pas mal à faire dans la partie mathématique et surtout interactive. Qu'importe, c'est un amusement, prenant je dois le dire, je n'ai pas de délai à satisfaire, je prends tout mon temps car, normalement, ce type d'application est plutôt pris en compte par une équipe de développeurs. Par ailleurs, je n'ai pas trouvé sur la toile un éditeur graphique de ce type, un peu conséquent, que je crois utile pour des écoliers comme il l'est pour mes jeunes petits-enfants. Ces derniers se prêtent très volontiers à l'expérience pour me faire corriger les problèmes à côté desquels je suis forcément passé.
Remarques :
| 1°) - | Dans un premier temps, j'ai suivi les conseils présentés dans les différents tutoriels sur Java et j'ai expérimenté tout naturellement plusieurs environnements de développement proposés comme Éclipse, NetBeans, JCreator. Je dois dire qu'ils m'ont donné, tous les trois, pas mal de boutons comme cela avait été le cas avec Code::Blocks pour le langage C/C++. Ces environnements pratiquent une telle inflation de fichiers, de répertoires tout en masquant les fonctionnements de base de Java que j'ai fini par tout virer pour n'utiliser que le JDK dans sa version basique : ignorant complètement appletviewer, ''javac'' et l'éditeur ''Notepad++'' me suffisent très amplement sans oublier bien sûr ''EasyPHP'' que j'utilise pour la mise au point de mon site local avant migration vers Free grâce à ''Dreamweaver 2 gratuit'' de 1997-1998 (!!!). Je m'en sors très très bien, aucun problème jusqu'ici, à chacun ses goûts !... |
| 2°) - |
L'appliquette proposée s'ajuste dynamiquement
à la taille de la fenêtre du navigateur à condition
de réactualiser à chaque changement la page qui l'appelle.
Pour la démonstration, le dessin est en mémoire. Une réactualisation
de la page réactualise l'appliquette. Les données seront
alors perdues. |
| 3°) - |
Mais,
mais... |
| 4°) - |
Juillet
2012 se dessine tout doucement... Encore, une fois de plus !... la compatibilité ascendante n'est pas assurée par les développeurs de Java et je ne sais pas combien de temps je vais perdre en recherche dans les documentations et les forums. Peut-être trouverai-je quelque chose du côté des animations pour traiter correctement le code de retour de la fonction si, toutefois, c'est un problème de synchronisation ? Après plus d'une semaine de tentatives infructueuses, je me suis résigné à abandonner l'usage de la méthode "drawImage" pour l'affichage des palettes de couleurs et de types de trait. Je les ai finalement explicitement dessinées dans la méthode "Affiche.java". La méthode est moins élégante, 20 fois plus de code, mais plus efficace. Cela n'a pas grande importance car l'appliquette ne met pas à disposition l'affichage d'images. Pour les télécharger, il faut entrer dans les procédures de signature que j'ai délibérément rejetées. |
Voici donc quelques explications qui ont, en quelques sortes, valeur de ''cahier des charges''.
I - Description sommaire de ses mots-clé dans l'ordre affiché (à réactualiser)
La mention √ indique que l'option est implantée complètement. La mention √(!) indique qu'elle l'est partiellement.
A voir la liste des combinaisons ..... il y a du boulot !...
Les mot-clés sont indiqués avec le bouton gauche de la souris
| • ''Fichier'' | : | est prévue pour manipuler les fichiers dessin.
Une solution que j'espère provisoire est proposée avec des
Copier/Coller.
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| • ''Point'' | : | manipule les points du dessin en appellant un sous menu :
|
√(!) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| • ''Droite'' | : | crée des droites et appelle un sous menu :
|
√(!) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| • ''Cercle'' | : | crée des cercles le plus intuitivement possible
en indiquant successivement (=> détails dans ''récapitulatif'') :
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| • ''Cercloïde'' | : | est prévue pour créer des courbes fermées
définies par les 4 points du quadrilatère circonscrit et
basées sur la génération de cercles (=> détails
dans ''récapitulatif'') :
|
√ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| • ''Courbe'' | : | création d'une suite de courbes Beziers carrées
définies par une suite de points de contrôles
|
√ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| • ''Texte'' | : |
crée et manipules des textes : |
√ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| • ''Attributs'' | : | manipule les attributs des entités et appelle
un sous menu :
|
√ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| • ''Sélection'' | : | appelle un sous menu :
|
√(!) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| • ''Effacer'' | : | appelle un sous menu :
|
√ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| • ''Coin'' | : | dessine un cercle joignant deux entités. Le cercle peut avoir un rayon nul (coin par défaut) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| • ''Chanfrein'' | : | dessine un chanfrein joignant deux entités. Le chanfrein peut avoir une longueur nulle (par défaut) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| • ''Relim'' | : | appelle un sous menu :
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| • ''Déplacer'' | : | déplace, à partir d'un point-pivot, les entités sélectées vers un autre point. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| • ''Copier'' | : | copie une entité ou une sélection d'entités de manière répétitive (par défaut =1), | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| • ''Echelle'' | : | applique un facteur d'échelle en abscisse et en ordonnée à une entité ou à toutes les entités d'une sélection. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| • ''Symétrie'' | : | effectue une symétrie d'une entité ou des entités sélectées par rapport à une droite, | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| • ''Rotation'' | : | effectue autour d'un pivot une rotation d'une entité ou des entités sélectées de manière répétitive (par défaut 1). | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| • ''Cote'' | : | permet de coter le dessin, | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| • ''Grille'' | : | permet d'afficher une grille et de modifier la présentation de l'appliquette, | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| • ''Info'' | : | affiche les caractéristiques d'une entité indiquée, | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| • ''Tout'' | : | affiche toutes les entités du dessin pour les rendre toutes visibles dans la fenêtre de visualisation, | √ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| • ''Cadre' | : | affiche pleine fenêtre de visualisation toutes les entités du dessin à l'intérieur d'un cadre ajustable, | √ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| • ''Centre' | : | affiche le dessin amenant un point-pivot de la fenêtre de visualisation en son centre, | √ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| • ''++' | : | affiche le dessin par incréments au point pivot indiqué, | √ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| • ''- -' | : | affiche le dessin par décréments au point pivot indiqué, | √ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| • ''Retour' | : | retour à l'opération interrompue, | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
II - Description de l'appliquette ''Dessin.class''
Quand la page Internet est chargée en mémoire du navigateur, le module complémentaire Java est activé à la rencontre de la balise <object> ou <applet> au moment de l'affichage de la page après son analyse. La main est donnée à la méthode ''init()'' de l'appliquette dont le nom figure dans le paramètre ''classid='' de la balise <object> ou le paramètre ''code='' de la balise <applet>. Puis, suivant les situations, le Noyau Java donnera la main à toutes les autres méthodes standard qui y sont codées.
Le principe de fonctionnement de l'appliquette est très simple. Il y a deux architectures envisageables décrites par les deux figures ci-dessous explicitant chacune un diagramme d'état particulier :
A - Technique distributive :

Dans l'architecture distribuée,
la logique est centrée sur un distributeur
(Dispatcher en anglais) ''Qu'es acò''
systématiquement appelé dès qu'un évènement
souris/clavier se produit. Ce distributeur va alors donner la main aux différentes
méthodes de l'application.
Dans tous les cas, quelque soit le niveau d'exécution,
les méthodes retournent au Noyau Java ce qui leur impose de gérer
des états leur indiquant à tout moment à quel niveau
d'avancement se trouve le traitement. C'est la partie la plus délicate
de la programmation.
B - Technique hiérarchique :

Dans l'architecture hiérarchique,
par une méthode ''att_even(e)'',
la logique est centrée sur une consultation
cyclique (Polling en anglais) d'un conteneur de variables initialisées
à chaque fois qu'un événement souris/clavier se produit.
Au lancement de l'appliquette, le Noyau Java
donne la main à la méthode ''init()''
qui appelle ''att_even()" en attente
d'un événement souris/clavier. C'est une entrée dans
le niveau 0 primaire de l'application.
Au premier événement, il y a détection
du mot-clé du menu primaire, ''Point'' par exemple. Le maillon du niveau
0 appelle alors à nouveau la méthode ''att_even(e)''
s'il y a un menu secondaire. C'est l'entrée dans le niveau
1.
Au premier événement, il y a détection
du mot-clé du menu secondaire, ''Points'' ou ''Sup. Pts'' ou ''Def.
Pts'' ou ''Division'' par exemple. La maillon du niveau
2 appelle à son tour la méthode ''att_even(e)''
s'il y a un menu tertiaire évidemment. C'est l'entrée dans le
niveau 2 tertiaire. Et ainsi de suite.....
C'est une gestion hiérarchisée de menus
de mots-clé.
C - Choix de la méthode :
| Technique distributive | Technique hiérarchique | |||
| – | fonctionnement asynchrone | – | fonctionnement synchrone | |
| – | toute option peut être abandonnée si l'utilisateur de ravise | – | pour revenir à une autre option, l'utilisateur doit suivre le chemin de retour pas à pas des mots-clé ''Retour'' si on veut éviter une programmation acrobatique | |
| – | Pas de possibilité de programmation récursive | – | possibilité de programmation récursive | |
| – | programmation pas trop difficile mais un peu délicate qui demande de la rigueur | – | programmation relativement facile | |
| – | assez bien adaptée aux principes de fonctionnement d'une appliquette Java | – | pas très adaptée aux principes de fonctionnement d'une appliquette Java |
L'appliquette ''Dessin.java'' présentée ici est réalisée suivant la technique distributive.
D - Description :
Le Noyau Java donne donc la main à la méthode ''init()'' de l'appliquette ''Dessin.java'' qui, après exécution, retourne au Noyau. Ce dernier gère tous les événements. Sur la sollicitation de la souris ou du clavier, les actions de déroulent comme suit :
| 1) - | le Noyau Java donne la main, si elle est codée comme c'est le cas ici, à la méthode standard, ''handleEvent()'' représentée, sur la figure du §A, par le rond central rouge dans lequel l'événement est reconnu et son traitement préparé, | |||||||||||||||
| 2) - | cette dernière appelle successivement :
|
|||||||||||||||
| 3) - | retour au Noyau Java en attente d'un nouvel événement souris ou clavier, | |||||||||||||||
| 4) - | reprise du cycle en 1) - |
Le diagramme de la figure montre le mot-clé ''Point'' (création d'un point) du menu primaire qui attend le choix de l'un des 4 mots-clé du sous-menu de niveau 1, ''Pt-Pt'', ''Def. Pts'', ''Sup. Pts'' ou ''Division''.
L'un des avantages de cette technique est de pouvoir à tout moment abandonner une option avant son terme si l'utilisateur se ravise.
L'appliquette décrite ici est représentée par la classe nommée ''Dessin.class''. Elle ne comporte que les méthodes standard suivantes parmi celles indiquées dans les conventions :
- la méthode ''init()'' pour l'initialisation et la mise en place de l'architecture du programme,
- la méthode ''paint()'' pour l'affichage dans la fenêtre de la page,
- la méthode ''handleEvent()'' pour la prise en compte des événements souris et clavier.
Cette classe appelle un certain nombre de classes-fille composant son architecture générale. Les classes qui gèrent les collections d'entités, Point, Cercle/Ellipse, Cercloïde, Courbe et Texte, sont construites suivant le même modèle ci-après :
| • | ''Modèle.class'' | : |
|
Liste les classes de la classe ''Dessin.class'' :
| • | ''Affiche.class'' | : | Cette classe contient la structure des
variables graphiques et la méthode qui prépare l'affichage
de l'image de l'appliquette en vue de l'appel à la méthode
''repaint()'' de réactualisation.
|
|||||||||||||||||||||||||
| • | ''Attributs.class'' | : | Cette classe ne contient que la méthode
qui porte son nom pour modifier les attributs d'une entité. Il
s'agit de la couleur, du type et de l'épaisseur du trait. Ces 3
attributs peuvent être aussi défini par une saisie au clavier.
|
|||||||||||||||||||||||||
| • | ''Cercles.class'' | : | Cette classe contient la collection d'entités Cercles/Ellipses qu'elle gère à l'aide des méthodes décrites dans ''Modèle.class'' ci-dessus : | |||||||||||||||||||||||||
| • | ''Cote.class'' | : | Cette classe contient les méthode de traitement des différents types de cotation du dessin. Elle sera traitée quand la partie dessin géométrique sera plus avancée. | |||||||||||||||||||||||||
| • | ''Courbes.class'' | : | Cette classe contient la collection d'entités Courbes qu'elle gère à l'aide des méthodes décrites dans ''Modèle.class'' ci-dessus : | |||||||||||||||||||||||||
| • | ''Droites.class'' | : | Cette classe contient la collection d'entités Droites qu'elle gère à l'aide des méthodes décrites dans ''Modèle.class'' ci-dessus : | |||||||||||||||||||||||||
| • | ''Fichier.class'' | : | Cette classe, vide pour le moment, est prévue pour gérer les fichiers de dessins crées par l'appliquette au travers des mots-clé ''Nouveau'', ''Ouvrir'', ''Sauver'' ou ''Sauver sous''. Pour éviter de signer l'appliquette, une solution de dépannage est proposée. Elle vaut ce qu'elle vaut !... | |||||||||||||||||||||||||
| • | ''Grille.class'' | : | Cette classe permet de définir les paramètres de définition de tracé d'une grille. Elle sera traitée quand la partie dessin géométrique sera plus avancée. | |||||||||||||||||||||||||
| • | ''Informations.class'' | : | Cette classe prépare l'affichage des informations de l'entité indiquée par la souris. Elle est appelée par la méthode ''Affiche.class''. | |||||||||||||||||||||||||
| • | ''MethMath.class'' | : | Cette classe contient toutes les méthodes
de traitement mathématique entre entités :
|
|||||||||||||||||||||||||
| • | ''Mots_Cle.class'' | : | Cette classe contient la collection de
mots-clé utilisés dans l'appliquette et les méthodes
de traitement qui s'y rattachent :
|
|||||||||||||||||||||||||
| • | ''Points.class'' | : | Cette classe contient la collection d'entités Points qu'elle gère à l'aide des méthodes décrites dans ''Modèle.class'' ci-dessus : | |||||||||||||||||||||||||
| • | ''Qu_es_aco.class'' | : | Cette classe ne contient qu'une méthode appelée par la méthode ''handleEvent()'' de l'appliquette ''Dessin.class'' pour analyser la position de la souris et donner la main à la méthode appropriée de traitement. C'est en gros la distributrice de tâches. | |||||||||||||||||||||||||
| • | ''Selection.class'' | : | Cette classe traite les différents aspects de la sélection d'entitée pour réaliser des traitements multiples d'entités. Les entités sélectées sont dessinées en marron. Cette classe affiche un sous menu comportant 5 options. | |||||||||||||||||||||||||
| • | ''Texte.class'' | : | Cette classe contient la collection d'entités Textes qu'elle gère à l'aide des méthodes décrites dans ''Modèle.class'' ci-dessus : | |||||||||||||||||||||||||
| • | ''Tracer.class'' | : | Cette classe contient les différentes
méthodes de tracés graphiques :
|
|||||||||||||||||||||||||
| • | ''Zoom.class'' | : | Cette classe contient les différentes
méthodes de traitement du zoom de l'appliquette :
|
|||||||||||||||||||||||||
III - Un peu de philosophie : loin de moi le désir de refaire le monde ...
... en comprenant que l'on ne soit pas d'accord avec moi !...
Si j'ai bien compris, il semblerait qu'il n'y ait que deux techniques pour réaliser une application tournant dans une page d'un site Internet :
Alors, pas d'état d'âme, si je veux avoir la possibilité de réaliser ce type de composant, il me faut apprendre le langage Java dans la perspective peut-être d'utiliser "Java Web Start" lorsque j'aurai, je l'espère, bien avancé mon appliquette actuelle. Cela semble être la meilleure solution.
Donc, j'adopte, j'y vais et..... j'apprends !...
Jusqu'à présent, l'écriture de cette appliquette de dessin a été très intéressante, amusante même. J'espère que ce sera encore le cas par la suite. Certes, le travail qu'elle génère est tout de même assez important. Mais je crois avoir une bonne expérience en langage C pratiqué depuis l'époque 1979-1980 ce qui, normalement, malgré une interruption de quelques années, devrait pas mal m'aider. Lire, analyser, écrire, réanalyser voire même récrire... qu'à cela ne tienne, cela fera partie de l'un de mes loisirs de bureau pour occuper les journées d'intérieurs.
Cependant, au cours de mes lectures de formation et de mes essais, je retrouve les mêmes impressions qui avaient été les miennes lors de la montée en puissance du langage C++. Ce dernier m'avait été imposé dans un projet et, s'il ne m'avait pas posé de trop gros problèmes, il m'avait toutefois donné quelques boutons !... (quelques remarques annexes ICI dans la page ''généralités'' de la rubrique Noyau Graphique d'Images Structurées).
La programmation orientée objet : Qu'es acò ?
Voilà une expression qui revient en boucle, à longueur de bouquins, à longueur d'articles comme si le fait d'en parler avec insistance devrait provoquer chez l'auditeur ou le lecteur une sorte de culpabilité à continuer d'utiliser ce qui est censé être déclaré comme non orienté objet. Alors pourquoi cette remarque ?
| Tout simplement parce que le monde vit dans un environnement orienté objet depuis la nuit des temps, même depuis le big-bang il y a 14 milliards d'années !... |
On en parle comme si c'était une révolution alors que l'expression est apparue il y a plus d'une quarantaine d'années accompagnée d'un vocabulaire surévaluant des notions déjà existantes à l'image d'un instituteur qu'on appelle un professeur des écoles, une caissière, une hôtesse de caisse, une femme de ménage, une technicienne du nettoiement sans forcément provoquer l'effet escompté. Mais en fin de compte, pourquoi pas après tout ?...
Qu'est-ce donc un objet en informatique
? Eh bien... ce que tout le monde connaît ... sans même s'en rendre
compte, c'est à dire une structure de données décrites
par des ''attributs'', et par ''un ensemble d'actions'' qui s'appliquent
sur cette structure, le tout moulé dans un moule que l'on appelle un
''programme'', une ''fonction'' (en Java une ''classe'').
Il s'en suit une prolifération de vocables pour parfaire la définition
et les objectifs à atteindre, typage, héritage, polymorphisme,
encapsulation, constructeur, itérateur, etc... vocables parmi lesquels,
à lire les forums, beaucoup et moi avec, se perdent. Mais cela doit faire
pas mal dans les discussions de salon durant lesquelles on enfonce très
souvent des portes ouvertes.
Le langage est fortement typé : bien ! mais
alors à quoi sert-il de sortir, à la compilation, par exemple
le message d'erreur ''variable may be not initialized''
alors que le compilateur n'est pas en mesure d'analyser la logique d'exécution
du programme. Cette erreur contraint à de fausse initialisations inutiles.
Pourquoi pas, à la rigueur, ne pas sortir un message d'alerte (warning)
tout au plus ?
Mais, finalement, quoi de plus simples que les objets ci-après compréhensibles même par de jeunes enfants :
| le nom de la classe | Voiture | Soleil | Maison |
| les attributs |
nombre de places |
étoile naine jaune |
nombre de pièces |
| les méthodes |
démarrer |
chauffer |
abriter |
Certes, il n'est pas question de réexposer la POO, il y a tout ce qu'il faut sur la toile et assurément, mieux expliqué que je pourrais le faire mais on prétend qu'il n'est pas possible d'appliquer ce concept de programmation en langage C ce qui me paraît fort étonnant. Dans mes lectures sur Java, il est expliqué que sa grande force est d'éviter aux programmeurs les ''tracas'' (!!!) causés, principalement, par les deux points qui me touchent tout particulièrement et qui font la grande force des compilateurs qui les ont adoptés (Pascal, PL/1, Fortran 95 entre autres) :
Par ailleurs, j'ai cru comprendre aussi que Java était écrit en C, et pour cause... les pointeurs et les allocations dynamiques de mémoire incontournables du langage C. Ce dernier est faussement appelé langage car c'est, en réalité, un assembleur évolué portable qui ne sait travailler qu'en mémoire et qui n'a donc que les fonctions système ou utilisateur pour communiquer avec l'environnement de la machine. Son taux d'expansion est très faible en comparaison de celui des autres langages comme le C++, le Fortran, le Pascal, le PL/1, le Cobol, pour ceux que j'ai pratiqués.
|
Quant au reste, je n'ai ressenti aucun dépaysement puisque le traitement événementiels (incontournable dans mon appliquette), la syntaxe et la structure du programme sont très proches de celui et celles que je connais en C.
Peut-être me reprocherait-on d'avoir écrit mon appliquette en Java comme je l'aurais écrite en C ?
La machine virtuelle Java : Qu'es acò aussi ?
Le concept de machine virtuelle
pour Java est judicieux car il a permis à Sun de placer son produit sur
le marché d'une manière élégante. Le compilateur
Java produit du ''byte code'', un pseudo-code
machine qui est interprété par un programme, le JVM,
implanté sur chaque plate-forme. Ce ''byte code'' étant composé
d'instructions binaires à l'image des réelles permet un traitement
plus rapide et un module exécutable plus condensé.
Pour mon appliquette, qui se limite à
l'illustration d'un propos, je disais que le dessin créé n'était
pas sauvegardé suivant une procédure normale. En effet, il
est interdit, pour une appliquette, d'écrire sur le disque dur du client
pour des raisons de sécurité. Or, une machine virtuelle, par excellence,
reproduit dans son intégralité, les réactions physiques d'une machine réelle.
Elle doit donc pouvoir écrire sur un disque. Le concept de machine virtuelle me
parait donc un peu abusif pour ne pas dire usurpé.
Si toutefois, on désire néanmoins
avoir accès aux ressources de la machine cliente, il faut signer l'appliquette
en créant un certificat pour lequel on demande l'approbation de l'utilisateur.
Et là, si elle est accordée, grosse surprise, l'appliquette semble
avoir accès à l'intégralité
des ressources, en particulier, celle du disque dur.
Mon propos n'est pas une critique, je n'en
ai pas le niveau, je prends bien volontiers ce que l'on me donne ici, sans pouvoir
faire autrement mais j'avoue que la notion de ''Bac
à Sable pour Java'' m'avait fait pressentir une solution intéressante.
Dommage !... A la lecture de quelques articles sur le sujet, le modèle
de sécurité Java peut laisser sceptique car le concept de bac
à sable, je cite :
- « est représenté par un ou plusieurs domaines de sécurité, »
- « représente l'ensemble des permissions accordées à une application par le système hôte, »
- « sa configuration est de la responsabilité de l'administrateur du système hôte. »
Cela fait beaucoup de choses
pour gérer la sécurité et c'est compliqué. Personnellement,
vu les attaques dont Java est la cible, cela ne m'incite pas à donner
mon approbation, même à des sites dits de confiance.
A l'image de l'hyperviseur de machine virtuelle
VM/CMS d'IBM sur lequel
j'ai travaillé pratiquement toute ma carrière depuis 1972-1973,
je voyais plutôt un espace de confinement
c'est à dire un espace complètement hermétique
dans lequel une machine virtuelle pouvait travailler à sa guise sans
absolument aucun moyen d'en sortir. Par contre, cet espace de confinement
serait accessible librement en lecture et en écriture par l'utilisateur
qui en est quand même le seul propriétaire et aucun certificat
serait nécessaire.
Cet espace de confinement n'est pas autre chose qu'un disque virtuel.
J'avais tout simplement faussement imaginé que le
bac à sable était cet espace de confinement, ce disque ''dur''
virtuel, un répertoire alloué à Java lors de son installation.
Après, dans ce disque virtuel, la protection entre appliquettes aurait
été le problème du module complémentaire Java et
non pas celui d'un administrateur quelconque.
Cette vision ne paraît plus judicieuse mais
peut-être n'est-elle pas suffisamment globale en Java et suis-je peut-être
resté sur une philosophie somme toute assez ancienne ?...
Il est dit qu'une appliquette ne
peut lire et écrire que dans
des fichiers du répertoire sur le serveur qui l'héberge. Mais,
là aussi, il faut la signer !...
Que c'est étrange
!... Du côté serveur, comme du côté client,
l'appliquette fonctionne déjà dans un espace de confinement au
sens que je viens d'expliquer. Ce sont le serveur JAVA lui-même
côté hébergeur d'une part et le module complémentaire
JAVA lui-même du navigateur côté client. Ce sont eux qui
interdisent les accès d'un côté comme de l'autre. Ils
sont les seuls garants de la sécurité. Ils pourraient donc
gérer avec la même sécurité un espace de confinement.
A la limite, même si l'utilisateur client chargeait dans l'espace de confinement
un fichier contaminé, tout au plus, ce serait l'appliquette qui en subirait
les dommages sans risque de propagation vers l'ordinateur : c'est
la caractéristique fondamentale d'une machine virtuelle,
« on doit pouvoir y faire tout
ce que l'on veut, l'arrêter n'importe quand, la relancer, faire des essais,
la planter, etc... sans inquiéter l'hyperviseur sinon ce dernier possèderait
d'énormes failles ». Durant mon activité d'ingénieur-système,
toutes les nouvelles versions du système VM/CMS
était en très grandes parties testées dans une machine
virtuelle du VM/CMS en
exploitation. La fantastique qualité de ce système avait permis
de planter et replanter les VM virtuels en test sans que le VM d'exploitation
ne bronche un seul instant. C'est peut-être arrivé trois ou quatre
fois en 30 ans, pas sur des défaillances du système mais plutôt
sur des erreurs de nos manipulations !...
Mais si on signe une appliquette comme cela
est préconisé, celle-ci a accès à toutes les ressources
du client contrairement à un espace de confinement. Pour moi, si j'ai
bien compris, une signature c'est transformer son ordinateur en ''vraie
passoire''....
Une dernière remarque :
Lors de mes tentatives d'utiliser une BD SQL, pour se connecter, au serveur,
il faut tout naturellement fournir un ''userid'' et un ''password''
qui... transitent sur le réseau (ce n'est pas le cas en PHP dont les
applications tournent sur le serveur lui-même). Certes, la possibilité
n'est pas à la portée de tout le monde, pas même de moi,
mais un collègue toujours en activité, à l'aide d'un ''passeur''
(programme analyseur de réseau), m'a montré dans les dumps des
transactions, des informations en clair qui ressemblaient étrangement
à des ''userid'' et des ''password'' !... Que faut-il
en penser ? Si c'est la même chose avec les transactions JAVA,...
« Bonjour la sécurité » avec tout les ''plats''
qu'on en fait !...
Ma conclusion
: provisoire bien sûr, elle n'engage que moi !
Le concept de machine virtuelle
Java me paraît donc assez abusif, dans l'état actuel des choses.
J'ai tendance à penser que c'est plutôt un « Super
Shell » compilé qui produit du ''byte code'' comme
pourrait en produire tout fichier de commandes, tout compilateur du marché
même si Java a ses spécificités.
Je comprends très aisément
qu'une éventuelle option ''byte code'' d'un compilateur aurait
eu beaucoup moins d'impact commercial et beaucoup moins d'impact de notoriété
que la notion de machine virtuelle avec tout le vocabulaire qui l'accompagne.
Si j'avais une comparaison à faire sous la forme d'une boutade... je
dirais que JAVA est comme une voiture ''suréquipée'' qui possède
beaucoup de choses dont on n'a guère besoin. Certes ça ne coûte
pas plus cher mais ces équipements superflus risquent de causer beaucoup
d'ennuis, pannes qu'il faut corriger surtout à la revente, consommation
supplémentaire, mauvaise empreinte écologique pour toutes les
matières premières travaillées à leur fabrication,
etc... et surtout, pas du tout indispensables au fonctionnement nominal du véhicule.
Dommage que les concepteurs du langage JAVA n'aient
pas repris les fondamentaux du langage C (pointeurs, allocation dynamique de
mémoire, gestion des tableaux de structures). Les détracteurs
de ces fonctionnalités ne sont nullement obligés de les utiliser.
Pourquoi donc avoir imposé cette vision aux autres ? De toute manière,
à ce que j'ai pu constater, la majorité des sources Java que j'ai
pu observer sont illisibles, souvent non documentés ou documentés
sans l'effort, à la ''va-vite'' car considérés comme superflus.
On peut plaindre alors les éventuels repreneurs !...
A ce stade de mise au point de mon appliquette
qui représente déjà pas mal de code, je pense pouvoir dire
que le langage n'est pas très bien adapté à ce que je voulais
faire mais... comment opérer si l'on veut que cela
fonctionne dans une page Internet ? ... je continue
donc et je m'adapte, mon opinion pourrait très bien changer par la suite.
Au final, si j'avais à réaliser
un projet important, hors Internet, je ne suis pas sûr que je choisirais
ce langage surtout pour certaines positions ridicules et dogmatiques de ses
promoteurs concernant certains aspects du langage C non reconduits comme le
''goto'' entre bien d'autres, irremplaçable
dans pas mal de situations même si, en théorie seulement,
on peut s'en passer mais que l'on doit utiliser, j'en conviens, avec parcimonie
et intelligence. D'ailleurs, ces promoteurs se gardent bien de dire, qu'en
réalité, les instructions ''continue
[étiquette]'' et ''break [étiquette]''
sont de magnifiques ''goto'' dissimulés
pour se sortir de situations assez difficiles dans des boucles imbriquées
par exemple.
|
De mon humble point de vue, le langage C reste encore le langage le plus efficace, sans fioriture. Désolé pour ceux qui ne sont pas d'accord, il permet tout à fait la proprammation orientée objet, beaucoup plus l'affaire d'une tournure d'esprit que celle d'un compilateur. Que fait-on de l'exécution orientée objet ? bouche cousue ? Le noyau stratégique d'Androïd, par exemple, écrit en Java reste encore à prouver !... Il ne semble avoir lu que c'est un noyau Linux, donc écrit en C, qui permet de supporter des applications Java. Plus
j'avance dans l'utilisation de Java, à moins qu'on m'en prouve
le contraire, ce langage reste pour moi un Ersatz
psychédélique du langage C à voir les
positions dogmatiques de leurs promoteurs. Il faut voir ce qu'il faut
faire pour assurer des fonctions aussi simples que celle d'afficher, dans
une pixelmap graphique, un texte d'une certaine taille de lettres et faisant
un angle donné avec l'horizontale !... À quand donc un système
Unix/Linux écrit en Java ? |
--ooOoo--