Caml est un langage de programmation, à la fois facile à apprendre et cependant étonnamment expressif.
Il est développé et distribué par l'INRIA depuis 1984 et il est disponible gratuitement pour les machines Unix, PC ou Macintosh.
Il existe deux dialectes de Caml: Caml Light et Objective Caml. Caml Light est un sous-ensemble d'Objective Caml, plus spécialement adapté à l'enseignement et à l'apprentissage de la programmation. En plus du coeur du langage de Caml Light, Objective Caml comporte un puissant système de modules, des objets et un compilateur optimisant.
Je donne ici un bref aperçu du langage, qui permet de se faire une idée des traits saillants de Caml.
Pour les impatients, la page qui donne les programmes Caml qui illustre ce texte est Une centaine de lignes de Caml.
Pour obtenir le CD-ROM, écrire à
INRIA - SICS Diffusion
Distribution de Caml Light
B.P. 105
78153 Le Chesnay CEDEX
France
en fournissant une enveloppe (appropriée à contenir un CD-ROM) portant vos nom et adresse, et un coupon-réponse international ou 4 timbres français au tarif lettre.
Le langage Caml est très sûr. Le compilateur fait de nombreuses vérifications avant la compilation des programmes. De nombreuses erreurs de programmation deviennent ainsi impossibles en Caml: confusions de types de données, accès erronés à l'intérieur des données par exemple. En effet, tous ces points sont vérifiés et gérés automatiquement par le compilateur, ce qui garantit l'intégrité parfaite des données manipulées par les programmes.
Caml est typé statiquement, mais il est inutile d'ajouter des informations de type dans les programmes (comme en Ada, en Pascal ou en C): les annotations de typage sont automatiquement calculées par le compilateur.
Il existe en Caml de nombreux types de données prédéfinis:
Au-delà de ces types prédéfinis, Caml propose de puissants moyens de définir de nouveaux types: types enregistrements, types énumérés, et types sommes généraux. Les types sommes sont une généralisation des types unions, à la fois simple, sûre et facile à maîtriser. Ils permettent la définition de types de données qui présentent des valeurs hétérogènes repérées par des constructeurs de valeurs.
Au gré du programmeur, tous ces types sont définissables concrètement (les constructeurs sont disponibles à l'extérieur du module) ou abstraitement (l'implémentation est restreinte au module de définition et les constructeurs sont invisibles à l'extérieur).
Ce mécanisme autorise un contrôle fin du degré d'encapsulation des données manipulées par les programmes, ce qui est indispensable pour la programmation à grande échelle.
Caml est un langage de programmation fonctionnel: il n'y a pas de restriction à la définition et à l'usage des fonctions, qu'on peut librement passer en argument ou retourner en résultat dans les programmes.
Caml offre une gestion automatique de la mémoire: l'allocation et la
libération des structures de données est implicite
(il n'y a pas de primitives de manipulation explicite de la mémoire
comme ``new'' ou ``free'' ou ``dispose''), et laissée à la charge du
compilateur. On obtient ainsi une programmation bien plus sûre,
puisqu'il n'y a jamais de corruption inattendue des structures de
données manipulées.
De plus le gestionnaire mémoire opère en parallèle avec l'application,
sans jamais l'arrêter de façon notable (récupération mémoire
incrémentale).
Caml offre la panoplie complète des traits de la programmation impérative, en particulier les tableaux modifiables en place, les boucles et les variables affectables, les enregistrements avec champs physiquement modifiables.
Caml propose un compilateur de fichiers, et la compilation séparée est assurée par un système de modules. De surcroît, le compilateur Caml comporte une option qui maximise la vitesse de compilation, la portabilité des programmes obtenus, et minimise la taille des exécutables (compilation en code-octets).
Le compilateur d'Objective Caml comporte en plus une option ``optimisante'' qui privilégie la vitesse d'exécution (compilation en code natif): le compilateur optimisant d'Objective Caml produit des programmes dont la vitesse d'exécution est digne des meilleurs compilateurs disponibles actuellement.
Caml offre également un système interactif (une boucle de lecture-évaluation-impression des résultats), qui est très pratique pour apprendre le langage ou essayer et corriger ses programmes: il n'y a pas besoin d'utiliser forcément des fichiers, ni d'ajouter des ordres d'impression dans les programmes puisque les résultats sont imprimés automatiquement par le système interactif.
Caml vous propose la ``programmation orientée par filtrage'': cette puissante méthode de programmation est une généralisation de l'analyse de cas traditionnelle qui est maintenant disponible pour tous les types de données du langage. Le mécanisme de filtrage est un moyen concis et élégant de ``tester et de nommer'' les données en une seule opération. Le compilateur Caml tire avantage de ce trait unique pour faire de nombreuses vérifications sémantiques sur le code qui lui est soumis: le vérificateur de filtrage du compilateur est capable de détecter les branches inutiles des analyses de cas (``ce cas ne se présentera jamais à l'exécution'') et, plus étonnant encore, de détecter les cas oubliés (``ce cas n'est pas envisagé par votre programme''). Ainsi, le vérificateur de filtrage met souvent le doigt sur de subtiles erreurs qui se glissent dans les programmes. De surcroît, le vérificateur de filtrage est capable d'apporter la preuve de couverture exhaustive des cas des programmes qui utilisent le filtrage.
Le filtrage apporte un confort inégalé dans le traitement symbolique des données.
Le vérificateur de filtrage procure un niveau de sécurité dans la programmation et un degré de qualité inégalé des programmes qui manipulent des données symboliques.
Caml possède un mécanisme général d'exceptions, pour traiter ou corriger les erreurs ou les situations exceptionnelles.
Plusieurs méthodes de mise au point des programmes s'offrent à vous en Caml:
Caml est doté d'un puissant typage ``polymorphe'': certains types
peuvent rester indéterminés, représentant alors ``n'importe
quel type''.
Ainsi, les fonctions et procédures qui sont d'usage général
s'appliquent à n'importe quel type de données, sans exception
(par exemple les routines de tri s'appliquent à tout type de
tableaux).
Caml est un langage ``strict'', par opposition aux langages paresseux. Cependant la pleine fonctionnalité permet de créer des suspensions et donc de coder l'évaluation paresseuse de données potentiellement infinies.
Les programmes Caml sont formés d'unités de compilation que le
compilateur compile séparément. Ces organisation est parfaitement
compatible avec l'utilisation d'outils traditionnels de gestion de
projets (comme l'utilitaire make
d'Unix). Le système de
module du langage est puissant et sûr (toutes les interactions entre
modules sont statiquement vérifiées par le contrôleur de types). Les
modules d'Objective Caml peuvent comporter des sous-modules (à un degré
d'emboîtement quelconque) et les fonctions des modules dans les
modules sont autorisées (ce qui permet de définir des modules
paramétrés par d'autres modules).
Objective Caml propose des objets qui permettent d'utiliser le style orienté objets dans les programmes Caml. Fidèle à la philosohie du langage, cette extension orientée objets obéit au paradigme du ``typage fort'': en conséquence, aucune méthode ne peut être appliquée à un objet qui ne pourrait y «répondre» («les méthodes sont toujours bien comprises»). Encore une fois, cette vérification systématique du compilateur évite de nombreuses erreurs. Ceci offre au programmeur Caml, outre un confort insoupçonné dans l'écriture de ses programmes orientés objets, un niveau inégalé de qualité des programmes qu'il produit.
De nombreuses bibliothèques et contributions sont disponibles en
Caml, en particulier des primitives de dessin indépendantes de la
machine (libgraph), une arithmétique rationnelle exacte en
multi-précision (camlnum), et de nombreuses interfaces avec des
technologies bien connues: générateurs d'analyseurs lexicaux et
syntaxiques avec camllex
et camlyacc
. Sous
Unix, on dispose aussi d'un débogueur avec retour arrière, d'un
navigateur dans les fichiers sources (camlbrowser
), d'une
interface graphique à l'aide de Tk/Tcl (camltk
) et d'une
interface poussée avec le système (libunix
).
Une centaine de lignes de Caml vous donne une idée de l'expressivité de Caml.
Caml est utilisé dans les cours d'enseignement de la programmation,
depuis les débutants jusqu'aux étudiants de troisième cycle.
Dans ce domaine, la gestion automatique de la mémoire est de première
importance.
Les cours de Caml pour débutants les plus importants sont: le CNAM
(10000 étudiants), l'option informatique des classes préparatoires aux
grandes Écoles (1000 étudiants).
Parmi les cours de troisième cycle, pour étudiants avancés, citons:
l'École Polytechnique (100 étudiants), l'École Normale Supérieure (50
étudiants).
Caml est utilisé pour implémenter des systèmes complexes, comme des démonstrateurs de théorèmes ou des compilateurs. Un bon compilateur écrit en Caml est le compilateur Caml Light! L'assistant à la démonstration de théorèmes, le système coq est écrit en Caml. Ensemble, une boîte à outils pour fabriquer des applications distribuées développée à l'Université Cornell aux États-Unis, est écrite en Objective Caml. Le navigateur réseau MMM est aussi écrit en Caml.
Pour avoir plus d'information sur le système Caml Light, voyez Survol de l'implémentation de Caml Light.
Pour avoir plus d'information sur Objective Caml, voyez sa page principale.
Contacter l'auteur Pierre.Weis@inria.fr