OCaml est un langage qui se place dans l'histoire des langages de programmation comme un lointain descendant de LISP ayant su tirer les enseignements de ses cousins en incorporant les principales caractéristiques des autres langages. Il est développé à l'INRIA et s'appuie sur une longue expérience de conception de langages de la famille ML. OCaml est généraliste pour l'expression d'algorithmes symboliques ou numériques. Il est orienté objet et possède un système de modules paramétrés. Il permet le développement d'applications concurrentes ou distribuées. Il possède une excellente sûreté à l'exécution grâce à son typage statique, son mécanisme d'exceptions et son récupérateur automatique de mémoire. Il est performant tout en étant portable. Enfin, il dispose d'un riche environnement de développement.
OCaml est développé et maintenu principalement par des chercheurs et ingénieurs de l'INRIA (équipe-projet Gallium, SED de Rocquencourt, Pierre Weis de l'équipe-projet Estime), des chercheurs extérieurs comme Jacques Garrigue (Université de Nagoya, au Japon) ou encore des entreprises membres du Consortium OCaml (OCamlpro, Lexifi, Jane Street, ...).
Nous listons ici les traits principaux d'OCaml. Tous ces aspects ne sont pas abordés dans cette formation. Ceux qui le sont figurent en gras.
Il existe plusieurs façons d'exécuter un programme OCaml:
Il est possible d'interpréter le code d'un programme, de façon interactive ou non, grâce au toplevel. Le toplevel OCaml permet de saisir et exécuter interactivement du code OCaml, de la même façon que dans un interprète de commandes UNIX (shell). L'inférence et la vérification des types sont faites et le code exécuté immédiatement. Ce mode permet de tester facilement de petits bouts de programme, sans avoir à compiler puis exécuter toute une application.
Le toplevel est lancé par la commande ocaml. L'utilisateur peut alors saisir des phrases OCaml terminées par ";;" qui sont évaluées immédiatement. Le toplevel affiche les types et valeurs des expressions évaluées avant de réafficher le prompt:
# "Bonjour le monde !" (* code saisi par l'utilisateur *);; - : string = "Bonjour le monde !" # 42.0;; - : float = 42.
Il est possible de charger des modules additionnels compilés (cf. chapitre Programmation modulaire) soit en donnant ces modules sur la ligne de commande:
soit en utilisant des directives de chargement #load à l'invite du toplevel:
# #load "mon_module.cmo";; Cannot find file mon_module.cmo. # #load "mon_module2.cmo";; Cannot find file mon_module2.cmo.
Le contenu des modules chargés est alors accessible depuis le code saisi dans le toplevel.
Il est également possible de lancer le toplevel sur un fichier de code OCaml, ce dernier sera évalué comme si son contenu était saisi à l'invite du toplevel:
Pour faciliter la saisie de code (historique, utilisation des flèches du clavier, ...) et l'évaluation dans le toplevel, on pourra utiliser un toplevel amélioré, Utop, installable via Opam.
Il existe également un éditeur graphique dédié à l'apprentissage d'OCaml: OCaml-top.
Un environnement en ligne d'apprentissage d'OCaml, avec des exercices, est également disponible: Learn-OCaml.
Pour la suite de la formation, nous utiliserons un éditeur et ferons exécuter notre code par la commande
Pour en savoir plus sur le toplevel, consulter le manuel ici.
Il existe deux compilateurs OCaml différents, l'un compilant vers du code-octet (byte-code), l'autre vers du code natif.
Le code-octet peut être exécuté par une machine virtuelle OCaml sur d'autres architectures que celle pour laquelle il a été compilé. C'est le même principe que le code-octet pour machine virtuelle Java. Des performances moindres sont la contrepartie de cette portabilité. Par ailleurs, dans le cas d'utilisation de bibliothèques C, ces bibliothèques doivent être présentes sur la machine d'exécution.
Les principales extensions des fichiers utilisées par les compilateurs OCaml et leurs significations sont indiquées dans le tableau de la Figure 1.
.ml | Source d'implémentation (équivalent des .c en C) |
.mli | Source d'interface (cf. chapitre Programmation modulaire, sorte d'équivalent des .h en C) |
.cmo | Implémentation compilée en code-octet |
.cmi | Interface compilée |
.cmx et .o | Implémentation compilée en code natif |
.cma | Bibliothèque (regroupement de plusieurs implémentations compilées) en code-octet |
.cmxa et .a | Bibliothèque en code natif |
.cmxs | Bibliothèque en code natif compilée pour le chargement dynamique. |
Le compilateur code-octet est ocamlc, invoqué par des commandes de la forme suivante:
Les options les plus courantes sont les suivantes:
Beaucoup d'autres options de compilation existent. Nous ne présentons ici que les options de base permettant de compiler des programmes simples. On se réfèrera donc au manuel pour connaître toutes les options et possibilités du compilateur.
La compilation vers du code natif permet d'obtenir de bien meilleures performances pour l'exécutable produit. Cependant, l'exécutable obtenu ne peut pas être exécuté sur d'autres architectures que celle sur laquelle il a été compilé.
Le compilateur vers du code natif est ocamlopt. Il s'utilise de la même façon que le compilateur ocamlc (cf. cette section), mais utilise des extensions différentes pour les fichiers utilisés et produits (cf. Figure 1).
On peut consulter la documentation relative au compilateur vers du code natif.
Le site https://ocaml.org/ est le site officiel d'OCaml et on y trouve, en plus des distributions, tout le matériel nécessaire pour débuter en OCaml: documentations, références de livres, tutoriels, liens, ...
Les documentations de base pour développer en OCaml sont les suivantes: