English version
Accueil     À propos     Téléchargement     Ressources     Contactez-nous    

Une histoire de Caml

« Caml » était à l'origine un acronyme pour Categorical Abstract Machine Language. C'était un jeu de mots sur CAM, la Machine Abstraite Catégorique, et ML, la famille de langages de programmation à laquelle Caml appartient. Le nom Caml est resté à travers l'évolution du langage, bien que l'implantation actuelle n'ait rien à voir avec la CAM.

Caml fut d'abord conçu et implanté par l'équipe Formel de l'INRIA, dirigée par Gérard Huet. Son développement continue aujourd'hui dans l'équipe Cristal.

L'origine

L'équipe Formel commença à s'intéresser au langage ML en 1980-81. ML était le méta-langage de la version d'Édimbourg de l'assistant de preuve LCF, tous deux conçus par Robin Milner. Il était implanté par une sorte d'interprète écrit en Lisp par Mike Gordon, Robin Milner et Christopher Wadsworth. LCF lui-même était écrit partiellement en ML et partiellement en Lisp. Pour pouvoir utiliser l'assistant de preuve LCF sur les divers systèmes alors exploités chez Formel (Multics, Berkeley Unix sur Vax, Symbolics), Gérard Huet décida de rendre l'implantation de ML compatible avec les différents compilateurs Lisp (MacLisp, FranzLisp, LeLisp, ZetaLisp). Guy Cousineau et Larry Paulson participèrent à ce travail. Les performances de cette implantation de ML furent améliorés par l'ajout d'un compilateur. Guy Cousineau ajouta également les types de données algébriques et le filtrage, d'après des idées de Milner, que lui-même avait empruntées à Hope, un langage de programmation conçu par Rod Burstall et Dave McQueen. À un certain moment, cette implantation fut nommée Le_ML, appellation qui ne survécut pas. Elle fut utilisée par Larry Paulson pour développer Cambridge LCF et par Mike Gordon pour la première version de HOL, comme le rappelle la courte histoire de HOL de Gordon.

Vers 1984, trois événements nous encouragèrent à prendre une part plus grande dans le développement de ML:

Ceci poussa Guy Cousineau à développer une nouvelle implantation de ML, basée sur la CAM. Cependant, le langage que nous implantâmes finalement ne fut pas Standard ML, mais... Caml. Pourquoi? Notre principale raison pour développer Caml était de l'utiliser pour développer le système Coq, qui, suite à la thèse de Thierry Coquand en 1985, devint le principal objectif de l'équipe. Nous n'étions pas pressés d'adopter un standard qui risquait ensuite de nous empêcher d'adapter le langage à nos besoins en tant que programmeurs. En particulier, Philippe Le Chenadec et Michel Mauny développèrent des outils de manipulation syntaxique, qui furent jugés utiles et incorporés dans Caml. Devoir nous synchroniser avec l'équipe Standard ML avant de pouvoir adopter les modifications du langage qui nous semblaient utiles aurait retardé notre travail de façon trop importante. De plus, notre philosophie entrait en conflit avec celle d'un langage « standard », qui n'est pas censé évoluer trop rapidement. Néanmoins, nous incorporâmes effectivement dans Caml la plupart des améliorations apportées par Standard ML vis-à-vis du ML d'Édimbourg.

La première implantation

La première implantation de Caml fut publiée en 1987, et développée jusqu'en 1992. Elle était principalement l'œuvre d'Ascander Suarez. Après le départ d'Ascander en 1988, Pierre Weis et Michel Mauny continuèrent le développement et la maintenance du système. Cette implantation compilait Caml vers LLM3, la machine virtuelle du système Le_Lisp.

Guy Cousineau se souvient modestement: « Je dois admettre que lorsque le développement de Caml commença, mon expérience de l'implémentation des langages de programmation était très limitée. S'appuyer sur la machine abstraite LLM3 et sur le système d'allocation et de gestion de mémoire de Le_Lisp nous évitait un gros travail, mais ne permettait pas d'atteindre une grande efficacité. Le modèle CAM permettait la construction rapide des clôtures et un bon partage des environnements mais pénalisait l'accès à l'environnement et rendait les optimisations difficiles. De plus, il introduisait potentiellement des fuites de mémoire, puisque des valeurs inutiles étaient conservées à l'intérieur des clôtures. Par ailleurs, je n'avais pas réalisé qu'il était plus important d'offrir de bonnes performances aux programmes non fonctionnels qu'aux programmes très fonctionnels. Par-dessus tout, j'avais négligé l'importance de la portabilité et de l'ouverture. Malgré ces inadéquations, dont je suis initialement responsable, Ascander, Pierre et Michel ont fait du beau travail. »

Caml Light

En 1990 et 1991, Xavier Leroy mit au point une implantation totalement nouvelle de Caml, basée sur un interprète de code-octets écrit en C. Damien Doligez fournit un excellent système de gestion de la mémoire. Cette nouvelle implantation, connue sous le nom de Caml Light, était hautement portable et fonctionnait aisément sur de petites machines de bureau comme les Macs et PCs. Elle remplaça l'ancienne implantation de Caml et aida beaucoup à répandre l'emploi de Caml dans l'enseignement et la recherche. Sa notion de flux de données et ses facilités pour l'analyse syntaxique, dues à Michel Mauny, faisaient suite à un effort de longue haleine de l'équipe Formel pour promouvoir les outils de manipulation syntaxique.

Caml Special Light

En 1995, Xavier Leroy publia Caml Special Light, qui surpassait Caml Light de plusieurs façons. En premier lieu, un compilateur optimisant produisant du code natif est venu complémenter le compilateur code-octets. Ce compilateur natif égalait ou surpassait les performances des meilleurs compilateurs existants pour les langages fonctionnels, et a permis à Caml d'être davantage compétitif, en termes de performances, vis-à-vis des langages de programmation impératifs classiques tels que C++. Par ailleurs, Caml Special Light proposait un système de modules de haut niveau, conçu par Xavier Leroy et inspiré par les modules de Standard ML. Ce système de modules fournit de puissants mécanismes d'abstraction et de paramétrisation, essentiels pour la programmation à grande échelle.

Objective Caml

Les systèmes de types et l'inférence de types pour la programmation par objets sont un domaine actif de recherche depuis le début des années 1990. Didier Rémy et ensuite Jérôme Vouillon ont conçu un système de types élégant et très expressif pour les objets et les classes. Ce design fut intégré à et implémenté dans Caml Special Light, donnant naissance au langage Objective Caml et à son implémentation, publiée pour la première fois en 1996 et renommée en OCaml en 2011. Objective Caml fut le premier langage de programmation a combiner toute la puissance de la programmation par objets avec un typage statique avec inférence dans le style de ML. Il est capable de reconnaître statiquement comme bien typés de nombreux idiomes difficiles de la programmation par objets (classes paramétrées par des types, méthodes binaires, spécialisation du type de l'objet), idiomes qui sont traités de manière non sûre ou à l'aide de vérifications dynamiques de types dans d'autres langages à objets comme C++ et Java.

En 2000, Jacques Garrigue ajouta à Objective Caml plusieurs nouveaux traits, qu'il avait expérimentés pendant quelques années dans le dialecte Objective Label. Parmi ceux-ci se trouvaient les méthodes polymorphes, les arguments de fonctions étiquetés et optionnels, et les variantes polymorphes.

La montée en puissance d'OCaml

Depuis la fin des années 1990, OCaml a régulièrement gagné en popularité et a attiré une communauté significative d'utilisateurs. En plus de programmes complets de haute technicité écrits en OCaml, cette communauté d'utilisateur a également contribué un bon nombre de bibliothèques, d'infrastructures et d'outils de haute qualité, allant des interfaces utilisateur graphiques et des interfaces avec des SGBD, à la programmation du Web et des réseaux, l'interopérabilité avec d'autres langages, et l'analyse statique de programmes. En parallèle, l'équipe initiale de développement d'OCaml travaille toujours activement sur le système de base, améliorant sans cesse la qualité de l'implémentation et l'adaptant aux architectures et systèmes les plus récents.

Quelques parents proches

En plus de ces versions officielles de Caml, il faut mentionner de nombreux compilateurs voisins. Michel Mauny et Daniel de Rauglaudre ont conçu Chamau, qui offre des possibilités de manipulation syntaxique uniques que l'on retrouve maintenant sous forme de pré-processeur dans le système Camlp4. Manuel Serrano et Pierre Weis ont créé BIGLOO. Régis Cridlig a produit Camlot. Jean Goubault-Larrecq a écrit HimML, qui est doté de « hash-consing » implicite et d'opérations efficaces sur les ensembles et cartes associatives. Emmanuel Chailloux a publié CeML. Dans l'équipe Para, Francis Dupont a implanté Caml pour des machines parallèles, tandis que Luc Maranget a construit Gaml, un compilateur pour un langage de programmation fonctionnel paresseux.

Citation finale

En 1996, Guy Cousineau écrivait: « L'histoire de Caml aurait certainement pu être plus linéaire. Néanmoins, à travers une série de tâtonnements, une capacité à produire des implantations de haute performance, portables et flexibles, pour les langages de programmation fonctionnels a émergé en France. »