OCaml

**OCaml** ( /oʊ ˈ k æ m əl / , më parë **Objektivi Caml** ) është një gjuhë programimi me qëllime të përgjithshme, të nivelit të lartë, me shumë paradigma, e cila zgjeron dialektin Caml të ML me veçori të orientuara nga objekti. OCaml u krijua në 1996 nga Xavier Leroy, Jérôme Vouillon,  Damien Doligez, Didier Rémy,  Ascánder Suárez dhe të tjerë.

Paketa e mjeteve OCaml përfshin një interpertues interaktiv të nivelit të lartë, një përpilues bytekodi, një përpilues të kodit vendas optimizues, një debugger të kthyeshëm dhe një menaxher paketash ( OPAM ) së bashku me një sistem ndërtimi të kompozueshëm për OCaml ( Dune ).OCaml fillimisht u zhvillua në kontekstin e vërtetimit të automatizuar të teoremës, dhe përdoret në analizat statike dhe softuerët e metodave formale. Përtej këtyre fushave, ai ka gjetur përdorim në programimin e sistemeve, zhvillimin e uebit dhe shërbimet specifike financiare, midis fushave të tjera të aplikacioneve.

Akronimi *CAML* fillimisht qëndronte për *Categorical Abstract Machine Language (Gjuhën e Makinerisë Abstrakte Kategorike)* , por OCaml e lë jashtë këtë makinë abstrakte .  OCaml është një projekt softuerësh falas dhe me burim të hapur i menaxhuar dhe mirëmbajtur kryesisht nga Instituti Francez për Kërkime në Shkenca Kompjuterike dhe Automatizim (Inria). Në fillim të viteve 2000, elementët nga OCaml u adoptuan nga shumë gjuhë, veçanërisht F# dhe Scala.

## Filozofia 
Gjuhët e prejardhura nga ML janë më të njohura për sistemet e tyre të tipit statik dhe përpiluesit që nxjerrin përfundimin e tipit. OCaml unifikon programimin funksional, imperativ dhe të orientuar nga objekti nën një sistem të tipit ML. Kështu, programuesit nuk duhet të jenë shumë të njohur me paradigmën e pastër të gjuhës funksionale për të përdorur OCaml.

Duke kërkuar që programuesi të punojë brenda kufizimeve të sistemit të tij të tipit statik, OCaml eliminon shumë nga problemet e kohës së funksionimit të lidhura me tipin që lidhen me gjuhët e shtypura në mënyrë dinamike. Gjithashtu, përpiluesi i tipit OCaml redukton në masë të madhe nevojën për shënimet e tipit manual që kërkohen në shumicën e gjuhëve të shtypura në mënyrë statike. Për shembull, llojet e të dhënave të variablave dhe nënshkrimet e funksioneve zakonisht nuk duhet të deklarohen në mënyrë eksplicite, siç bëjnë në gjuhë si Java dhe C#, sepse ato mund të nxirren nga operatorët dhe funksionet e tjera që aplikohen në variablat dhe vlerat e tjera në kod. Përdorimi efektiv i sistemit të tipit OCaml mund të kërkojë njëfarë sofistikimi nga ana e një programuesi, por kjo disiplinë shpërblehet me softuer të besueshëm dhe me performancë të lartë.

OCaml është ndoshta më i dalluar nga gjuhët e tjera me origjinë në akademi nga theksi i saj në performancën. Sistemi i tij i tipit statik parandalon mospërputhjet e tipit të ekzekutimit dhe në këtë mënyrë shmang kontrollet e tipit të ekzekutimit dhe të sigurisë që rëndojnë performancën e gjuhëve të shtypura në mënyrë dinamike, ndërkohë që garanton sigurinë e kohës së ekzekutimit, përveç rasteve kur kontrolli i kufijve të grupeve është i fikur ose kur përdoren disa veçori të pasigurta për tipin, si serializimi . Këto janë mjaft të rralla saqë shmangia e tyre është krejtesisht e mundur në praktikë.

Përveç kostos së kontrollit të tipit, gjuhët funksionale të programimit janë, në përgjithësi, sfiduese për t'u përpiluar në kodin efikas të gjuhës së makinës, për shkak të çështjeve të tilla si problemi funarg. Së bashku me optimizimet standarde të ciklit, regjistrit dhe udhëzimeve, përpiluesi optimizues i OCaml përdor metoda të analizës statike të programit për të optimizuar boksimin e vlerës dhe ndarjen e mbylljes, duke ndihmuar në maksimizimin e performancës së kodit që rezulton edhe nëse përdor gjerësisht konstruktet e programimit funksional.

Xavier Leroy ka deklaruar se "OCaml jep të paktën 50% të performancës së një përpiluesi të mirë C",  edhe pse një krahasim i drejtpërdrejtë është i pamundur. Disa funksione në bibliotekën standarde OCaml zbatohen me algoritme më të shpejta se funksionet ekuivalente në bibliotekat standarde të gjuhëve të tjera. Për shembull, zbatimi i bashkimit të grupeve në bibliotekën standarde OCaml në teori është asimptotikisht më i shpejtë se funksioni ekuivalent në bibliotekat standarde të gjuhëve imperative (p.sh., C++, Java) sepse zbatimi OCaml mund të shfrytëzojë pandryshueshmërinë e grupeve për të ripërdorur pjesë të grupeve hyrëse (input) në dalje (output) (shih strukturën e vazhdueshme të të dhënave ).

## Historia 
parapamje| Ekipi i zhvillimit OCaml merr një çmim në Simpoziumin mbi Parimet e Gjuhëve të Programimit (POPL) 2024

### Zhvillimi i ML (Meta Language) 
Midis viteve 1970 dhe 1980, Robin Milner, një shkencëtar britanik i kompjuterave dhe fitues i çmimit Turing, punoi në Laboratorin e Universitetit të Edinburgut për Bazat e Shkencave Kompjuterike.   Milner dhe të tjerë po punonin në prova të teoremave, të cilat historikisht u zhvilluan në gjuhë të tilla si Lisp. Milner shpesh u përball me problemin që provuesit e teoremave përpiqeshin  të pretendonin se një provë ishte e vlefshme duke bashkuar prova jo të vlefshme.  ML u shndërrua në një përpilues për të thjeshtuar përdorimin e LCF në makina të ndryshme dhe, nga vitet 1980, u shndërrua në një sistem të plotë më vete. 

### Implementimi i parë 
Caml fillimisht u projektua dhe u zhvillua nga ekipi Formel i INRIA i kryesuar nga Gérard Huet . Implementimi i parë i Caml u krijua në 1987 dhe u zhvillua më tej deri në 1992. Edhe pse u drejtua nga Ascánder Suarez, Pierre Weis dhe Michel Mauny vazhduan me zhvillimin pasi u largua në 1988.  është një rishkrim i plotë i kohës së ekzekutimit të gjuhës, duke hequr bllokimin global të GC dhe duke shtuar mbajtës të efekteve përmes vazhdimeve të kufizuara . Këto ndryshime mundësojnë mbështetje për paralelizmin e kujtesës së përbashkët dhe përputhjen me ngjyra të verbër, respektivisht.

Zhvillimi i OCaml vazhdoi brenda ekipit Cristal në INRIA deri në vitin 2005, kur ekipi Gallium e mori përsipër këtë detyrë.  Më pas, në vitin 2019, ekipi Gallium u zëvendësua nga ekipi Cambium.   Që nga viti 2023, ka 23 zhvillues kryesorë të shpërndarjes së përpiluesit nga një sërë organizatash  dhe 41 zhvillues për ekosistemin më të gjerë të veglave dhe paketimit OCaml.  Në vitin 2023, përpiluesi OCaml u njoh me Çmimin e Softuerit të Gjuhëve të Programimit të ACM SIGPLAN .

## Veçoritë 
OCaml përmban një sistem të tipit statik, konkluzion të tipit, polimorfizëm parametrik, rekursion të tail, përputhje modelesh, mbyllje leksikore të klasit të parë, funksionorë (module parametrike), trajtim përjashtimesh, trajtim efektesh dhe grumbullim automatik të mbeturinave gjenerues të vazhdueshme.

OCaml është i dukshëm për zgjerimin e konkluzioneve të tipit ML në një sistem objekti në një gjuhë me qëllim të përgjithshëm. Kjo lejon nën-tipizim struktural, ku llojet e objekteve janë të përputhshme nëse nënshkrimet e metodave të tyre janë të pajtueshme, pavarësisht nga trashëgimia e tyre e deklaruar (një tipar i pazakontë në gjuhët e shtypura në mënyrë statike).

Ofrohet një ndërfaqe funksioni i huaj për lidhjen me primitivet C, duke përfshirë mbështetjen gjuhësore për grupe numerike efikase në formate të përputhshme me C dhe Fortran . OCaml gjithashtu mbështet krijimin e bibliotekave të funksioneve OCaml që mund të lidhen me një program *kryesor* në C, në mënyrë që një bibliotekë OCaml të mund t'u shpërndahet programuesve C që nuk kanë njohuri ose instalim të OCaml.

Edhe pse OCaml nuk ka një sistem makro si pjesë të pandashme të gjuhës (metaprogramim), dmth. mbështetje të integruar për parapërpunim, platforma OCaml mbështet zyrtarisht një bibliotekë për shkrimin e këtyre paraprocesorëve . Këto mund të jenë të dy llojeve: një që funksionon në nivelin e kodit burimor (si në C), dhe një që funksionon në nivelin e Pemë e Sintaksës Abstrakte . Ky i fundit, i cili quhet PPX, akronim për Pre-Processor eXtension, është ai i rekomanduar.

Shpërndarja OCaml përmban:

* Mjetet e analizës leksikore dhe analizimit të quajtura *ocamllex* dhe *ocamlyacc*
* Debugger që mbështet kthimin prapa për të hetuar gabimet
* Gjenerator i dokumentacionit
* Profiler - për të matur performancën
* Shumë biblioteka për qëllime të përgjithshme

Përpiluesi i kodit vendas është i disponueshëm për shumë platforma, duke përfshirë Unix, Microsoft Windows dhe Apple macOS . Portabiliteti arrihet përmes mbështetjes së gjenerimit të kodit vendas për arkitekturat kryesore:

* X86-64 (AMD64), RISC-V dhe ARM64 (në OCaml 5.0.0 dhe më të lartë) 
* IBM Z (përpara OCaml 5.0.0 dhe përsëri në OCaml 5.1.0)
* Fuqia (përpara OCaml 5.0.0 dhe për t'u rishfaqur në OCaml 5.2.0)
* IA-32 dhe ARM (përpara OCaml 5.0.0)
* SPARC (përpara OCaml 4.06.0)
* DEC Alpha, HPPA, IA64 dhe MIPS (përpara OCaml 4.00.0)

Përpiluesi i bytekodit mbështet funksionimin në çdo arkitekturë 32 ose 64-bit kur gjenerimi i kodit vendas nuk është i disponueshëm, duke kërkuar vetëm një përpilues C.

Programet e kodit bajt OCaml dhe kodit vendas mund të shkruhen në një stil shumëfijesh, me ndërrim parandalues të kontekstit. Fijet OCaml në të njëjtin domen  ekzekutohen vetëm me ndarje kohore. Sidoqoftë, një program OCaml mund të përmbajë disa domene.

## Shembuj kodesh 
Pjesët e kodit OCaml studiohen më lehtë duke i futur ato në *REPL të nivelit të lartë* . Ky është një sesion interaktiv OCaml që printon llojet e konstatuara të shprehjeve që rezultojnë ose shprehje të përcaktuara.  Niveli i lartë OCaml fillon thjesht duke ekzekutuar programin OCaml:
```console
$ ocaml
     Objective Caml version 3.09.0
#
```
Kodi mund të futet më pas në prompt "#". Për shembull, për të llogaritur 1+2*3:
```console
# 1 + 2 * 3;;
- : int = 7
```
OCaml nxjerr në përfundimin se lloji i shprehjes është "int" (një numër i plotë i saktësisë së makinës ) dhe jep rezultatin "7".

### Përshëndetje Botë 
Programi i mëposhtëm "përshëndetje.ml":
```ocaml
print_endline "Përshëndetje botë!"
```
mund të kompilohet në një bajtkod të ekzekutueshëm:
 $ ocamlc përshëndetje.ml -o përshëndetje
ose të përpiluar në një kod të optimizuar të ekzekutueshëm me kod vendas:
 $ ocamlopt përshëndetje.ml -o përshëndetje
dhe ekzekutuar:
```console
$ ./përshëndetje
Përshëndetje botë!
$
```
Argumenti i parë për ocamlc, "përshëndetje.ml", specifikon skedarin burim për përpilim dhe flag "-o përshëndetje" specifikon skedarin dalës. 

### Option 
Konstruktori i tipit të `option` në OCaml, i ngjashëm me llojin `Maybe` në Haskell, shton një lloj të dhënash të caktuar për të kthyer `Some` vlerë të llojit të dhënë të të dhënave ose për të kthyer `None` .  Kjo përdoret për të shprehur se një vlerë mund ose nuk mund të jetë e pranishme.
```ocaml
# Some 42;;
- : int option = Some 42
# None;;
- : 'a option = None
```
Ky është një shembull i një funksioni që ose nxjerr një int nga një opsion, nëse ka një brenda, dhe e konverton atë në një varg, ose nëse jo, kthen një varg bosh:
```ocaml
let extract o =
  match o with
  | Some i -> string_of_int i
  | None -> "";;
```

```ocaml
# extract (Some 42);;
- : string = "42"
# extract None;;
  - : string = ""
```

### Përmbledhja e një liste të numrave të plotë (integers) 
Listat janë një nga llojet themelore të të dhënave në OCaml. Shembulli i mëposhtëm i kodit përcakton një funksioni rekurziv *sum* që pranon një argument, *intigers*, i cili supozohet të jetë një listë numrash të plotë. Vini re fjalën kyçe `rec` që tregon se funksioni është rekurziv. Funksioni përsëritet në mënyrë rekursive mbi listën e dhënë të numrave të plotë dhe siguron një shumë të elementeve. Deklarata *e match* ka ngjashmëri me elementin switch të C, megjithëse është shumë më i përgjithshëm.
```ocaml
let rec sum integers =                     (* Fjala kyçe rec do te thot 'rekurzive'. *)
 match integers with
 | [] -> 0                                 (* Kthe 0 nëse "integers" është lista 
                                                e zbrazët []. *)
 | first :: rest -> first + sum rest;;     (* Thirrje rekurzive nëse "integers" është një listë 
                                                jo e zbrazët; "first" është elementi i parë i 
                                                listës, dhe "rest" është një listë me elementet 
                                                e tjera, mundësisht []. *)
```

```ocaml
# sum [1;2;3;4;5];;
 - : int = 15
```
Një mënyrë tjetër është përdorimi i funksionit standard fold që funksionon me listat.
```ocaml
let sum integers =
  List.fold_left (fun accumulator x -> accumulator + x) 0 integers;;
```

```ocaml
# sum [1;2;3;4;5];;
  - : int = 15
```
Meqenëse funksioni anonim është thjesht aplikim i operatorit +, ai mund të shkurtohet në:
```ocaml
let sum integers =
  List.fold_left (+) 0 integers
```
Për më tepër, mund të hiqet argumenti i listës duke përdorur një aplikacion të pjesshëm :
```ocaml
let sum =
  List.fold_left (+) 0
```

### Renditja e shpejtë 
OCaml jep mundësinë për të shprehur në mënyrë koncize algoritme rekursive. Shembulli i mëposhtëm i kodit zbaton një algoritëm të ngjashëm me renditjen e shpejtë që rendit një listë sipas rendit në rritje.
```ocaml
let rec qsort = function
   | [] -> []
   | pivot :: rest ->
     let is_less x = x =.
```ocaml
let rec qsort = function
   | [] -> []
   | pivot :: rest ->
     let is_less = (>=) pivot in
     let left, right = List.partition is_less rest in
     qsort left @ [pivot] @ qsort right
```

### Problemi i ditëlindjes 
Programi i mëposhtëm llogarit numrin më të vogël të njerëzve në një dhomë për të cilët probabiliteti i ditëlindjeve krejtësisht unike është më pak se 50% ( problemi i ditëlindjes, ku për 1 person probabiliteti është 365/365 (ose 100%), për 2 është 364/365, për 3 është 364/365 × 363/365, etj.) (përgjigje = 23).
```ocaml
let ditët_vitit = 365.

let rec paradoksi_ditëlindjes prob njerëz =
 let prob = (ditët_vitit -. float njerëzit ) /. ditët_vitit *. prob in
 if prob *n* është një funksion i rendit më të lartë që pranon një funksion f dhe një vlerë *x* dhe zbatohet *f* te *x* pikërisht *n* herë. Për të kthyer një numër të kishës nga një vlerë funksionale në një varg, ne i kalojmë atij një funksion që paraprin vargun *"S"* në hyrjen e tij dhe vargun konstant *"0"*.
```ocaml
let zero f x = x
let succ n f x = f (n f x)
let një = succ zero
let dy = succ (succ zero)
let add n1 n2 f x = n1 f (n2 f x)
let to_string n = n (fun k -> "S" ^ k) "0"
let _ = to_string (add (succ dy) dy)
```

### Funksioni faktorial arbitrar me saktësi (bibliotekat) 
Një shumëllojshmëri bibliotekash janë drejtpërdrejt të aksesueshme nga OCaml. Për shembull, OCaml ka një bibliotekë të integruar për aritmetikë me saktësi arbitrare. Ndërsa funksioni faktorial rritet shumë shpejt, ai shpejt tejmbush numrat e saktësisë së makinës (zakonisht 32- ose 64-bit). Kështu, faktoriali është një kandidat i përshtatshëm për aritmetikë me saktësi arbitrare.

Në OCaml, moduli Num (tani i zëvendësuar nga moduli ZArith) ofron aritmetikë me saktësi arbitrare dhe mund të ngarkohet në një nivel të lartë që funksionon duke përdorur:
```ocaml
# #use "topfind";;
# #require "num";;
 # open Num;;
```
Funksioni faktorial mund të shkruhet më pas duke përdorur operatorët numerikë me precizion arbitrar =/ ,*/  dhe /  :
```ocaml
# let rec fakti n =
  if n =/ Int 0 then Int 1 else n */ fakti(n -/ Int 1);;
val fakti : Num.num -> Num.num = 
```
Ky funksion mund të llogarisë faktorë shumë më të mëdhenj, si p.sh. 120! :
```ocaml
# string_of_num (fact (Int 120));;
- : string =
"6689502913449127057588118054090372586752746333138029810295671352301633
55724496298936687416527198498130815763789321409055253440858940812185989
8481114389650005964960521256960000000000000000000000000000"
```

### Trekëndëshi (grafika) 
Programi i mëposhtëm jep një trekëndësh rrotullues në 2D duke përdorur OpenGL :
```ocaml
let () =
  ignore (Glut.init Sys.argv);
  Glut.initDisplayMode ~double_buffer:true ();
  ignore (Glut.createWindow ~title:"OpenGL Demo");
  let angle t = 10. *. t *. t in
  let render () =
    GlClear.clear [ `color ];
    GlMat.load_identity ();
    GlMat.rotate ~angle: (angle (Sys.time ())) ~z:1. ();
    GlDraw.begins `triangles;
    List.iter GlDraw.vertex2 [-1., -1.; 0., 1.; 1., -1.];
    GlDraw.ends ();
    Glut.swapBuffers () in
  GlMat.mode `modelview;
  Glut.displayFunc ~cb:render;
  Glut.idleFunc ~cb:(Some Glut.postRedisplay);
  Glut.mainLoop ()
```
Kërkohen lidhjet LablGL me OpenGL. Më pas programi mund të kompilohet në bajtkod me:
 $ ocamlc -I +lablGL lablglut.cma lablgl.cma thjeshtë.ml -o thjeshtë
ose në kodin vendas me:
 $ ocamlopt -I +lablGL lablglut.cmxa lablgl.cmxa thjeshtë.ml -o thjeshtë
ose më thjesht duke përdorur komandën ocamlfind build
 $ ocamlfind opt thjeshtë.ml -package lablgl.glut -linkpkg -o thjeshtë
dhe ekzekutojm:
 $ . / thjeshtë
Programet grafike 2D dhe 3D shumë më të sofistikuara dhe me performancë të lartë mund të zhvillohen në OCaml. Falë përdorimit të OpenGL dhe OCaml, programet rezultuese mund të jenë ndër-platformë, duke përpiluar pa asnjë ndryshim në shumë platforma kryesore.

### Numrat e Fibonaccit 
Kodi i mëposhtëm llogarit Numrat e Fibonaccit të një numri *n* të futur. Ai përdor rekursionin e bishtit dhe përputhjen e modelit.
```ocaml
let fib n =
 let rec fib_aux m a b =
  match m with
  | 0 -> a
  | _ -> fib_aux (m - 1) b (a + b)
  in fib_aux n 0 1
```

### Funksionet e rendit më të lartë 
Funksionet mund të marrin funksionet si hyrje dhe si rezultat kthyes. Për shembull, aplikimi i *twice*  në një funksioni f jep një funksion që zbatohet *f* dy herë në argumentin e tij.
```ocaml
let twice (f : 'a -> 'a) = fun (x : 'a) -> f (f x);;
 let inc (x : int) : int = x + 1;;
 let add2 = twice inc;;
 let inc_str (x : string) : string = x ^ " " ^ x;;
 let add_str = twice(inc_str);;
```

```ocaml
# add2 98;;
 - : int = 100
 # add_str "Test";;
  - : string = "Test Test Test Test"
```
Funksioni *twice* përdor një variabël të tipit '''a* për të treguar se mund të aplikohet në çdo funksion *f* që harton nga një tip *'a* në vetvete, dhe jo vetëm në funksionet *int->int* . Në veçanti, *twice'' mund të aplikohet edhe në vetvete.
```ocaml
# let katërfishi f = (twice twice) f;;
 val katërfishi : ('a -> 'a) -> 'a -> 'a = 
 # let add4 = katërfishi inc;;
 val add4 : int -> int = 
 # add4 98;;
 - : int = 102
```

## Gjuhët e prejardhura 
### MetaOCaml 
MetaOCaml  është një zgjerim programimi me shumë faza i OCaml që mundëson kompiluesin inkremental të kodit të ri të makinës gjatë kohës së ekzekutimit. Në disa rrethana, përshpejtime të konsiderueshme janë të mundshme duke përdorur programimin shumëfazor, sepse informacion më i detajuar rreth të dhënave për t'u përpunuar është i disponueshëm në kohën e ekzekutimit sesa në kohën e rregullt të përpilimit, kështu që kompiluesi inkremental mund të optimizojë shumë raste të kontrollit të gjendjes, etj.

Si shembull: nëse në kohën e kompilimit dihet se disa funksione të fuqisë *x -> x ^ n* nevojitet shpesh, por vlera e *n* është i njohur vetëm në kohën e ekzekutimit, një funksion fuqie me dy faza mund të përdoret në MetaOCaml:
```ocaml
let rec fuqia n x =
 if n = 0
 then ..
 else
  if even n
  then sqr (fuqia (n/2) x)
  else ..
```
Pasi *n* është njohur në kohën e ekzekutimit, mund të krijohet një funksion i specializuar dhe shumë i shpejtë i fuqisë:
```ocaml
. .~(fuqia 5 ..)>.
```
Rezultati është:
```ocaml
fun x_1 -> (x_1 *
  let y_3 = 
     let y_2 = (x_1 * 1)
     in (y_2 * y_2)
  in (y_3 * y_3))
```
Funksioni i ri përpilohet automatikisht.

### Gjuhë të tjera të prejardhura 
* F# është një gjuha e kornizës NET e bazuar në OCaml.
* JoCaml integron ndërtime për zhvillimin e programeve të njëkohshme dhe të shpërndara.
* Reason është një sintaksë dhe zinxhir mjetesh alternative OCaml për OCaml e krijuar në Facebook, e cila mund të përpilohet si në kodin vendas ashtu edhe në JavaScript.

## Softuer i shkruar në OCaml 
* Ahrefs, një produkt softuerik për SEO.
* Alt-Ergo, një program zgjidhës për SMT.
* Astrée, një analizues statik.
* Be Sport, një rrjet social.
* Coccinelle, një mjet për transformimin e kodit burimor të programeve C.
* Coq, një sistem për menaxhimin e provave formale.
* Easycrypt, një set mjetesh për shkrimin e provave të ndihmuara nga kompjuteri.
* F*, një gjuhë programimi e nivelit të lartë, shumë-paradigmatike, funksionale dhe objekt-orientuese e destinuar për verifikimin e programeve.
* FFTW, një bibliotekë për llogaritjen e transformave diskrete të Fourier-it. Disa rutina C janë gjeneruar nga një program OCaml i quajtur .
* Versioni në internet i Facebook Messenger.
* Flow, një analizues statik i krijuar në Facebook  që nxjerr dhe kontrollon tipet statike për JavaScript.
* Ocsigen, një kornizë zhvillimi për ueb dhe pajisje mobile, klient-server.
* Owl Scientific Computing, një sistem i dedikuar për llogaritje shkencore dhe inxhinierike.
* Frama-C, një kornizë për analizimin e programeve C.
* GeneWeb,një softuer gjenalogjie multi-platform, falas dhe me burim të hapur.
* Kompiluesi i gjuhës programimi Hack i krijuar në Facebook, që zgjeron PHP -në me lloje statike.
* Kompiluesi i gjuhës programimi Haxe.
* HOL Light, një asistent formal për prova.
* Infer, një analizues statik i krijuar në Facebook për Java, C, C++, dhe Objective-C, i përdorur për të zbuluar gabime në aplikacionet iOS dhe Android .
* Liquidsoap, një gjuhë skriptimi për gjenerimin e transmetimeve multimediale.
* MirageOS,  një kornizë programimi unikernel programming e shkruar në OCaml të pastër.
* MLdonkey, një aplikacion për ndarjen e skedarëve peer-to-peer i bazuar në  EDonkey network.
* Opa,  një gjuhë programimi falas dhe me burim të hapur për zhvillimin e uebit.
* Reason / ReScript, një gjuhë programimi e qëllimit të përgjithshëm, e nivelit të lartë, shumë-paradigmatike, funksionale dhe objekt-orientuese.
* Kompiluesi i Rust u implementua në OCaml para se të bëhej self-hosting.
* Tezos, një platformë kontratash inteligjente që mund të modifikohet vetë, duke përdorur XTZ si monedhën e saj qendrore.
* Unison, një program për sinkronizimin e skedarëve për të sinkronizuar skedarët mes dy direktorive.
* Interpretuesi referencë për WebAssembly, një bajkod me nivel të ulët i destinuar për ekzekutim brenda shfletuesve të uebit..
* Xen Cloud Platform (XCP), një zgjidhje virtualizimi e gatshme për përdorim për Xen hypervizorin Xen..

## Përdoruesit 
Të paktën disa dhjetëra kompani përdorin OCaml deri në një mase.  Shembuj të dukshëm përfshijnë:

* Bloomberg LP, i cili krijoi BuckleScript, një backend i përpiluesit OCaml që synon JavaScript. 
* Citrix Systems, i cili përdor OCaml në XenServer (i riemërtuar si Citrix Hypervisor gjatë 2018). 
* Facebook, i cili zhvilloi Flow,  Hack, Infer, Pfff dhe ReasonML në OCaml.
* Jane Street Capital, një firmë tregtare pronësore, e cila miratoi OCaml si gjuhën e saj të preferuar në ditët e para të saj  dhe vazhdon ta përdorë atë edhe ne vitin 2023. 
* Docker, i cili përdor OCaml në botimet e desktopit në macOS dhe Windows .  

Në kontekstin e mësimdhënies dhe kërkimit akademik, OCaml ka një prani të jashtëzakonshme në programet e mësimdhënies së shkencave kompjuterike, si në universitete ashtu edhe në kolegje. Një listë e burimeve arsimore dhe e këtyre programeve mësimore mund të gjendet ocaml.org .

## Referime 
## Lidhje të jashtme 
* Offical Website
* OCaml manual
* OCaml Package Manager
* Real World OCaml