Éléments d'évaluation
La distribution d'Objective CAML fournit deux compilateurs en ligne, un
engendrant du code-octet et l'autre produisant des instructions
pour les processeurs les plus courants. La boucle d'interaction
utilise le compilateur de code-octet. En outre, la distribution
offre de nombreuses bibliothèques sous forme de modules et quelques
outils pour le calcul de dépendances entre modules, le profilage et la
mise au point. Enfin grâce à son interface avec le langage C, il est
possible de lier des programmes Objective CAML et des programmes C. Les
langages offrant également une interface avec C, comme le JNI
(Java Native Interface) de Java deviennent ainsi accessibles.
Le manuel de référence donne la syntaxe du langage, décrit les outils
de développement et les signatures des bibliothèques. Cet ensemble
(langage, outils, bibliothèques, documentation) forment un
environnement de développement.
Langage
Spécification et implantation
Il y a deux manières d'aborder un nouveau langage. Une première est de
lire la spécification du langage pour avoir une vision globale. Une
deuxième est de se plonger dans le guide d'utilisateur du langage en
suivant les concepts illustrés par des exemples. Objective CAML ne possède
ni l'un ni l'autre, ce qui rend son abord de manière autonome
relativement difficile. L'absence de spécification formelle (comme en
possède SML) ou descriptive (comme pour ADA) est un handicap
pour comprendre le fonctionnement d'un programme.
Une autre conséquence de l'absence de spécification est
l'impossibilité d'obtenir un label de normalisation du langage (ISO,
ANSI ou IEEE). Cela limite fortement la construction de nouvelles
implantations munies d'autres environnements. Heureusement
l'implantation de l'INRIA est de bonne qualité et surtout les sources de
la distribution sont disponibles.
Syntaxe
Les particularités syntaxiques sont une difficulté non négligeable
pour aborder Objective CAML. Elles s'expliquent par l'origine
fonctionnelle du langage, mais aussi par des facteurs historiques,
voire anecdotiques.
La syntaxe de l'application d'une fonction à ses arguments est
définie par la simple juxtaposition, comme dans f 1
2. L'absence de parenthèse perturbe aussi bien le néophyte que le
programmeur C ou le programmeur Lisp confirmé. Néanmoins,
cette difficulté ne vaut vraiment que pour la lecture du code d'un
programmeur chiche en parenthèses. Rien n'empêche le programmeur
néophyte en Objective CAML d'utiliser un parenthésage plus explicite et
d'écrire (f 1 2).
Au delà du noyau fonctionnel, Objective CAML adopte une syntaxe rompant
parfois avec l'usage : l'accès aux éléments d'un tableau utilise
la notation t.(i) et non les usuels crochets ; l'invocation
de méthode se note avec un dièse (caractère #) et non le point,
etc. Ce particularisme ne facilite pas la prise en main d'Objective CAML.
Enfin, les syntaxes d'Objective CAML et de son ancêtre Caml ont subi de
nombreuses modifications depuis leurs premières implantations. Ce
qui n'a pas plaidé en faveur de la pérennité des applications
développées.
Pour ne pas rester sur une note négative, la syntaxe de filtrage de
motifs, héritée de la famille ML, qu'intègre Objective CAML structure
agréablement et avec simplicité les définitions de fonctions par
cas.
Typage statique
La caractéristique fondamentale du langage Objective CAML demeure le typage
statique des expressions et déclarations du langage. Il garantit
qu'aucune erreur de type ne survient durant l'exécution d'un
programme. L'inférence statique de type a été conçue pour les
langages fonctionnels de la famille ML, et Objective CAML a su maintenir la
plus grande partie de cette discipline de typage pour les extensions
impérative et objet. Cependant, dans le cas de l'emploi d'objets, le
programmeur doit parfois épauler l'inférence de types par des
contraintes explicites de typage. Même alors, Objective CAML conserve un
typage statique des expressions et des définitions, ce qui constitue
un gage incontesté de sûreté d'exécution : un programme
Objective CAML ne retournera pas l'exception << méthode non trouvée >>,
ce qui n'est pas le cas des langages à objets dynamiquement typés.
Le polymorphisme paramétrique des types d'Objective CAML permet
l'implantation d'algorithmes généraux. Il est reconduit dans la
couche objet où les classes paramétrées produisent un code
générique, et non une expansion de code comme en engendrent les
templates d'autres langages. À lui seul, le polymorphisme
paramétrique est une composante importante de la réutilisabilité
de code.
L'extension objet ajoute une notion de polymorphisme d'inclusion qui
est obtenu en spécifiant les relations de sous-typage entre objets. Il
concilie la réutilisabilité de code, qui fait la force de la relation
d'héritage entre classes, avec la sûreté du typage statique.
Bibliothèques et outils
Les bibliothèques fournies avec la distribution couvrent de larges
besoins. Le programmeur y retrouve, en standard, l'implantation des
structures de données les plus usuelles avec leurs fonctions de
base. Citons : piles, files d'attente, tables de hachage, AVL. On y
trouve également des outils plus avancés comme le traitement des flots
de données. Ces bibliothèques s'enrichissent au fil des versions du
langage.
La bibliothèque Unix autorise une programmation
de plus bas niveau tant pour les entrées-sorties, que pour la
gestion des processus. Elle n'est pas identique pour toutes les
plate-formes ce qui limite en partie son utilisation.
La bibliothèque d'arithmétique exacte et la bibliothèque d'expressions
régulières facilitent le développement d'applications spécifiques.
On peut regretter que la bibliothèque graphique portable offre peu
de fonctionnalités permettant la construction d'interfaces graphiques.
Des bibliothèques C permettent un interfaçage aisé entre ce
langage et Objective CAML. Ici, la libre disponibilité de sources bien
structurées et dûment commentées est un facteur d'ouverture
certain vers l'extérieur et les bibliothèques diverses et variées
que l'on peut y trouver.
Parmi les outils fournis, on peut citer plus spécialement ceux
d'analyses lexicale et syntaxique indispensables lorsque l'on
doit traiter des données textuelles complexes. Basés sur
les classiques lex et yacc, ils s'intègrent parfaitement
aux types somme et à la fonctionnalité d'Objective CAML, les rendant
ainsi plus simples d'utilisation que leurs aînés.
Enfin, quelle que soit la solidité qu'apportent ses traits,
l'utilisation d'un langage << en condition réelle >> n'évite
jamais les phases de mise au point d'un programme. La distribution
Objective CAML 2.04 ne fournit pas d'environnement intégré de
développement. Certes, l'utilisation
de la boucle d'interaction permet de procéder rapidement à la
compilation et aux tests unitaires des fonctions (ce qui est un
avantage indéniable), mais cette utilisation variera selon les
systèmes et les programmeurs : copier-coller sous X-Windows,
appel de l'interprète de commande sous emacs, demande d'évaluation d'un
tampon sous Windows.
La version suivante (voir annexe B)
propose un premier
environnement pour Unix contenant un navigateur d'interfaces de modules et
un éditeur structuré
lié à la boucle d'interaction.
Enfin le debugger
de la distribution reste d'emploi difficile (en particulier,
à cause de l'aspect fonctionnel et du polymorphisme paramétrique du langage) et limité au
système Unix.
Documentation
La documentation de la distribution est constituée par le manuel de
référence en version imprimable (PostScript) ou en ligne (HTML). Ce
manuel n'est en aucun cas une introduction au langage. Par contre il
est indispensable pour connaître la teneur des bibliothèques ou les
paramètres des commandes. On trouve du matériel pédagogique à la page
de Caml de l'Inria, mais il porte principalement sur le
langage Caml-Light. Il manque donc un manuel d'apprentissage
complet du langage, nous espérons que cet ouvrage comble ce manque.