Objective Caml

Image manquante
Langage_progr.png
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
Simula - Smalltalk
Visual Basic
Langages impératifs
APL - ASP - Assembleur
BASIC - C - COBOL
Forth - FORTRAN - Logo
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 une évolution du langage Caml ou Caml Light (acronyme qui signifiait à l'origine Categorical Abstract Machine Language), 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

See also: Objective Caml, APL (langage), Active server pages, Ada (langage), Assembleur (langage), Basic, CLOS, COBOL, C (langage)