Page d'accueil encyclopedie-enligne.com en page d'accueil
Liste Articles: [0-A] [A-C] [C-F] [F-J] [J-M] [M-P] [P-S] [S-Z] | Liste Catégories | Une page au hasard | Pages liées

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, développé à et distribué par l'INRIA, projet Cristal.

Il permet aussi bien la programmation impérative que la programmation fonctionnelle. Ocaml est une évolution du langage CAML (acronyme qui signifiait à l'origine Categorical 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 à celle des compilateurs 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 performante. À 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 perfectionné, 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



This site support the Wikimedia Foundation. This Article originally from Wikipedia. All text is available under the terms of the GNU Free Documentation License Page HistoryOriginal ArticleWikipedia