Débuter avec OCaml

Installation ou configuration

Installer OPAM

[OPAM][1] est un gestionnaire de paquets pour OCaml. Il construit et gère facilement les versions du compilateur et les bibliothèques OCaml.

Le moyen le plus simple d’installer OPAM sur votre système d’exploitation consiste à utiliser un gestionnaire de packages pour votre système. par exemple apt-get, yum ou homebrew.

## Instructions d’installation de Mac OSX

Mettez à jour les formules [homebrew][2] et installez OPAM.

brew update
brew install opam

##Instructions d’installation d’Ubuntu

add-apt-repository ppa:avsm/ppa
apt-get update
apt-get install ocaml opam

Compilation à partir des sources

wget http://caml.inria.fr/pub/distrib/ocaml-4.03/ocaml-4.03.0.tar.gz
tar xf ocaml-4.03.0.tar.gz
cd ocaml-4.03.0
./configure -prefix installation_path
make world.opt
make install

Initialisation d’OPAM

Une fois que vous avez installé OPAM, lancez opam init et suivez les instructions.

Une fois cela fait, vous devriez pouvoir exécuter l’interpréteur OCaml à partir de votre shell.

$ ocaml
        OCaml version 4.03.0

#

[1] : https://opam.ocaml.org/ [2] : http://brew.sh/

Votre premier programme en OCaml

Maintenant que la distribution OCaml est disponible sur votre système d’exploitation préféré, nous pouvons créer votre premier programme en OCaml : le Hello World !

Nous avons différentes manières de lancer un programme OCaml.

Le REPL (niveau supérieur)

Vous pouvez exécuter votre code interactivement avec le toplevel. Avec le toplevel OCaml, vous pouvez écrire et exécuter du code OCaml, comme un shell UNIX. Ensuite, le toplevel vérifie immédiatement le type de votre code. Ainsi, vous pouvez tester rapidement et facilement certaines parties de code sans compilation ni exécution.

Vous pouvez lancer le toplevel avec la commande ocaml. Ensuite, vous pouvez écrire une phrase OCaml terminée par ;; qui est évaluée immédiatement. Le toplevel affiche le type et la valeur de votre expression juste après :

# "Hello Worlds!";;
- : string = "Hello Worlds!"

Il est aussi possible de lancer le toplevel sur votre dossier. Vous pouvez voir cette [explication][1] à ce sujet.

Pour faciliter votre saisie dans le toplevel, vous pouvez utiliser un outil comme ledit ou rlwrap qui fournit certaines fonctionnalités (comme l’historique des entrées) :

 $ ledit ocaml

 $ rlwrap ocaml

Compilation vers le bytecode

Nous avons deux compilateurs différents, l’un qui compile en bytecode et l’autre qui compile en code natif. Le premier est le même que le bytecode de la machine virtuelle Java. Ainsi, le bytecode est moins efficace mais plus portable.

Nous avons quelques fichiers d’extensions utilisés par les compilateurs OCaml :

extension définition
.ml Le code source (comme .c en C)
.mli L’interface (comme .h en C)
.cmo Code source compilé par ocamlc en bytecode
.cmi Code d’interface compilé par ocamlc
.cmx et .o Code source compilé par ocamlopt en code natif
.cma Bibliothèque (compartiment de certains *.cmo) en bytecode
.cmxa et .a Bibliothèque en code natif
.cmxs Librairie en code natif (à charger dynamiquement)

Le compilateur bytecode est ocamlc.

Vous avez différentes options communes :

  • -c : pour compiler un fichier source sans processus de liaison (pour produire un exécutable). Ainsi, la commande ocaml -c foo.ml produit un fichier .cmo. Contrairement au C dans lequel le fichier d’en-tête n’a pas besoin d’être compilé, il est nécessaire en OCaml de compiler le fichier .mli : ocaml -c foo.mli.

Vous devez d’abord compiler l’interface. Lorsque vous compilez ensuite le fichier source, OCaml essaie de vérifier que l’implémentation correspond à l’interface.

Le fichier .mli n’est pas obligatoire. Si vous compilez un fichier .ml sans fichier .mli, OCaml produira automatiquement un fichier .cmi.

  • -o : pour compiler certains fichiers .cmo dans un exécutable. Par exemple : ocamlc -o program foo.cmo bar.cmo. Ces fichiers doivent être organisés selon les dépendances pour lesquelles le premier fichier n’a aucune dépendance.

  • -I : pour indiquer un autre répertoire où le compilateur peut trouver les fichiers nécessaires à la compilation (comme l’interface ou le code source). C’est la même chose que le -I d’un compilateur C.

Nous avons beaucoup d’autres options. Vous pouvez consulter le [manuel][manuel] pour plus d’informations.

Ainsi, vous pouvez écrire le hello.ml maintenant et compiler ce fichier avec ocamlc -o hello hello.ml pour produire un programme bytecode :

let () = print_endline "Hello World!"

Le let () = ... est la première entrée de votre programme (comme le main en C). Ensuite, nous utilisons la fonction print_endline (fournie par la bibliothèque standard) avec l’argument "Hello World!" pour imprimer Hello Worlds avec une nouvelle ligne dans la sortie standard.

Après la compilation, vous avez le fichier .cmo et le fichier .cmi produits automatiquement par le compilateur et votre programme hello. Vous pouvez ouvrir votre programme, et en haut de ce fichier, vous pouvez voir :

#!/usr/local/bin/ocamlrun

Cela signifie que votre programme a besoin du programme ocamlrun (fourni par la distribution) pour exécuter le bytecode (comme la JVM).

Compilation vers le code natif

Nous avons un autre compilateur qui produit du code natif. Le compilateur est : ocamlopt. Cependant, l’exécutable résultant ne peut pas fonctionner sur la plupart des autres architectures.

ocamlopt utilise les mêmes options que ocamlc donc vous pouvez exécuter ocamlopt -o hello hello.ml. Après, vous pouvez voir un fichier .cmx et un fichier .o.

Enfin, depuis votre programme bytecode/code natif, vous pouvez exécuter :

$ ./hello
Hello World!
$

[1] : https://www.wikiod.com/fr/ocaml/ecrivez-votre-premier-script-ocaml#Bonjour le monde [manuel] : http://caml.inria.fr/pub/docs/manual-ocaml/comp.html

Installation sur Windows (natif)

Prémisse

Ces instructions montrent une procédure pour installer des binaires OCaml natifs dans Windows. Si votre système d’exploitation est Windows 10 (Insider Preview) build 14316 ou une version ultérieure, vous pouvez également installer OCaml via [Bash on Ubuntu on Windows][1]. Dans ce cas, suivez les instructions pour installer OCaml sur Ubuntu.

Installer OCaml et Opam

Téléchargez [distribution officielle d’OCaml][2]. Il contient à la fois les compilateurs OCaml et le gestionnaire de paquets Opam. Supposons que vous ayez installé le logiciel dans C:/OCaml. Pour être sûr que vous avez correctement installé OCaml, ouvrez cmd.exe et tapez ocaml.

Si vous voyez le message 'ocaml' n'est pas reconnu comme une commande interne ou externe, un programme exécutable ou un fichier batch vous devez ajouter C:/OCaml/bin à votre chemin (variable d’environnement).

Ajouter des binaires OCaml au chemin

dans Panneau de configuration> Système et sécurité> Système> Paramètres système avancés (à gauche)> Variables d'environnement, puis sélectionnez Chemin dans l’onglet Variable système, puis Modifier.

Ajoutez C:/OCaml/bin; à la liste.

Installer Cygwin

Sans Cygwin, vous ne pouvez pas utiliser Opam. En fait, si vous essayez d’ouvrir Opam en tapant opam dans cmd.exe, un message s’affiche : Erreur fatale : exception Unix.Unix_error(20, "create_process", "cygcheck").

Téléchargez [Cygwin][3] et démarrez le programme d’installation. Assurez-vous de vérifier les packages suivants :

  • fabrication automatique
  • diffutils
  • libreadline
  • Fabriquer
  • m4
  • mingw64-x86_64-gcc-core
  • mingw64-x86_64-gmp
  • mingw64-x86_64-openssl
  • mingw64-x86_64-pkg-config
  • mingw64-x86_64-sqlite3
  • correctif
  • rlwrap
  • décompresser
  • wget

Supposons que vous ayez installé le logiciel dans C:/cygwin (C:/cygwin64 pour la version 64 bits). Ouvrez cmd et tapez wget (ou l’un des exécutables présents dans C:/cygwin/bin) pour vérifier si vous pouvez utiliser les exécutables Cygwin. Si l’exécutable ne s’ouvre pas, ajoutez C:/cygwin/bin à votre chemin (variable d’environnement).

Configurer Opam

Ouvrez cmd.exe et tapez opam init pour configurer Opam.

Ensuite, installez ocamlfind (partie du compilateur OCaml) avec

opam install ocamlfind
opam config env

Vérifiez si ocamlfind est installé en le tapant dans cmd.exe.

La commande opam config env est utilisée pour ajouter le répertoire des exécutables de opam au chemin de l’environnement. Si après la déconnexion vous ne pouvez plus accéder à ocamlfind, vous pouvez l’ajouter manuellement en ajoutant au chemin la ligne suivante : C:/Users/<your user>/Documents/.opam/system/bin/.

Installation de packages

Les packages sont installés via Opam avec la commande opam install xyzxyz est le nom du package.

Installer UTop

Essayez d’exécuter la commande opam install utop. Si vous n’avez aucune erreur, tapez “utop” pour ouvrir l’exécutable.

Si vous voyez le message

[ERROR] The compilation of zed failed at "ocaml setup.ml -build".

vous devez installer manuellement les packages individuels. Essayez à nouveau de saisir :

opam install zed
opam install lambda-term
opam install utop

lambda-term et utop peuvent ne pas s’installer. Voir la section Dépannage.

Installation du noyau

Vous pouvez installer le package core avec opam install core. Sur la version Windows 64 bits (et Cygwin 64 bits), vous verrez l’erreur suivante :

[ERROR] core is not available because your system doesn't comply with os != "win32" & ocaml-version = "4.02.3".

Dépannage : impossible de créer un fichier standard

Si le package portant le nom xyz.10.1 ne parvient pas à s’installer (où xyz est le nom du package et 10.1 sa version) avec le message suivant :

install: cannot create regular file '/cygdrive/c/Users/<your user>/Documents/.opam/system/bin/<something>': File exists

Il faut aller dans ce répertoire :

C:\Users\<your user>\Documents\.opam\repo\default\packages\<xyz>\<xyz.10.1>\files 

et supprimez le fichier xyz.10.1.install.

Dépannage : impossible de charger la bibliothèque partagée

Si vous essayez d’ouvrir un package Opam (par exemple : utop) et que vous voyez cette erreur :

Fatal error: cannot load shared library dlllwt-unix_stubs
Reason: The specified module could not be found.

Exécutez à nouveau opam config env et essayez de rouvrir l’exécutable.

[1] : https://en.wikipedia.org/wiki/Windows_Subsystem_for_Linux [2] : http://protz.github.io/ocaml-installer/ [3] : https://cygwin.com/install.html