Author: Christian.Queinnec@lip6.fr

## É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.