Un petit mot
sur la compilation séparée et
les librairies de fonctions
en OCAML
Compilation et création d'un
exécutable
Un code
source est un fichier .ml
qui contient des phrases
Ocaml
(le nom du fichier doit commencer par un minuscule).
Pour compiler un code source, disons toto.ml
et créer un code exécutable,
disons toto.exe
, la commande est :
ocamlc toto.ml -o toto.exe
On peut ensuite exécuter le code exécutable toto.exe
par :
./toto.exe
Exercice :
- télecharger le code source fib.ml
- compiler le et créer un code exécutable fib.exe
- exécuter la commande ./fib.exe 10
Compilation séparée
Pour les applications de taille plus conséquente, il est courant
de découper le code source en plusieurs petits fichiers.
Par exemple :
toto_1.ml
toto_2.ml
...
toto_n.ml
On peut compiler chacun de ces fichiers séparement les uns des autres
en utilisant la commande ocamlc
avec l'option -c
.
Ainsi pour compiler
un fichier toto_i.ml
, la commande est :
ocamlc -c toto_i.ml
On
obtient un code objet toto_i.cmo
.
Une fonction, disons f
, du fichier toto_i.ml
,
a pour nom Toto_i.f
dans un autre fichier. Attention à mettre une majuscule
à Toto_i
. On peut toutefois éviter de préciser à chaque
fois le
préfixe "Toto_i.
" devant le nom f
de la
fonction, en tapant
au préalable la phrase open Toto_i;;
dans cet autre
fichier source.
Pour créer un code exécutable (rassembler les codes objets),
la commande est :
ocamlc
toto_1.cmo
toto_2.cmo
... toto_n.cmo -o toto.exe
NB:
- Attention l'ordre des noms de fichiers dans la liste a
de l'importance.
Il faut passer les .cmo
dans l'ordre des
dépendances entre fonctions :
une fonction ne peut pas être utilisée avant d'avoir été définie.
On peut aussi utiliser toutes les fonction
s définies dans
un fichier toto_i.ml
depuis l'interpreteur (prompt #
) en le compilant et en
chargeant le code objet par :
#load "toto_i.cmo";;
NB :
- Il faut taper le #
devant la commande load
- Les mêmes règles s'appliquent concernant les noms de fonctions
Exemple :
# #load "toto_i.cmo";;
# Toto_i.f;;
val f : 'a -> 'b = <fun>
# open Toto_i;;
# f;;
val f :
'a -> 'b = <fun>
Utilisation de librairies de fonctions prédéfinies
Un certain nombre de librairies de fonctions sont à disposition du
programmeur :
Chacune de ces librairies se présente sous la forme de 2 fichiers:
un fichier .cma
et un fichier .cmi
dans
le répertoire /usr/lib/ocaml
.
On peut utiliser les fonctions d'une librairie depuis l'interpréteur
comme pour les fonctions d'un code objet. Par exemple, pour utiliser
les fonctions de la librairie graphique, on peut taper :
#load "graphics.cma";;
open Graphics;;
On peut aussi utiliser les fonctions d'une librairie dans un code
source,
disons toto.ml
. Pour cela,il faut placer la commande open
(par exemple open
Graphics;;
)
au début du fichier
. On compilera ensuite le code source
avec la commande :
ocamlc /usr/lib/ocaml/graphics.cma toto.ml -o
toto.exe
Création de nouvelles
librairies
On peut créer une nouvelle librairie de fonctions, disons libtoto.cma
,
à partir de codes objets, disons toto_1.cmo
, toto_2.cmo,
...,
toto_n.cmo
et d'un fichier libtoto.ml
, en utilisant la commande ocamlc
avec l'option -a
:
ocamlc -a toto_1.cmo
toto_2.cmo
...
toto_n.cmo libtoto.ml -o libtoto.cma
Cette commande crée les fichiers libtoto.cma
et libtoto.cmi
.
Le fichier libtoto.ml
doit contenir la liste des
définitions
des fonctions de la librairie. Pour définir une fonction
on peut utiliser une fonction définie dans un toto_i
de
la liste.
Exemple :
let f = Toto_i.f;;
[Page réalisée par Eric
Violard]