Le concept Java CHAPITRE 1 Java 9 eivd 1.1 Télécommunications mjn Idée de base Java est une technologie qui prend sa source dans le World Wide Web, et qui est née dans les bureaux de développement de Sun Microsystems. L’idée de Java est de mettre à disposition des usagers d’un réseau non plus simplement des informations sous forme de pages HTML, comme le fait le Web, mais d’offrir à tout un chacun des applications téléchargeables. Dans un milieu hétérogène, ce but est difficile à atteindre en raison de la multiplicité des systèmes d’exploitation, CPU, etc... rencontrés sur le réseau. L’idée poursuivie par Sun Microsystems est de combiner un navigateur Internet avec une machine virtuelle. Cette idée est suffisamment mûre pour que tous les principaux éditeurs de logiciels aient immédiatement pris le train en marche1. 1.1.1 Principe de Java Java est un langage de programmation destiné à une utilisation sur une machine virtuelle (donc, sans existence physique). Sa syntaxe se fonde très fortement sur C++, dont il est par ailleurs un sous-ensemble par certains aspects, alors que d›autres caractéristiques du langage sont réellement originales. Un navigateur Internet supportant Java peut télécharger un programme Java situé sur un serveur HTTP et l’exécuter localement. FIGURE 1.1 Principe de Java en conjonction avec HTTP Serveur HTTP Viewer HTTP (p. ex. Netscape) Applications téléchargées Machine virtuelle JAVA NETWORK Un navigateur capable d’interpréter du code Java détecte automatiquement la présence d’un hyperlien Java, et active la machine virtuelle Java (MVJ) locale. Le code Java se pré1. Actuellement, ces éditeurs sont essentiellement (hormis Sun Microsystems) Netscape Communications, IBM, HP et quelques autres. Même Microsoft, bien qu’avec nombre de réticneces, se voit forcé d’adhérer, du bout des lèvres, à Java. 10 Java eivd Télécommunications mjn sente sous la forme de pseudo-code (bytecode), similaire à certains métacodes utilisés dans les années 80 pour des langages de programmation pour micro-ordinateurs (UCSD Pascal pcode, par exemple). L’intérêt de ce principe est que l’application peut s’exécuter indépendemment de la machine client, et que le serveur est de ce fait assuré de pouvoir mettre à disposition une application sans avoir à connaître le client qui va l’exécuter, par opposition aux systèmes conventionnels, où il est nécessaire de mettre à disposition plusieurs versions d’un applicatif. Ces applications téléchargeables se nomment des applets, en langage Internet. Les applets sont de “petites applications1”, idéalement monolithiques, qui s’exécutent dans le cadre d’une page Web. Une applet est exécuté à partir d’un hyperlien HTML, dont la syntaxe est la suivante : <applet standard-attributes> applet-parameters alternate-contents </applet> Nous reviendrons sur cette syntaxe plus loin dans cet ouvrage. La signification de l’acronyme Java reste assez mystérieuse. L’explication selon laquelle Java signifierait simplement “Just Another Vague Acronym” semble la plus probable... Quelques étudiants de l’EIVD, chargés dans le cadre d’un travail personnel d’étudier le langage, ont proposé “J’Ai Vite Appris”; que chacun critique cette interprétation à la fin de ce cours. A l’origine destiné principalement aux applications client, donc à la fabrication d’applets, Java a peu à peu grignoté une part significative du marché des applications à part entière. L’élégance du langage associée à sa portabilité sur diverses plate-formes et divers systèmes de fenêtrage (Mac, Windows, X11) encouragent les éditeurs ne disposant pas d’un système d’exploitation propriétaire à porter leurs applications phares sur Java, et surtout à développer de nouvelles applications entièrement en Java. Par ailleurs, diverses extensions du langage (servlets, Java Server Pages, etc...)ainsi que l’orientation clairement réseau de l’environnement de développement font de Java une alternative intéressante aussi au niveau des applications serveur. On peut donc dire que Java, du langage de niche qu’il était à son origine, uniquement justifié dans un environnement Internet, s’est aujourd’hui avéré un langage tout à fait universel. 1.1.2 Motivations à la base de Java Il est toujours intéressant de faire un rapide retour en arrière, lorsque l’on étudie une technologie ou un procédé, de manière à mieux comprendre les motivations ayant conduit à faire certains choix plutôt que d’autres. Il en va ainsi de Java, qui à l’origine n’était pas prévu 1. Dans les milieux francophones, le terme a reçu plusieurs traductions, dont appelettes ou appliquettes. L’unanimité ne semblant pas près d’être réalisée, nous conserverons ici le terme anglo-saxon, en le considérant comme féminin (à l’instar du mot “application”). N’en déplaise aux puristes... Java 11 eivd Télécommunications mjn pour être utilisé dans le cadre où on l’utilise actuellement. En fait, l’équipe ayant developpé Java (anciennement appelé Oak, jusqu’à ce qu’on s’aperçoive que ce nom était protégé), avait reçu pour mission de développer un langage destiné au développement de logiciels pour des appareils électroniques portables. Le cahier des charges du langage reflétait ce but : le langage devait être • simple • s’appuyer sur une base connue • utiliser peu de place mémoire • produire du code d’une stabilité à toute épreuve Les deux premières clauses servaient à minimiser les coûts de développement. Un langage simple, et semblable à un langage déjà connu devait assurer la disponibilité rapide de programmeurs performants pour ce langage. D’autre part, un système portable doit consommer peu et être petit, ce qui limite la quantité de mémoire utilisable. Enfin, ce type d’appareil est utilisé dans des circonstances très variables, et il vaut mieux que le code produit ne soit pas (ou aussi peu que possible) sujet à des erreurs de gestion de mémoire, mémoire par ailleurs limitée pour les raisons précédemment citées. Le projet Java, conduit chez Sun Microsystems, ne put finalement jamais aboutir au résultat escompté. Le groupe de développement responsable de Java fut progressivement dissous, et le projet allait être abandonné lorsque l’un des membres rescapés du groupe eut l’IDEE. Java pouvait être un outil pour la programmation interactive sur le Web. La légende veut que l’auteur de cette idée développa en un week-end un navigateur compatible Java, et le présenta à Sun, qui investit dans l’idée. En quelques mois fut developpé le premier “browser” pour Java, appelé HotJava. Ce navigateur fut présenté officiellement le 23 mai 1995; cette date est à considérer comme une date marquante dans l’histoire d’Internet et du World Wide Web. Même avec le peu de recul dont nous disposons actuellement, cette date peut d’ores et déjà être considérée comme significative pour l’informatique et les télécommunications en général. Sun Microsystems eut le mérite de proposer d’emblée un environnement de développement gratuit, se fondant sur les expériences positives que AT&T avait faites à l’origine avec UNIX. Le succès de Java fut, et reste rien moins que foudroyant; malgré quelques défauts (lenteur, gourmandise en ressources, compatibilité entre versions successives...) la qualité du concept Java continue à faire chaque jours de nouveaux adeptes; le marché émergeant de la mobilité (GPRS, UMTS) fournit au concept Java de nouvelles opportunités de montrer ses qualités; dans cette même optique, les aspects "sécurité" implantés dans le langage Java sont très intéressantes pour le téléchargement de code, surtout quand on ignore (comme c’est fréquemment le cas lorsque l’on navigue sur Internet) la provenance du code que l’on est en train d’exécuter... 12 Java eivd 1.2 Télécommunications mjn La réalisation de java Le challenge constitué par la création d’un langage utilisable sur le Web est formidable! Le Web est composé de centaines de milliers de machines, formant une galaxie de noeuds de réseau disparates évoluant eux-même dans un environnement de périphériques hétérogènes et totalement incompatibles. Vouloir unifier cette galaxie à l’aide d’un langage de programmation tient de la gageure, voire de l’illusoire. De fait, Java ne parvient que partiellement à ce but; ce qui n’enlève en réalité rien à l’exploit. Java permet d’exécuter des applications sur la très grande majorité des systèmes raccordés à Internet. 1.2.1 La notion de machine virtuelle L’idée à la base de la réalisation de Java consiste à réaliser une machine virtuelle. Une machine virtuelle est une notion bien connue des concepteurs de microprocesseurs, qui émulent la puce à construire à l’aide d’une simulation logicielle. Ceci leur permet de détecter d’éventuelles erreurs de conception très tôt, avant même la première génération de masques permettant la fabrication de la puce finale. Il est possible d’implanter, de manière logicielle, une simulation d’une machine quelconque sur une autre machine, même si elle est très différente architecturalement de la machine à émuler. Cette démarche n’est pas originale : de nombreux éditeurs de logiciels l’ont empruntée, le plus célèbre ayant écrit un émulateur Intel 803861 sur des machines Macintosh (processeur Motorola 68000), SOLARIS (processeur SPARC), HP-UX (processeur HP_PA) et nombre d’autres. Sun Microsystems a suivi la même démarche, mais pour inventer un processeur virtuel, la Java Virtual Machine (JVM). Notons au passage que le code de l’application devant s’exécuter sur une machine virtuelle doit être compilé pour la machine virtuelle : il ne s’agit donc pas de code interprété, car la machine virtuelle exécute un code qui pour elle, est “natif”. En revanche, la machine elle-même est en quelque sorte interprétée; pour cette raison, et pour simplifier la terminologie, nous parlerons de “code interprété” pour du code s’exécutant sur une machine virtuelle. Une machine virtuelle a de nombreux avantages. Il est (semble-t-il) facile de la rendre sûre par rapport au système d’exploitation qui l’abrite, car on peut se permettre de lui imposer les limitations adéquates. On peut ainsi interdire à cette machine virtuelle d’utiliser l’espace d’adressage de la machine réelle en contrôlant les mécanismes d’adressage des objets en mémoire. Pour rendre le système encore plus sûr, on peut interdire à cette machine toute utilisation de ressources externes autres que celles implantées de manière native dans la machine virtuelle. La machine virtuelle Java remplit tous ces critères, et nombre d’autres encore. Mais il y a forcément un prix à payer (la gratuité devient de plus en plus chère, de nos jours...), et c’est dans les performances des applications s’exécutant sur cette machine qu’il faut rechercher ce 1. Le produit en question est mieux connu sous le nom de SoftWindows. Java 13 eivd Télécommunications mjn prix. Une machine virtuelle est simulée par une machine réelle, et ne peut donc en aucun cas parvenir aux mêmes performances qu’une application dite “native”. Le processus de simulation de la machine prend en effet du temps, d’autant plus de temps que l’on introduit de sécurités d’accès de la machine virtuelle aux ressources (mémoire essentiellement) de la machine réelle. La pénalisation est d’autant plus sévère que la machine virtuelle ne dispose - par construction - que de registres virtuels, émulés par des positions dans la mémoire physique de l’ordinateur hôte. Il est de ce fait parfaitement vain de vouloir optimiser un programme devant s’exécuter sur une machine virtuelle : l’optimisation consiste surtout à éviter les accès mémoire sur un système moderne, et ceci est pratiquement impossible sur une machine virtuelle, car le CPU est en mémoire! Il existe pourtant quelques espoirs d’amélioration de la situation. On parle couramment, actuellement, de compilateurs natifs, de compilateurs de bytecode, ou encore de compilateurs JIT (Just In Time compiler). Ces diverses technologies permettent toutes de gagner un facteur important de vitesse (parfois même de rivaliser avec du code natif), mais sont encore, à l’heure actuelle (1999) souvent immatures. De plus, les machines virtuelles interprétant le bytecode ont fait d’énormes progrès, et les programmes Java deviennent tout à fait utilisables sans toutefois encore rivaliser avec un homologue C++. 1.2.2 Les compilateurs natifs Une des solutions consiste à utiliser un compilateur natif, traduisant directement le langage Java en un programme exécutable par le processeur de la machine. Le programme ainsi produit n'est plus portable dans un environnement différent. Cependant, le programme source reste portable en théorie, du moment qu'il existe également un compilateur natif dans les autres environnements. Cette solution présente toutefois deux inconvénients. Le premier a trait à la distribution de l’application : le code produit par le compilateur n'étant plus portable, il faut en distribuer autant de versions différentes de l'application qu'il y a de systèmes cibles. En clair, si l'application doit tourner sur PC et sur Macintosh, il faudra que le support employé pour la distribution (par exemple un CD-ROM) contienne les deux versions. Le deuxième inconvénient n'est pas inhérent à l'utilisation d'un compilateur natif, mais il est beaucoup plus grave. En effet, il peut arriver que le concepteur du compilateur soit tenté de se simplifier la tâche en demandant à l'utilisateur d'apporter quelques légères modifications à son programme. Dans ce cas, c'est tout simplement la portabilité des sources qui est remise en cause. Donc, avant de se décider à choisir un compilateur natif, il faut impérativement vérifier s'il est compatible avec un programme "Pure Java" sans aucune modification. Cette certification n’est à l’heure actuelle possible que par le biais des spécifications de Sun Microsystems. 1.2.3 Les compilateurs de bytecode Une autre approche, pour améliorer la vitesse d'exécution des programmes Java, consiste à compiler le bytecode dans le langage du processeur de la machine cible. De cette 14 Java eivd Télécommunications mjn façon, la portabilité est préservée jusqu'au niveau du bytecode, ce qui peut être suffisant dans bien des cas. Il reste alors à assurer la diffusion du code compilé en autant de versions qu'il y a de systèmes cibles. Cette approche est satisfaisante pour la diffusion d'applications vers des systèmes cibles connus. Une alternative est d’intégrer le compilateur de bytecode au programme d’installation du logiciel : on ne distribue alors que les différentes versions du compilateur. En particulier, la diffusion sur support physique (CD-ROM, par exemple) se prête bien à ce type de traitement. En effet, choisir un support physique implique généralement de connaître le système cible, car il faut s'être assuré que celui-ci est bien capable de lire le support physique. Ainsi, la diffusion d'une application pour PC et Macintosh implique d'utiliser un format de CD-ROM hybride pouvant être lu dans ces deux environnements. Si un compilateur de bytecode existe pour chacun d'eux, cela peut constituer une solution satisfaisante. Il peut s'agir d'un compilateur, fonctionnant dans l'un des environnements, ou même dans un environnement totalement différent, et produisant du code natif pour l'environnement cible; on parle alors de cross-compilation. 1.2.4 Les compilateurs JIT (Just In Time) La solution précédente présente un inconvénient majeur si l'ensemble des environnements cibles n'est pas connu. Par exemple, si l’on crée une application devant être diffusée sur Internet, on souhaitera que celle-ci fonctionne sur tous les environnements compatibles Java, présents et à venir. Dans ce cas, la compilation du bytecode à la source (par le programmeur) n'est pas une solution envisageable. Les compilateurs JIT (Just In Time) sont supposés résoudre ce problème. Un compilateur JIT fonctionne sur la machine de l'utilisateur. Il compile le bytecode "à la volée", d'où l'appellation Just In Time - Juste à Temps. Généralement, l'utilisateur peut choisir d'activer ou non le compilateur JIT. Lorsque celui-ci est inactif, le programme est exécuté par la machine virtuelle. Dans le cas contraire, le programme en bytecode est compilé dans le langage du processeur de la machine hôte, puis exécuté directement par celui-ci. Le gain de temps d'exécution est évidemment compensé en partie par le temps de compilation. Pour un programme s'exécutant de façon totalement indépendante de l'utilisateur, ou un programme ne s’ exécutant qu’une seule fois, le gain peut être nul. En revanche, pour un programme interactif, c'est-à-dire attendant les actions de l'utilisateur pour effectuer diverses opérations, le gain peut être substantiel, car le compilateur peut fonctionner pendant que l'utilisateur consulte l'affichage. Pour un gain maximal, il faut cependant que le programme soit conçu de telle façon qu'il soit chargé dans sa totalité dès le début de l'utilisation afin de pouvoir être compilé en arrière-plan. En effet, Java est conçu pour que les classes nécessaires au fonctionnement du programme soient chargées selon les besoins, cela afin d'optimiser ainsi les temps de chargement sur Internet en ne transmettant que les portions de code effectivement utilisées. Java 15 eivd Télécommunications mjn Par contre, pour bénéficier au maximum des avantages d'un compilateur JIT, il faut autant que possible que le code soit téléchargé à l'avance afin d’être compilé, et cela sans savoir si elles seront réellement utilisées. L'usage d'un compilateur JIT lorsque les classes sont téléchargées à la demande se traduit le plus souvent par un faible gain de vitesse, voire parfois un ralentissement de l'exécution. L’utilisation de classes comprimées (fichiers JAR) peut en partie compenser cet inconvénient. 1.2.5 La machine virtuelle Java Pour qu’un système informatique puisse exécuter un programme Java, il faut et il suffit qu’il implémente la machine virtuelle Java (Java Virtual Machine JVM). Cette machine est généralement intégrée dans un browser Internet comme Netscape 3, par exemple. De par sa destination originale, la machine virtuelle a été conçue pour être de petite taille, si bien qu’elle n’encombre pas excessivement les navigateurs par ailleurs surgonflés d’extensions diverses. La machine virtuelle exécute le code Java qui est, comme on l’a vu précédemment, un code binaire, compilé. Ce code est appelé généralement Bytecode. Chaque instruction est codée sur 8 bit, et peut prendre 0 ou plusieurs opérandes. Ce code est généré par le compilateur Java à partir d’un fichier source pour produire un ou plusieurs fichiers Java exécutables. Il en résulte la structure illustrée à la figure 1.2, page 16 pour les applications écrites pour la machine virtuelle Java. FIGURE 1.2 Machine virtuelle Java et applications Java WEB BROWSER (Netscape, Internet Explorer, ...) JAVA virtual machine (JVM) Applications Java Système d’exploitation local (NT, Mac, UNIX, etc...) L’évolution très rapide de Java fait que l’on a tendance actuellement (Sun, Apple, par exemple) à considérer que la JVM doit plutôt être sortie du cadre du browser Internet et intégrée au système d’exploitation : cette modification fait qu’une application Java peut être exécutée en dehors du cadre d’Internet, et Java devient ainsi un langage de programmation à part entière. 16 Java eivd 1.2.6 Télécommunications mjn L’architecture de la machine virtuelle Java La machine virtuelle Java (JVM) est une machine 32 bit, pouvant de ce fait adresser jusqu’à 4 GB de mémoire. Cet espace mémoire comprend l’espace d’adressage des méthodes (la zone où l’on va stocker le programme application), la pile, et la zone de mémoire dynamique. La MVJ ne dispose que de trois registres, contrairement à la tendance RISC, et travaille essentiellement avec la pile. Toute opération sur des variables est effectuée au travers de la pile. Cette architecture défavorable dans le cas d’une machine physique est particulièrement bien adaptée à une machine virtuelle, et contribue à la simplicité de la MVJ. La MVJ dispose comme principale originalité d’un “garbage collector” (littéralement “collectionneur de déchets”, parfois appelé ramasse-miettes) qui gère les objets dynamiques en mémoire. Contrairement à la plupart des langages où le programmeur doit s’inquiéter de la gestion et de la destruction des objets que son programme crée en cours d’exécution, la MVJ conserve la trace de tous les objets ayant été crées et détruit automatiquement les objets n’étant plus référencés par l’application. Pour être réellement efficace, cette technologie doit également restructurer périodiquement la mémoire pour éviter l’apparition d’un trop grand nombre de “trous”, c’est-à-dire de zones mémoire libres, mais inutilisables parceque trop petites. Ainsi, même si un programme libère globalement autant de mémoire qu’il en a occupée, l’effet de fragmentation de la mémoire peut aboutir à une impossibilité d’allocation d’un nouvel objet parcequ’il n’existe pas assez de mémoire contigüe pour placer cet objet. Le garbage collector évite cet effet en redisposant les objets en mémoire de manière à combler les trous. Pour pouvoir intervenir efficacement, il est nécessaire de disposer d’un mécanisme permettant de mesurer la fragmentation, et de déclencher le processus de restructuration lorsque cette fragmentation paraît devenir critique. L’opération effectuée par le garbage collector a l’avantage de libérer le programmeur de bien des soucis, et de protéger les applications contre le phénomène de fragmentation de la mémoire. Cette opération a en revanche l’inconvénient de ralentir encore davantage l’exécution de l’application, surtout au cours de la réorganisation automatique de l’espace mémoire, opération qui peut intervenir à n’importe quel moment, sans que l’application puisse se prémunir contre cette intervention. Les applications nécessitant un comportement déterministe relativement au temps sont donc difficilement implémentables en présence d’un tel mécanisme. Java 17 eivd 1.3 Télécommunications mjn Caractéristiques de Java Les caractéristiques de Java découlent directement du concept qui a été à la base de son développement. Sun Microsystems résume les qualités de Java de la manière suivante, toute modestie mise à part : Java est un langage simple, orienté objets, distribué, interprété, fiable, sécurisé, indépendent de toute architecture, portable, de haute performance, multithreaded et dynamique. Il convient de toujours garder à l’esprit que l’auteur de cette phrase est interessé à la propagation du produit ! 1.3.1 La simplicité de Java Java se base sur C++ : quiconque sait programmer en C++ peut en moins d’un jour écrire une applet Java non triviale. Malheureusement, C++ est un langage que l’on ne saurait qualifier de simple. Java élimine donc de C++ tout ce qui est complexe. Parmi ces caractéristiques complexes que l’on a éliminées, citons notamment : • Le préprocesseur • Les fichiers en-tête • L’arithmétique de pointeurs (et les pointeurs, par la même occasion) • Les structures (implicitement contenues dans la notion de classe) • Les unions • L’héritage multiple • L’héritage privé, ou héritage d’implémentation • La surcharge d’opérateurs • Les template (modèles, patrons); Java utilise un autre mécanisme pour implémenter la généricité De plus, pour épargner à l’utilisateur la difficulté de gestion de mémoire, Java comprend un gestionnaire de mémoire automatique (Voir L’architecture de la machine virtuelle Java, page 17.), accompagné d’un “garbage collector” (parfois appelé “ramasse - miettes”). Ceci devrait permettre au programmeur d’oublier les problèmes de destruction d’objets obsolètes. 1.3.2 Orientation Objets Java est en fait plus “orienté objets” que C++, en ce sens qu’il est impossible de ne pas programmer de manière “OO” avec Java, alors que l’on peut parfaitement programmer en C++ comme on le faisait traditionnellement en C, de manière strictement procédurale. 18 Java eivd Télécommunications mjn Bien que strictement “OO”, Java comprend de fait moins de possibilités dans ce sens que C++, puisque l’héritage multiple n’est pas supporté. Cette option est le résultat d’une constatation très judicieuse de la part des auteurs de Java, qui montre que l’héritage multiple n’est que très peu utilisé en pratique : dès lors, pourquoi en charger un langage dédié à un créneau bien précis, pour lequel l’héritage multiple a encore moins de chances d’être utilisé1? Le code et les données de l’utilisateur doit obligatoirement être réparti dans des classes. Les seuls objets pouvant exister à l’extérieur de classes sont des types de base, comme des entiers ou des booléens. Là encore, il s’agit d’une recherche de simplicité par rapport à d’autres langages OO, comme Smalltalk, où les types simples n’existent pas. En revanche, le fait de répartir le code dans des classes ne suffit pas à faire d’un programme un programme orienté objets; pour atteindre ce but, il faut que le programme soit conçu de manière orientée objets, et cela, un langage de programmation ne peut y parvenir seul. 1.3.3 Distribution Java est un langage distribué, Sun Microsystems dixit. Le langage dispose pour justifier cette appellation de nombreuses caractéristiques, mais la principale est l’édition de liens à l’exécution (late binding). Les langages traditionnels ne permettent que malaisément l’utilisation de code non défini, voire non disponible, à la compilation. Cette limitation rend difficile l’utilisation de code non local, non situé sur la même machine que celle ayant servi au développement; elle est imposée par la nécessité de fixer les adresses de manière statique, au moment du développement d’une application. Un langage distribué ne nécessite, idéalement, d’aucune phase d’édition, voire de définition de liens. Cette particularité permet en théorie du moins l’utilisation de code inconnu au moment du développement de l’application. En pratique, Java ne comporte pas de phase d’édition de liens, mais dans la majorité des cas, les liens doivent être définis. Cette définition peut prendre plusieurs formes, la plus simple étant le paquetage (package) que l’on importe sans toutefois le lier à l’application. Ainsi, le paquetage peut résider sur un site distant de l’application au moment de l’exécution. Dans ce cas, le compilateur connaît tout du code qu’il va utiliser, mais ne peut pas l’adresser directement, car ce code n’est pas disponible durant la phase de compilation. Lors de l’exécution, il faudra recourir à des procédures particulières pour localiser, charger et exécuter le code “étranger”. Ces procédures sont en principe partie intégrante de la machine virtuelle Java, si bien que dans ce cas, l’utilisation de code non local au moment de l’exécution est implicite. Corollairement, il devient possible de modifier ce code non local sans que l’application qui l’utilise en soit avertie (en d’autres termes, aie été recompilée). Une étape supplémentaire, et fondamentale, est l’utilisation de code inconnu au moment de la compilation, si ce n’est par le biais d’un service exporté. Java permet égale1. Si l’utilisation actuelle avait été d’emblée planifiée dans le cahier des charges du langage, il n’est pas certain que l’on eût abouti aux mêmes options. Mais c’est là bien sûr pure spéculation... Java 19 eivd Télécommunications mjn ment de réaliser ce cas de figure; l’intérêt de cette possibilité réside dans la capacité que possède une application de s’adapter, au cours de son existence, à de nouvelles situations (existence d’une nouvelle base de données, existence d’un nouveau central téléphonique, etc...). Alors que les langages traditionnels nécessitent des auxiliaires souvent lourds pour réaliser cette performance (CORBA, DCOM, par exemple), Java la réalise de façon naturelle, presque gratuite. 1.3.4 Le langage est interprété Ce qui est présenté comme avantage par Sun Microsystems est une arme à double tranchant. S’il est vrai qu’un programme interprété est plus facilement transportable qu’un langage compilable -du moins en principe-, il est également plus lent, voire beaucoup plus lent, en exécution. La majeure partie des reproches faits à Java -à tort ou à raison- proviennent du caractère interprété de Java. Néanmoins, beaucoup des avantages de Java proviennent aussi du fait du caractère interprété de Java. Quant à savoir si l’utilisation d’un langage interprété est, dans l’absolu, un avantage ou un inconvénient... Voilà de quoi alimenter une guerre de religion supplémentaire. Ceci dit, et comme nous l’avons déjà mentionné auparavant, dire que Java est interprété est un abus de langage : il est compilé pour une machine virtuelle. Même si l’on admet, pour des raisons de facilité, cet abus de langage, il convient de bien garder à l’esprit la nuance. 1.3.5 Fiabilité Java est censé être plus résistant aux erreurs de programmation, parce qu’il est plus simple (pas de manipulation de pointeurs, en particulier), et qu’il comprend un “garbage collector” dans l’environnement d’exécution. De fait, Java, grâce à sa simplicité, est mieux maîtrisé par les programmeurs, ce qui peut effectivement résulter en un nombre de fautes moins grand. Le concept d’applet d’une part, et l’orientation objets d’autre part, limitent la taille des segments de code sous Java, ce qui a pour résultat le développement d’objets plus petits, et plus faciles à maintenir. Le meilleur argument dans le sens de la fiabilité de Java est pourtant son caractère FOO (Fanatically Object Oriented). Les langages orientés objets sont par construction susceptibles de produire des exécutifs plus stables, plus faciles à tester et à dépanner. Le caractère interprété de Java est également un atout dans ce sens : on peut imaginer que l’interpréteur se livre à des test de cohérence avant de se livrer à une opération définie dans le programme. Là encore, l’argument est à double tranchant: ces tests supplémentaires ralentissent encore, si besoin est, l’exécution du code utilisateur. Enfin, et relativement à C++ dont il est un descendant direct, Java permet, grâce au “garbage collector” de ne pas se préoccuper de la gestion mémoire, et donc d’éviter les 20 Java eivd Télécommunications mjn défauts de mémoire1 (memory leaks) responsables d’un grand nombre de fautes en C++. Cette caractéristique à elle seule rend le langage nettement plus fiable que C++. 1.3.6 Sécurité Sun Microsystems a investi énormément dans la sécurité de Java, et si cette sécurité n’est pas encore complètement démontrée, elle est néanmoins mise en avant par le concepteur du langage. L’interpréteur Java constitue une “coquille” (une machine virtuelle) dans laquelle le programme Java s’exécute. En théorie, le programme Java ne pouvant s’exécuter que sur la machine virtuelle, il semble difficile, voire impossible au programme de toucher si peu que ce soit la machine réelle. Au pire, un programme particulièrement malveillant (ou particulièrement mal conçu) pourrait détruire la machine virtuelle Java, mais ne devrait pas pouvoir compromettre l’intégrité de la machine réelle abritant la machine virtuelle. En pratique, l’expérience montre que si les concepteurs de systèmes de sécurité investissent énormément d’efforts pour “fiabiliser” leurs produits, il n’y a guère de systèmes à l’abri d’attaques malveillantes, à plus ou moins brève échéance. Néanmoins, et dans les limites de l’expérience de l’auteur, il n’existe pas actuellement de choses plus sûres sur Internet à l’heure actuelle qu’une applet Java2. 1.3.7 Indépendance de l’architecture et portabilité Cette affirmation repose intégralement sur le fait que Java est interprété. L’idée est que pour autant que l’interpréteur soit porté sur une machine donnée, sous un système d’exploitation donné, une applet Java pourra s’exécuter sur ce système. En théorie, cette affirmation est indiscutable. En pratique, on se souvient qu’une affirmation analogue a déjà été faite quelque vingt ans plus tôt3 - et à d’autres occasions d’ailleurs - et ne s’est pas vérifiée dans le long terme. 1.3.8 Performances Parler de performances au sujet d’un langage interprété est toujours délicat. Lorsque Sun Microsystems prétend que Java est aussi efficace que C++, il est difficile d’y voir autre chose qu’une vague manoeuvre publicitaire. De fait, certaines mesures indépendantes chiffrent Java à un taux de performances de 2 à 35 fois inférieur à celui de C++ pour un code comparable. Les principaux points faibles de Java proviennent du concept de machine virtuelle utilisé, et du mécanisme d’héritage implémenté. La machine virtuelle ne permet pas 1. Il se trouve que certaines situations peuvent empêcher Java de reconnaître un objet inutile, ce qui conduit finalement aussi à un "memory leak". 2. Un bug célèbre qui “permet” de détruire Windows 95 et 98 et qui provoque une erreur fatale de l’explorateur sous Windows NT 4 est dû à une applet Java. Le problème provient du fait que Microsoft a voulu “améliorer” Java en autorisant l’accès direct aux fonctions de DirectX, ce qui n’est pas prévu par la spécification du langage... 3. L’université de Californie, à San Diego, avait fabriqué un compilateur Pascal selon les principes de Niklaus Wirth, et qui se fondait sur un interpréteur de "pseudo-code" (p-code). Le code objet pouvait en théorie être interprété sur n’importe quelle machine. En pratique, l’interpréteur ne fut porté que sur les PC 8088 et les Apple II, et sa portabilité était douteuse. Java 21 eivd Télécommunications mjn d’appel direct de procédures, mais requiert une indirection afin de s’assurer que l’espace de la machine virtuelle n’est pas dépassé : cette indirection demande du temps d’exécution supplémentaire à chaque appel. Lors de l’héritage, il est de plus nécessaire de chercher si une méthode donnée n’est pas surchargée par une méthode dérivée; le mécanisme utilisé par Java dans ce cas est, pour des raisons de sécurité et de compatibilité avec la machine virtuelle Java, très lourd et de ce fait très gourmand en temps d’exécution. Le mécanisme de "garbage collection" n’améliore pas les choses... En résumé, Java ne saurait être qualifié de performant relativement à des langages compilés traditionnels. En revanche, pour un langage interprété, Java est étonnamment performant. L’introduction de compilateurs natifs pendant le téléchargement d’une part (Just In Time Compiler) et de puces implémentant la machine virtuelle Java d’autre part devrait améliorer le bilan de Java dans le futur. 1.3.9 Multithreaded Un des aspects les plus intéressants de Java, outre son orientation résolument objets, est la possibilité de générer des unités d’exécution multiples, ou threads. L’utilisation de threads permet l’exécution quasi-simultanée d’un même code plusieurs fois. Contrairement aux "processus" que l’on rencontre dans les systèmes d’exploitation multi-tâches, les threads partagent tous le même espace mémoire. La possibilité d’utiliser plusieurs unités d’exécution peut simplifier notablement le travail du programmeur dans certains cas, lorsque deux (ou plus) actions sont nécessaires simultanément. Un exemple pourrait être l’affichage d’une animation complexe et l’interrogation simultanée du clavier et de la souris pour savoir si l’utilisateur ne désire pas interrompre l’animation. Ici encore, le caractère interprété de Java peut représenter un inconvénient par rapport aux performances d’un langage compilé comme C++, pour lequel existent bon nombre de librairies implémentant des threads de manière très performante relativement à Java. Mais contrairement à Java, ces librairies sont presque toujours liées au système d’exploitation, et donc non portables, même au niveau du code source. 1.3.10 Le caractère dynamique de Java Java a été conçu pour supporter des changements fréquents, comme on les connaît dans l’environnement du Web. A ce point de vue, on peut dire que Java est dynamique. Le développement d’un programme Java ne comprend pas de phase d’édition de lien au sens où on la comprend en C++. Les références à des classes externes ne sont résolues qu’au moment de l’exécution. On met souvent cette caractéristique en exergue comme avantage de Java relativement à C++ qui fonctionne sur le principe de l’édition de liens en phase de développement de l’application. Cet avantage est à double tranchant; s’il est vrai qu’il n’est pas nécessaire de modifier l’application pour bénéficier d’une nouvelle version d’une librairie Java existante, ce caractère dynamique implique également que l’on n’a pas le contrôle sur l’apparition de 22 Java eivd Télécommunications mjn nouvelles versions de librairies Java utilisées, ce qui peut parfois conduire à des comportements aberrants pour l’utilisateur. Cet inconvénient existe bien sûr en C++ également, mais du fait de l’obligation de repasser par l’étape d’édition de liens et de distribution, le programmeur a l’occasion de constater lui-même d’éventuelles incompatibilités avec une nouvelle version de la librairie utilisée. Un réel avantage, par contre, est de pouvoir bénéficier de nouvelles versions plus performantes de la MVJ sans toucher à l’application elle-même, ce qui n’est pas possible avec un langage comme C++ ou Ada. Java 23 eivd 1.4 Télécommunications mjn Le problème de sécurité posé par Java Exécuter une application provenant d’une source inconnue sur un ordinateur est considéré comme une entreprise à risques, quelles que soient les circonstances. L’histoire pourtant courte de l’informatique est déjà riche d’anecdotes et de récits de catastrophes dûs à des programmes malveillants. Que dire alors d’une technologie dont on n’est peut-être même pas conscient qu’elle exécute des applications sur son ordinateur, ni quelle application elle est en train d’exécuter ? Il devrait être facile, avec une technologie de ce type, de fabriquer des applets qui détruisent des fichiers, formattent des disques, voire consultent les mots de passe de l’ordinateur hôte et en transmettent la liste exhaustive à l’auteur du programme1! Il est donc indispensable, pour populariser un tel produit, de garantir sa sécurité aussi bien que possible. De ce fait, de sévères restrictions sont imposées aux applets. Ces restrictions limitent l’utilisation du langage pour la conception d’applications réelles, aussi a-t-on défini, parallèlement aux applets, des applications Java non soumises aux restrictions valables pour les applets; en revanche, une application Java ne peut pas circuler sur le réseau. Une application Java ne se distingue pas, dans son aspect commercial, d’une application C++ ou Ada. La “coquille” Java dont nous avons déjà parlé confine l’applet dans la machine virtuelle, et interdit théoriquement à l’applet tout accès à la machine réelle. Un code “malicieux” ne peut donc théoriquement que détruire la machine virtuelle; par rapport à une protection conventionnelle de type “anti-virus”, cette approche est nettement plus sûre, puisqu’elle ne dépend pas de mises à jour périodique du programme de contrôle, et qu’elle ne peut être désactivée. De plus, plusieurs composants de l’environnement d’exécution de Java contribuent à améliorer la sécurité, et à protéger la machine virtuelle elle-même contre des attaques insidieuses. 1.4.1 Le chargeur de classes (class loader) Lors du téléchargement d’une applet, le browser fait intervenir le chargeur de classes pour initialiser l’applet au sein de l’espace mémoire de la MVJ. La chargeur place le code exécutable de l’applet dans l’espace mémoire de la MVJ, et ce faisant, contrôle la cohérence de l’adressage et des références de l’applet. 1.4.2 Le vérificateur (class checker) Le vérificateur est invoqué immédiatement après le chargement, et permet de contrôler la cohérence de l’espace d’adressage de l’applet. En principe, le vérificateur devrait être en mesure de déterminer si une applet va tenter d’adresser de la mémoire en dehors de la zone reservée à la MVJ. 1. Ce qui a effectivement été réalisé avec une technologie de ce type par un pirate informatique. Avant la finalisation de Java, d’autres avaient déjà eu l’idée d’applications téléchargeables, et ils utilisaient Tcl/Tk comme outil, nettement moins sécurisé que Java. 24 Java eivd Télécommunications mjn Le vérificateur devrait aussi être en mesure de prévoir d’éventuelles incompatibilités entre l’applet et l’implémentation locale de la MVJ. Il se peut que l’implémentation locale ne dispose pas assez de mémoire physique pour exécuter une applet donné : le vérificateur devrait en principe pouvoir détecter cette incompatibilité et donner un avertissement en conséquence à l’utilisateur. 1.4.3 Le policier (security agent), Security Manager Lorsque la MVJ constate une tentative d’une applet de violer les règles de “bon comportement”, elle en réfère à un “policier” qui arbitrera le dilemme de la MVJ, et décidera si l’applet en question peut être autorisé à effectuer une opération ou non. Cette opération litigieuse peut consister en une tentative d’ouvrir un fichier, ou d’effectuer une connexion réseau; plus généralement, toute tentative de l’applet de communiquer avec l’extérieur devra passer par ce policier. Le policier est extérieur à la MVJ proprement dite. Il est généralement partie intégrante du browser utilisé; on peut penser qu’il devrait dans un proche avenir être intégré au système d’exploitation. 1.4.4 Elements du langage renforçant la sécurité Le langage a été d’emblée pensé en fonction du problème de la sécurité, et certaines “améliorations” de C++ (ou présentées comme telles) sont plus vraisemblablement des contraintes imposées par des critères de sécurité. Ainsi, l’interdiction d’utilisation de pointeurs au sens C++ du terme est presque obligatoire si l’on désire s’assurer qu’une application ne tente pas d’adresser de la mémoire de manière illicite (par exemple, pour modifier la MVJ). L’argument selon lequel Java est plus sûr parceque plus simple est à considérer avec quelque précaution. L’un des logiciels les plus gros et les plus fiables du monde a été écrit avec un langage quasi abandonné depuis, parce que beaucoup trop complexe. Par contre un des plus catastrophiques virus de l’histoire d’Internet a été écrit en quelques lignes d’un langage interprété, ne connaissant pas de pointeurs, ni de goto ou d’exceptions. Le langage peut être un élément de sécurité, mais il n’en est jamais un élément déterminant. 1.4.5 Java, sûr ? Java est un langage aussi sûr que l’on peut le réaliser dans le cadre d’Internet, par ailleurs complètement étranger dans sa conception à la notion de sécurité. Il est actuellement beaucoup plus sûr de télécharger une applet Java que de passer commande sur Internet en donnant son numéro de carte de crédit; la transaction par carte de crédit est rarement sécurisée, et quand elle l’est, c’est souvent de manière approximative. Java est sûr jusqu’à ce que quelqu’un découvre une faille, ce qui finira forcément par arriver. Il n’existe pas de sécurité absolue dans quelque domaine que ce soit, à moins d’éviter complètement d’utiliser le domaine en question. Il n’y a pour l’instant pas de raisons de renoncer aux possibilités offertes par cet outil. Java 25 eivd Télécommunications mjn La version 1.03 de la MVJ est considérée par beaucoup comme insuffisamment protégée. Une nouvelle version de la MVJ (1.1) est apparue au cours de l’année 1997, qui corrige certains des principaux reproches faits actuellement à la MVJ. L’intérêt de Java est que l’on devrait pouvoir corriger ainsi les défauts de sécurité de la MVJ et conserver la compatibilité intégrale avec tous les applets et applications existantes. Au moment de l’écriture de ces lignes, la version la plus récente, et faisant référence de la MVJ est la version 1.3. 1.4.6 Java, a Windows killer ? On parle beaucoup de Java comme d’un adversaire de Windows, et d’une arme inventée par Sun contre Microsoft et sa quasi hégémonie dans le monde du logiciel. Il y a probablement une part de vérité dans cette affirmation, mais Java va au-delà d’une simple guerre d’interfaces utilisateurs. Java introduit une nouvelle manière de concevoir des environnements distribués, et c’est à ce niveau que se situe le véritable danger pour des éditeurs de logiciels comme Microsoft, qui prônent le concept suranné d’architectures fermées, basées sur un seul matériel et un seul système d’exploitation. Java, considéré par certains comme un aimable amusement tout juste bon à animer des logos sur des pages du Web, pourrait représenter une révolution majeure en permettant à tout un chacun d’utiliser des applications performantes indépendemment de la machine et du système d’exploitation utilisé. Si toutes les applications intéressantes sont écrites en Java, peu importe le système d’exploitation ou la machine: il suffit qu’elle implémente une machine virtuelle Java. En revanche, Java a encore du chemin à faire pour parvenir à la performance de systèmes comme Windows, ou l’interface utilisateur du Macintosh ou de NextStep. L’Abstract Window Toolkit est, dans son implémentation actuelle, peu fiable et limité. La sécurité, bien qu’ayant fait l’objet d’efforts particuliers, doit impérativement être améliorée. La performance est peu satisfaisante. Les environnements de développement sont encore immatures (à l’exception notable du JDK de Sun, qui a de plus l’avantage d’être gratuit). Les classes Swing, introduites à partir de la version 1.2 de Java, montrent que les concepteurs de Java sont conscients du problème, et apportent des solutions. 26 Java eivd 1.5 Télécommunications mjn Implémentation matérielle de la machine virtuelle Java Le principal inconvénient de la machine virtuelle Java est d’être ... virtuelle, c’est-àdire de devoir être émulée sous forme logicielle par un CPU d’une autre famille, comme un 80x86, ou un Power PC. La performance des applications Java s’en trouve grandement pénalisée par rapport à celle que l’on peut attendre de la part d’applications natives, c’est-à-dire développées pour le CPU autour duquel l’ordinateur hôte est construit. Sun Microsystems entend remédier à cet état de fait par deux approches simultanées, compatibles entre elles : • Le coprocesseur Java • L’ordinateur Java Le principe de base de ces deux approches est identique. A partir de la spécification de la machine virtuelle, il est possible en principe d’implémenter une machine réelle parfaitement conforme à la spécification. Cette machine réelle est dès lors à même d’exécuter directement le “bytecode” Java, sans opération d’interprétation intermédiaire, et de ce fait de rivaliser avec des applications écrites en C et en C++ pour des machines natives. 1.5.1 Le coprocesseur Java Le coprocesseur Java est un chip (une carte, le plus souvent) qui peut se glisser dans un emplacement libre d’un PC (actuellement, une station Sun SuperSPARC), et se mettre à disposition d’une application requérant une interprétation de code Java (typiquement, un viewer WWW comme Netscape). En principe, dès que Netscape (ou le viewer utilisé) détecte un lien sur une applet Java, il va télécharger le code de l’applet non pas dans sa propre machine virtuelle, mais sur la carte coprocesseur, donc dans la machine réelle. L’applet va alors s’exécuter entièrement sur le coprocesseur, délivrant ainsi une performance théoriquement beaucoup plus intéressante pour l’utilisateur. En pratique, cette manière de faire se heurte à de nombreuses difficultés, en raison de la nécessité d’accéder à des portions communes d’écran (ou d’autres ressources) depuis deux applications séparées, s’exécutant dans des environnements matériels séparés. Cette condition est souvent difficile à réaliser sur des systèmes d’exploitation multi-tâches préemptifs, qui intégrent des mécanismes de protection mémoire destinés justement à éviter ce genre d’opérations. 1.5.2 L’ordinateur Java L’autre alternative est l’ordinateur Java, dont le seul processeur est constitué du CPU Java. Les applications doivent donc être recompilées pour s’accomoder de ce CPU. Java 27 eivd Télécommunications mjn L’ordinateur Java a l’énorme inconvénient de ne pouvoir exécuter les applications existantes sans adaptation (recompilation). D’autre part, les applications existantes sont écrites pour le langage C ou C++ (langage pour lequel sont optimisés les chips habituels), ce qui peut laisser craindre une certaine dégradation de performances sur un processeur optimisé pour Java. En fait, ce dernier argument n’est pas critique, tant il est vrai que Java est par beaucoup d’aspects un sous-ensemble de C++. Le seul handicap de Java, lorsqu’il exécute des programmes C, est la présence du “garbage collector” qui va freiner inutilement le déroulement d’un programme prévu pour un fonctionnement sans réallocation automatique de la mémoire. L’ordinateur Java est intéressant parce qu’à l’instar du langage, il est peu gourmand en ressources pour des performances plus qu’acceptables. On peut utiliser l’ordinateur Java dans le cadre d’applications de petites dimensions, sans périphériques coûteux et mémoire considérable. Il constitue une base idéale, semble-t-il, pour le “Network Computer” (Voir Le “web Computer”, page 34.). 1.5.3 Java en tant que plate-forme A côté du langage de programmation, certes intéressant, mais pas vraiment révolutionnaire, se profile l’aspect plate-forme de Java. Contrairement à C++, on a avec Java d’emblée mis l’accent sur une bibliothèque aussi riche que possible. Au fil du temps, cette bibliothèque est devenue incroyablement diversifiée, si bien que l’écriture d’une application Java se résume souvent à l’assemblage de composants localisés ça et là sur Internet. Mieux, l’introduction de la notion de composants distribués (Java Beans) rend Java idéal pour les applications de télécommunications et de téléinformatique. On trouve actuellement des composants fiables pour toutes sortes d’applications. Conjugués avec le mécanisme de distribution de code de Java, RMI (Remote Method Invocations), ces composants permettent le déploiement aisé et bon marché d’applications sur un réseau de télécommunications. Les paquetages java.net (réseau), JTAPI (Java Telephone Application Programming Interface), RMI déjà mentionné et JAIN (Java API for Intelligent Networks), entre autres, offrent des interfaces abstraits très performants avec les applications de zélécommunications. Enfin, il y a JINI (acronyme sans signification particulière avouée) qui se profile comme un fantastique mécanisme d’implémenter des fonctionnalités “plug and play” (brancher et utiliser) au niveau du réseau. Les télécommunications, bien que privilégiées pour des raisons assez évidentes dans l’offre Java, ne sont pas, et de loin, le seul thème abordé par la plate-forme Java. Il serait fastidieux de faire une énumération exhaustive ici, mais nous citerons quand même • JDBC, Java Database Connectivity. Une extension permettant la connexion avec de nom- breuses variantes d’implémentation à une base de données SQL. • JCE, Java Cryptography Extensions • JMF, Java Media Framework • JRTE, Java Real Time Extensions 28 Java eivd Télécommunications mjn • Java 3D, paquetage pour les applications de modelage en 3D, avec interfaçage à VRML (Virtual Reality Modeling Language). Le but poursuivi ici est évident : il s’agit d’offrir une alternative à Windows, alternative qui serait portable sur tout système d’exploitation (en particulier Windows) ou machine pour lequel il existe une machine virtuelle Java. Cette alternative n’est pas réellement une attaque contre la quasi hégémonie de Windows (attaque qui en l’état actuel des choses serait probablement suicidaire), mais plutôt une recherche de complémentarité; l’argument de Sun est le suivant : utilisez Windows et les applications de la suite Office si vous en avez besoin, mais disposez en parallèle d’applications portables, qui pourront au besoin migrer sur Linux ou SunOS. Microsoft a ressenti Java comme une attaque contre son hégémonie. Il a d’emblée contesté l’appelation de plate-forme à Java, pour le reléguer au rôle de simple langage de programmation, pas meilleur (et certainement moins puissant) que C++ pour programmer Windows par le biais des MFC. Ensuite, il s’est ingénié à définir des versions de Java spécialement adaptées à Windows, afin de nuire à sa portabilité. Enfin, il a été jusqu’à interdire l’utilisation de Java sur les sites Internet qu’il contrôle. Ces faits, ainsi que le soutien apporté par IBM, Oracle et d’autres à la technologie Java constitue une indication sur les potentialités de Java : malgré une indicutable immaturité, Java constitue la première véritable évolution informatique depuis longtemps. Java permet de considérer une application non plus comme s’exécutant sur un ordinateur composé d’un ou plusieurs CPU, d’une mémoire et d’un stockage permanent, mais distribuée sur un réseau hétérogène d’ordinateurs. La technologie équivalente de Microsoft, DCOM, reste confinée au monde Windows1. Dernière trouvaile du géant de Seattle, C# est un langage de programmation dont DCOM est une partie intégrante. Du fait de l’orientation distribuée de ce langage, il se pose comme rival direct à la technologie Java. En revanche, il n’est pas portable, et sa distribution actuelle (2000) est tout à fait confidentielle. 1. Des portages ont été tentés sur diverses versions de UNIX par Software AG, par exemple. Ces portages nécessitent des fonctions passerelle. Il existe assi des passerelles avec la technologie CORBA; enfin, bien que non normalisées, il existe diverses passerelles DCOM - Java disponibles gratuitement ou moyennant un coût modeste sur Internet. Java 29 eivd 1.6 Télécommunications mjn JavaScript1 En 1995, Netscape Communications envisage de créer lui aussi un langage “pour le Web”, qui sera un langage interprété, un langage de script. Ce langage s’appellera LiveScript. Un peu plus tard, Netscape signe un accord avec Sun Microsystems pour la technologie Java, et s’empresse de rebaptiser son enfant en JavaScript. JavaScript n’a en commun avec Java qu’une partie du nom. Il s’agit d’un macro-langage destiné à améliorer l’interactivité d’une page Web de manière simple. Dans ce contexte, on peut dire que JavaScript est une réussite technique; il est en revanche difficile actuellement de parler de réussite économique. JavaScript est une alternative efficace à l’utilisation du “Common Graphics Interface” (CGI, ou cgi-bin pour certains), mais l’apprentissage de CGI est relativement complexe par rapport à celui de JavaScript qui permet par contre plus de choses. 1.6.1 Utilisation de JavaScript Pour effectuer des besognes simples, JavaScript est incomparablement plus simple que Java. Afficher l’heure et la date en JavaScript se fait en une ligne, dans le corps même de la page HTML : <SCRIPT> document.write(“La date et l’heure courante sont : “+Date()) </SCRIPT> Par comparaison, une implémentation Java peut paraître complexe, même sans considérer qu’il faudra encore référencer le fichier .class dans le fichier HTML (le fichier .class ne peut pas être inclus dans le fichier HTML) : import import public java.util.Date; java.awt.Graphics; class DateTime extends java.applet.Applet { public void init() { resize(150, 25); } public void paint(Graphics g) { Date today = new Date(); g.drawString(“La date et l’heure courante sont : “+ today, 50, 25); } }; 1. Il existe un cours du même auteur qui décrit entre autres JavaScript. Ce cours est consacré aux divers outils existant sur Internet, et présente également HTML, CGI, e-mail, telnet et ftp, par exemple. 30 Java eivd 1.6.2 Télécommunications mjn Développement de script JavaScript Le script JavaScript peut être inclus au sein de la page HTML, entre les commandes <SCRIPT> et </SCRIPT>. Il est donc en principe édité en même temps que la page HTML, et utilise les mêmes ressources (WinEdt, SimpleText, vi, etc...) que celles nécessitées par l’édition de la page HTML. Il est en revanche difficile de trouver des sites exportant des scripts en tant que tel. On peut néanmoins repiquer des fragments de page HTML en utilisant l’option “View Source” du browser utilisé. Là encore, il peut y avoir des droits d’auteur à respecter : dans ce cas, ils devraient être spécifiés dans le cadre du script, sous forme de commentaires. Par ailleurs, JavaScript peut utiliser Java, ce qui en fait un langage plutôt complémentaire à Java que concurrent. Java 31 eivd 1.7 1.7.1 Télécommunications mjn Et les autres outils ? VBScript VBScript est la réponse de Microsoft à l’offensive Java1. Il s’agit ni plus ni moins que d’une version supplémentaire de Visual Basic, adaptée aux exigences d’Internet, donc comprenant quelques instructions et possibilités supplémentaires. Ce langage de script convient particulièrement bien aux habitués des applications de la suite Office du même éditeur, puisque les langages “macro” des divers composants de la suite sont également des dérivés de Visual Basic. Le passage de Visual Basic for Excel à VBScript (par exemple) est particulièrement aisé. De par ses fonctionnalités et ses possibilités, VBScript est comparable à JavaScript; les éventuels avantages de VBScript relativement à JavaScript sont de nature propriétaire, et liés aux technologies propres de Microsoft (en particulier ActiveX). VBScript est donc de caractère moins universel que Java, ou JavaScript. 1.7.2 CGI Le Common Gateway Interface (CGI) constitue la première tentative pour offrir un peu d’interactivité à une page Web. Il ne s’agit en fait pas d’un modèle de programmation, mais plutôt d’un interface entre le client et le serveur. Le client peut, au travers de CGI, exécuter des commandes avec des paramètres sur le serveur. Les programmes sur le serveur peuvent en principe être écrits en n’importe quel langage, mais on utilise souvent des scripts perl sur les serveurs UNIX. Windows 2000 inclut un interpréteur perl dans la livraison du système d’exploitation. Par ailleurs, ce langage est disponible gratuitement. L’interactivité offerte par CGI est relativement faible, puisque toutes les actions nécessitent une intervention du serveur, et donc une connexion HTTP. L’avantage de cgi est que, comme tout est réalisé sur le serveur Web, et que les résultats sont communiqués en HTML, cgi est donc forcément portable. 1.7.3 Dynamic HTML (DHTML, DNA) Les techniques dites HTML dynamiques sont récentes (fin 1997) et constituent une autre facette de la guerre Microsoft - Java. Ces techniques sont en principe introduites par Microsoft pour rendre inutile l’utilisation de Java. Il est possible, grâce à ces techniques, de répondre de manière plus ou moins dynamique aux actions de la souris, par exemple, en 1. Ce n’est pas la seule réponse, d’ailleurs, la plupart étant de nature non technique. Ainsi, Microsoft a, fin 1997, pratiquement mis hors la loi Java dans les sites Web contrôlés par le géant de Redmont. Incidemment, cela tend à démontrer l’intérêt de Java, et le danger (réel ou imanginaire) pour Microsoft : il faut que l’ennemi fasse peur pour que l’on se sente obligé d’utiliser de pareils moyens. Voila qui devrait en fait constituer une publicité certaine pour Java ! 32 Java eivd Télécommunications mjn changeant l’aspect d’un bouton, en modifiant une image, etc... Ces techniques sont encore immatures, et non supportées par l’ensemble des navigateurs. Java 33 eivd 1.8 Télécommunications mjn Perspectives Java est un pas important vers un système informatique réellement distribué, et donc vers une nouvelle approche de l’informatique. En principe, il suffirait de disposer d’un ordinateur capable d’effectuer une connexion avec le réseau, et de télécharger aussi bien le système d’exploitation que les applications depuis le réseau. Pratiquement, la vitesse de communication insuffisante reste le seul frein à cette tendance. Cette limitation peut se combattre par nombre de moyens, les réseaux B-ISDN ou les connexions xDSL n’étant que quelques exemples. La multiplication du nombre de serveurs peut, de manière encore plus efficace, contribuer à la solution. On obtiendrait ainsi une nouvelle vision de l’informatique, beaucoup plus liée à la communication, et de fait aux télécommunications, puisque le système d’exploitation ne serait plus une option que l’on prend à l’achat d’une machine, mais une option que l’on décide à l’enclenchement de l’ordinateur, instant correspondant à la connexion au réseau. Ces possibilités posent nombre de problèmes politiques et juridiques qui sont encore loin d’être résolus : il suffit de constater la quantité de problèmes posés par le seul Internet pour s’en rendre compte. Mais le fait que des problèmes existent n’empêche pas d’y trouver des solutions... 1.8.1 Le “web Computer” Le Web Computer est l’une des possibilités envisagées pour permettre de faire baisser encore le prix des ordinateurs. Le Web Computer est un appareil de très bas prix (ordre de grandeur < 500 $), sans véritable système d’exploitation, ne possédant que les ressources nécessaires pour télécharger le système d’exploitation depuis Internet. Ses seules applications locales sont une machine virtuelle java,ou un chip exécutant Java en mode natif (Voir L’ordinateur Java, page 27.), et les protocoles nécessaires (PPP / SLIP, IP, TCP/IP) pour accéder au serveur qui lui fournira son système d’exploitation. Cette machine a de nombreux avantages conceptuels : • Son système d’exploitation est toujours actualisé. • Il n’est plus nécessaire de disposer de machines équipées de disques volumineux, diffici- les à sauvegarder, puisque les applications ne résident plus localement. • Les fichiers utilisateurs peuvent résider sur le serveur, moyennant finance modique sur la base du mégabyte occupé, par exemple. Les problèmes de sauvegarde sont réglés par le serveur. • Les applications sont toujours actualisées. Au lieu de payer relativement cher une application peut-être rarement utilisée, on peut imaginer payer l’utilisation de cette application sur la base du temps d’utilisation effective. • La necessité de télécharger les applications impose la définition de petites applications modulaires (objets) pouvant se combiner pour offrir des fonctionnalités équivalentes aux brontosaures actuels. 34 Java eivd Télécommunications mjn Cette machine présente aussi quelques problèmes : • Il n’est pas évident de faire naître le besoin de ce type de machines dans un marché déjà hyper-tendu. • La machine est vulnérable; la moindre panne de réseau la rend totalement inutilisable. • Le succès d’une telle machine est lié aux applications que peut offrir le réseau. Cette offre est à son tour limitée par les possibilités du réseau. • Le prix déjà outrageusement bas des PC de bas de gamme rend l’avantage de prix parfois discutable. La seule manière pour le Web Computer de s’imposer est d’offrir une gamme de services beaucoup plus étendue, et d’utiliser à fond l’atout du réseau. L’existence implicite du réseau dans un ordinateur permet d’imaginer une symbiose beaucoup plus grande de l’informatique et des télécommunications : pourquoi acheter un fax séparé ? Pourquoi utiliser encore le courrier écrit; pourquoi ne pas concevoir une association symbiotique entre courrier électronique, fax, terminal bancaire, échange de documents multimédia et téléphone classique ? Un seul terminal peut sans autre remplir ces diverses tâches de manière intégrée, et c’est le Network Computer (NC). FIGURE 1.3 Le Network Computer, tel qu’il pourrait être Network Computer Service téléphonique Interface réseau ISDN, ATM, etc... Web surfer Fax Terminal bancaire Visiophonie Consultation de bases de données Services multimédia Mais le principal obstacle à une apparition d’un véritable Web Computer reste Microsoft. Le principe qui veut que Windows doit tout contrôler, depuis les téléphones portables jusqu’aux serveurs d’entreprises rend un Web computer basé sur Java insupportable; Micro- Java 35 eivd Télécommunications mjn soft a de ce fait introduit le Web PC, un outil hybride entre un PC et un raccordement Internet, mais qui n’a pas obtenu de succès parce que justement il n’apportait aucun service nouveau relativement à un PC. Le Web PC a quand même eu le mérite (?) de tuer dans l’oeuf les développements concernant le Web Computer; il faudra vraisemblablement attendre des progrès significatifs de la part des télécommunications (largeur de bande) pour relancer le débat. Mais ces progrès sont déjà là (UMTS, réseaux satellites, etc...); il suffit désormais de les exploiter. Une opportunité majeure pour le succès de Java réside peut-être dans l’informatique mobile. Les principaux acteurs des réseaux de télécommunications s’intéressent à Java, même si la plupart continuent à utiliser une technologie centrée sur Windows. IBM et Alcatel, pour ne citer que ces deux protagonistes, ont introduit Java dans leurs centraux de téléphonie et de téléinformatique, respectivement. 36 Java eivd 1.9 1. 2. 3. 4. 5. 6. 7. 8. 9. Télécommunications mjn Test : Le concept Java Pourquoi un exécutable Java (bytecode) est-il dit “multi-plateformes”? Qu’est-ce que JavaScript par rapport à Java ? Comment est garantie la sécurité des applets Java, et quels sont les outils mis à disposition pour combattre les pirates informatiques ? Y a-t-il des inconvénients à utiliser Java pour la programmation d’applications courantes, et y a-t-il des avantages relativement à, par exemple, C++ ou Ada ? Existe-t-il des domaines d’applications où Java est malaisément utilisable, quelle que soit par ailleurs la puissance de la machine utilisée? Un chip Java pourrait-il exécuter du code objet C++ de manière efficace? Steve Jobs a, dans une conférence de presse, émis la possibilité de réécrire NextStep, ainsi que le noyau sous-jacent, pour le Macintosh en Java. Quels seraient les avantages d’une telle stratégie, et quels en seraient les inconvénients (indépendemment de la vitesse d’exécution) ? Pourquoi ne pas avoir opté pour un interpréteur source pour implémenter Java, au lieu d’une machine virtuelle? Etant donné que plus de 80% des machines actuelles sont des machines basées sur des processeurs de Intel, ou compatibles, on pourrait argumenter que les 20% restant ne suffisent pas à justifier l’introduction de Java en tant que langage “multi-plateformes”. Cette affirmation vous paraît-elle justifiée? Java 37 eivd 38 Télécommunications Java mjn