Objective Caml
Un article de Freepedia.
| Image:Langage progr.png |
| Cet article fait partie de la série Langages de programmation |
| Langages à objets |
| Ada 95 - C++ - C# Common Lisp Delphi - Eiffel - Java Nice - Oz - Python Ruby - Simula - Lisaac Smalltalk - Visual Basic |
| Langages impératifs |
| APL - ASP - Assembleur BASIC - C - Cobol Forth - Fortran - Logo OPL - Pascal - Perl - PHP |
| Langages fonctionnels |
| Erlang - Haskell ML/OCaml - Oz Lisp/Common Lisp Scheme |
| Langages déclaratifs |
| Clips - Oz - Prolog |
| Langages concurrents |
| Ada 95 - Erlang Java - Oz |
| Langages balisés |
| HTML - SGML - XML Dialectes XML S-expressions |
| Voir aussi |
| Conception - Codage Tests - Optimisations |
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 la principale implémentation du langage Caml (acronyme qui signifiait à l'origine Categorical Abstract Machine Language). Il représente une évolution de l'implémentation légère Caml Light auquel il ajoute les concepts de la programmation orientée objet et de la programmation modulaire, ainsi que des 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 et automatique 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, création de prototypes, etc.
Sommaire |
Exemples de code
Manipulation de listes
(* Les exemples ci-dessous fonctionnent sur des listes de n'importe quel type *) (* Longueur 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 :: (insere e xs);;
(* Tri rapide (quicksort ou tri de Hoare) d'une liste *)
let rec qsort = function
| [] -> []
| x :: l ->
let rec coupelist = function
| [] -> [], []
| y :: m -> let a, b = coupelist m in
if y < x then y :: a, b else a, y :: b
in let debut, fin = coupelist l
in (qsort debut) @ [x] @ (qsort fin);;
# 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
- site OCaml officiel de l'Inria
- www.ocaml.org le même site, avec un nom plus facile à retenir.
- Le CocanWiki (en) Un wiki dédié au langage Ocaml et ses applications industrielles.
- Développement d'applications avec Objective Caml, livre O'Reilly en ligne (publié en 2002 mais reste très complet).
- cours de programmation en Caml pour débutants
- A brief history of Caml (as I remember it) (en)



