Accueil |

Objective Caml

   

Le langage Objective CAML, aussi appelé Ocaml ou encore O'Caml, est un langage de programmation avancé de la famille des langages ML, developpé à  et distribué par INRIA. A ce titre, il permet aussi bien la programmation impérative que la programmation fonctionnelle. Ocaml est une évolution du langage CAML (acronyme qui signifiait à  l'origine Categorically Abstract Machine Language), auquel il ajoute les concepts de la programmation orientée objet et quelques améliorations syntaxiques.

Le code source peut aussi bien être compilé en code intermédiaire (ou bytecode) à  l'instar de Java ou en code natif pour de nombreuses architectures, dont IA32, IA64, PowerPC, AMD64, Sparc, Alpha, HP/PA, MIPS et StrongARM. Le compilateur natif est réputé pour sa grande efficacité, comparable au C/C++. Objective Caml dispose d'un typage statique avec inférence de types, de fonctions de première classe, du polymorphisme paramétrique, du pattern matching, de la fermeture lexicale, d'une gestion d'exceptions, et d'une gestion de mémoire automatisée. L'implémentation du ramasse-miettes (garbage collector en anglais) de type incrémental générationnel est particulièrement optimisée. A cela s'ajoute un système de modules récursifs et paramétrables ainsi qu'un système de classes évolué. Toutes ces caractéristiques, associées à  un préprocesseur performant, rendent le langage particulièrement expressif et sà»r.

Bien que beaucoup utilisé pour l'enseignement de la programmation, et la recherche, l'orientation généraliste d'Objective Caml ainsi qu'une base de bibliothèques importante lui trouvent des applications dans de nombreux domaines : bioinformatique, base de donnée généalogique, jeux, compilateurs, système de preuve formelle, serveurs internet, etc.

Exemples de code

(* Manipulation de listes *)

 (* Les exemples ci-dessous fonctionnent sur des listes de n'importe quel type *)
 
 (* Longeur d'une liste *)
 let rec longueur  = function
   |[] -> 0
   |x::xs -> 1 + longueur xs;;

(* Tri d'une liste par insertion *) (* Une relation d'ordre doit être définie *) let rec trie = function |[] -> [] |x::xs -> insere x (trie xs) and insere e = function |[] -> [e] |x::xs -> if x > e then e::x::xs else x::(insert e xs);;

# let l = ["La"; "vie"; "est"; "un"; "long"; "fleuve"; "tranquille"];; - : string list = ["La"; "vie"; "est"; "un"; "long"; "fleuve"; "tranquille"]

# longueur l;; - : int = 7

# trie l;; - : string list = ["La"; "est"; "fleuve"; "long"; "tranquille"; "un"; "vie"]

(* Arbres *)

 (* Définition d'un arbre binaire, d'un type quelconque 'a *)
 type 'a arbre = Noeud | Arbre of ('a arbre * 'a * 'a arbre);;

let a = Arbre(Noeud, 4, Arbre(Noeud, 2, Noeud));; (* Hauteur de l'arbre *) let rec hauteur = function |Noeud -> 0 |Arbre(gauche, _, droit) -> 1 + max (hauteur gauche) (hauteur droit) ;; # hauteur a;; - : int = 2

(* Recherche de racine par dichotomie *)
 let rec dicho f min max eps =
   let fmin = f min and fmax = f max in
     if fmin *. fmax > 0.
     then failwith "Aucune racine"
     else if max -. min < eps then (min, max) (* retourne un intervalle *)
     else let mil = (min +. max) /. 2. in
       if (f mil) *. fmin < 0.
       then dicho f min mil eps
       else dicho f mil max eps ;;

(* Approximation de la racine carrée de 2 *) # dicho (fun x -> x *. x -. 2.) 0. 10. 0.000000001;; - : float * float = (1.4142135618, 1.41421356238)

Liens Externes