Eléments de comparaison Java/Hotjava contre Caml/MMM
Note préliminaire: cette comparaison n'est pas complètement objective.
J'apprécierais tout commentaire
Java and HotJava sont des marques déposées de Sun Microsystems, Inc.
Introduction
HotJava est à Java ce que MMM est à Caml, c'est-à-dire:
- Java et Caml sont les langages proposés pour programmer les applets.
-
HotJava et MMM sont des butineurs supportant leurs applets respectives. De plus, les deux butineurs sont écrits dans le même langage que les applets qu'ils supportent, probablement comme preuve de l'adéquation du langage au IHM, au Web, etc...
Les applets Java sont également supportées par d'autres navigateurs.
Les applets Caml sont supportées dans Netscape Navigator 3.0 grâce au plugin
Calves.
Ce document présente brièvement les points suivants:
- Les langages Java et Caml
- Le typage de ces langages
- La sécurité des systèmes d'applets
- Portabilité
- Bibliothèques accessibles par l'API des applets
- Disponibilité
Les langages: Java et Caml
- Java
-
- Programmation par objets (basé sur les classes, de la famille C++). Langage extrêmement simplifié (seulement types de données de base, objets et tableaux). Pas de fonctions (seulement des méthodes), pas de structure de données enregistrement (seulement des objets), pas de types somme (i.e. variantes). Pas de classes paramétrées.
- Compilé vers du bytecode (indépendant du processeur et du système
d'exploitation), et plus récemment vers du code natif (au vol).
- Ramasse-miette
- Concurrence (threads)
- Caml (Objective Caml)
-
- Fonctionnel (impur, il existe des constructions impératives comme les structures de données mutables, les entrées/sorties, les boucles). Langage de programmation généraliste. Tous types de données classiques. Polymorphisme. Dans Objective Caml, programmation par objets basée sur les classes.
- Compilé vers du bytecode (indépendant du processeur et du système d'exploitation). Compilateurs natifs disponibles, mais non utilisés pour les applets.
- Ramasse-miette
- Concurrence (threads) au niveau bytecode et au niveau natif
(sur certaines plateformes) dans les versions récentes (non utilisés dans MMM).
Typage
Les deux langages sont typés au sens où aucune erreur de type ne peut rester indétectée.
- Java
-
- Mélange de typage statique et dynamique. Certaines erreurs de types sont détectées à l'exécution (exceptions); il s'agit du problème connu de la confusion entre héritage et sous-typage. Par exemple, toute affectation dans un tableau d'objet demande une vérification de type à l'exécution.
- Typage explicite.
- Pas de polymorphisme (au sens ML), mais une notion de "type d'interface".
- Description informelle du système de type.
- Système de module (les noms des modules sont projetés sur les chemins du système de fichiers)
- Caml
-
- Typage statique. Pas d'erreurs de type à l'exécution.
- Inférence de types.
- Polymorphisme.
- Système de type formel, preuve de correction.
- Système de modules similaire à celui de SML. Paramétrisation d'ordre supérieur pour les modules.
Sécurité
Les deux langages font un usage intensif du typage pour garantir la sécurité.
La principale différence est que Java utilise le typage au niveau bytecode,
alors que Caml utilise le typage au niveau de la compilation, complété par
un système d'authentification cryptographique.
- Applets Java
-
- Java a un algorithme de vérification du bytecode. Cette algorithme réalise différents tests (p.ex. validité de l'accès aux champs des objets, conversions de données) avec l'aide de l'information de type présente dans le bytecode (p.ex. différentes instructions de manipulations d'entiers et de pointeurs, accès aux champs par noms), et d'informations de types sur les classes, attachée au bytecode.
Le vérificateur de bytecode repose sur deux propriétés simple du jeu d'instructions de la machine abstraite, afin de pouvoir construire une "preuve" de sécurité par induction sur le code.
- Un espace de noms séparés pour les classes est utilisé pour le bytecode étranger, afin d'éviter le spoofing des classes prédéfinies.
- Pas d'accès aux méthodes natives pour les applets (?).
- Description informelle de l'algorithme de vérification. Source
disponible sous license uniquement.
- Signature des applets introduite récemment.
- Applets Caml
- Les instructions de la machine abstraite ne contiennent pas d'information de type. Par contre:
- le compilateur Caml ajoute, dans le bytecode de chaque unité de compilation, de l'information à propos des modules requis par cette unité. Cette information est un digest MD5 des versions compilées des signatures des modules requis.
- lors de l'édition de liens, les vérifications consistent à tester l'égalité des digests des modules requis par le bytecode à charger et des digests des modules exportés par le navigateur.
- Pas d'accès aux primitives C pour les applets.
- Une signature cryptographique de type PGP est utilisée pour prouver au client que les vérification de sécurité ont été faites par le fournisseur d'applet. Les vérifications de sécurité reponsent entièrement sur le typage.
- Plusieurs publications disponibles sur les systèmes de types et de modules. Source disponible gratuitement.
Portabilité
Les applets elle-mêmes sont portables. Le point discuté ici est la portabilité de l'environnement d'exécution.
- Applets Java
- Actuellement disponibles pour: Solaris, Windows NT, Windows 95. Portages en cours par Sun pour Mac OS 7.5. OSF a annoncé un projet de portage de Java pour les principales plateformes Unix. A ma connaissance, la principale difficulté est liée à l'implantation des threads.
Il faut également noter que Netscape Comm. a apparemment porté le runtime Java sur plusieurs plateformes Unix, puisque Java est supporté (ou sera supporté) par Mozilla sur la plupart des plateformes.
- Applets Caml
- Objective Caml est disponible sur (ou portable sur) toute plateforme Unix (testé sur DEC/OSF (alpha), SunOS 4.1.x (sparc), Linux a.out et ELF (486, Pentium), Solaris (sparc); tourne également sur SGI/IRIX, HPUX, FreeBSD).
Les portages sur Windows et Mac OS sont en principe possibles (puisque Tcl/Tk est maintenant disponible sur ces plateformes).
Bibliothèques
Cette section présente les bibliothèques disponibles pour l'auteur d'applets.
- Applets Java
-
- Les IHMs sont programmées avec la boîte à outils AWT.
- Interactions simples avec le navigateur pour la navigation Web (également nouveaux types de documents ?)
- Connexions réseaux (limitées au site d'origine de l'applet). Pas d'IO (dépend des versions).
- Pas de bibliothèque d'intérêt général.
- Applets Caml
-
- Les IHMs sont programmées avec CamlTk, l'interface de Caml avec Tcl/Tk.
- Accès aux fonctions de navigation du butineur.
- Extensions du butineur (nouveaux types de documents, sémantique d'activation des liens, machine d'affichage HTML,...).
- Entrées/sorties avec vérification de l'utilisateur. Accès au réseau limitéà la navigation et au protocol HTTP.
- streams, implantations de structures de données communes
(lists, arrays, hash-tables, queues, sets, sorting, stack, random).
Disponibilité
- Java, Hotjava, Netscape
- Hotjava est disponible gratuitement, mais supporte seulement une version obsolète de l'API Java (alpha). La politique de distribution de Netscape dépend
sur statut de l'utilistaeur. La spécification de Java est propriétaire mais disponible gratuitement. Les sources du système sont disponibles sous license. Un compilateur Java est disponible gratuitement.
- Caml Special Light, MMM.
- Tous les sources sont disponibles gratuitement. Les deux systèmes sont utilisables librement, mais les travaux dérivatifs sont soumis à autorisation.