# OCaml

OCaml, anteriorment denominat Objective Caml és un llenguatge de programació de la família ML, extensió i versió actual del llenguatge de programació Caml, acrònim de "Categorical Abstract Machine Language", creat per Xavier Leroy, Jérôme Vouillon, Damien Doligez, Didier Rémy i altres el 1996, amb construccions d'Orientació a Objectes, successora de l'extensió anterior del mateix llenguatge anomenada Caml Light.
OCaml és un projecte de codi obert impulsat per l'entitat estatal francesa de recerca INRIA (Institut national de recherche en informatique et en automatique).
OCaml parteix dels patrons del llenguatge funcional ML amb un lèxic i puntuació diferents, i hi afegeix construccions dels paradigmes de programació procedimental ja incorporades a Caml Light i d'Orientació a objectes, adoptant un enfocament multiparadigma.
OCaml és el nou nom oficial (abans era Objective Caml) des del Juliol del 2011, i ha estat adoptat per Microsoft com a base del seu llenguatge funcional F#. No hi ha cap estàndard per al llenguatge; l'única font de compiladors per al llenguatge és el mateix centre de recerca.

## Compiladors

OCaml posa èmfasi en el rendiment. Xavier Leroy diu "El compilador OCaml proporciona pel cap baix un rendiment del 50% d'un compilador de llenguatge C" i els bancs de proves mostren que generalment és així.
Es disposa de dos compiladors per a OCaml,
* ocamlc a codi intermedi (bytecode) interpretable pel mòdul ocamlrun. (ocamlc -custom genera un executable autònom (stand‑alone) i possibilita l'enllaç amb biblioteques de llenguatge C).
* ocamlopt compila a codi nadiu del sistema per a les arquitectures
* ocaml és un intèrpret o avaluador d'expressions (ang: Top-Level Read-Eval-Print-Loop) referit habitualment per TopLevel.
OCaml destaca per la gestió de memòria amb recuperació incremental de curta durada.
>> .. about soft real-time performance .. GHC's stop-the-world GC will incur prohibitively long pause times for this kind of application (soft real-time), orders of magnitude longer than the pause times of OCaml's incremental GC.
Ocaml implementa un gestor de memòria dinàmica (ang:garbage collector) de dues generacions
* la generació jove quan arriba al límit fa servir el sistema "stop and copy" (aturar i copiar) de dos espais amb destinació a la generació vella.
* la gen. vella quan arriba al límit fa servir el sistema "mark and sweep" (marcar i escombrar) de manera incremental amb compactació opcional
El caràcter incremental del recol·lector a la generació més vella, possibilita un temps reduït de les pauses. A cada passada de la generació jove (minor collection) fa una part de la feina sobre la generació vella (major collection).
Fent una prova amb el programa del tutorial de la referència esmentat al paràgraf "The GC module", es comprova que les pauses per recuperació es poden comptar per poques dècimes de mil·lisegon malgrat que poden augmentar ocasionalment degut a la latència o espera de commutació de fil del planificador del nucli.
   (<0.0002 segons amb ocamlc i <0.0001 amb ocamlopt mesurat sobre un Intel Atom model 330 amb Linux Ubuntu 10.04 "preempt" de 64 bits i 2 GB de RAM i amb el compilador recompilat a partir dels fonts modificats per calcular, en les manques de memòria dinàmica caml_check_urgent_gc, la pausa màxima havent creat totes les estructures, és a dir, partint en haver completat la primera recol·lecció de la generació vella).

## Hola Món

El programa següent "hola.ml":
es compila a codi intermedi de la següent manera:
i s'executa en entorns Unix:
o a l'avaluador d'expressions "ocaml"
Si oblideu el fi de clàusula en doble punt-i-coma ;; el podeu afegir a la línia següent.
En-línia, a l'avaluador d'expressions ocamljava en una applet Java. (No hi oblideu el topall ;; de fi d'instrucció).
Al mòbil o tauleta Android amb l'aplic. "Ocaml toplevel" o també l'aplic. d'execució remota "IDEDroid".
A l'iPad/iPhone amb l'aplic. "CodeToGo" que executa remotament a l'IDEone igual que l'"IDEDroid"

## Característiques

OCaml disposa de tipatge estàtic, inferència de tipus, polimorfisme paramètric, recursivitat final, encaixos de patrons, tractament d'excepcions, tancaments, mòduls paramètrics (functor) i recol·lector de memòria brossa generacional i incremental, objectes, classes d'objectes (parametritzables), tipus de classes, ...

### Lèxic

Depèn de la codificació del fitxer font. i l'entorn del sistema operatiu, degut a l'assimilació de caràcters a bytes (rang 0..255).

#### Cas de codificació habitual del Windows (Windows-1250)

    es poden utilitzar caràcters europeus als identificadors. (tots els caràcters ocupen un sol octet).

#### Cas de codificació UTF-8 a Unix

    l'alfabet del codi queda limitat als caràcters ASCII (0-127) (els únics que ocupen un sol octet en UTF-8). Les tires de text literals amb caràcters no anglosaxons (en codificació UTF-8 ocupen més d'un octet), poden donar resultats inesperats si es tracten amb el tipus String (String.length "Món" = 4 !! (4 bytes en UTF-8)) en comptes de ser tractats amb tipus més adients. Vegeu #tipus Unicode i exemple

### Sintaxi

Les clàusules acaben en doble punt-i-coma, per distingir-lo del punt-i-coma separador de la seqüència d'instruccions en una definició (lligam).

#### grafia
##### Precedits d'un apòstrof

    variables de tipus

##### Precedits d'una cometa revessa (accent greu + espai)

    constructors de tipus variant

##### Començant per majúscula

* Constructors de tipus
* Símbols d'enumeracions

##### Començant per minúscula

    la resta.

#### nova sintaxi

De manera opcional es proposa una revisió de la sintaxi per solucionar dificultats amb l'analitzador sintàctic.

##### nova sintaxi a l'intèrpret
### tipus
#### tipus bàsics

* com a únic paràmetre en una funció indica que cal recalcular-ne el valor a cada invocació
No hi ha literals en bases hexa, octal, binari, però la conversió int_of_string els pot llegir d'una cadena amb el prefix "0x", "0o", "0b" respectivament.
El tipus sencer int comparteix representació amb el tipus punter, reservant un bit per la distinció.
Tipus sencers de paraula completa (32 o 64 bits):
* int32 (sufix 'l' als literals),
* int64 (sufix 'L'),
* nativeint (sufix 'n')

#### tipus amb allotjament lineal
##### tipus string

Els caràcters ocupen un octet (valors 0..255). (Per a tires de caràcters Unicode vegeu #tipus Unicode) Vegeu

##### Vectors - tipus ('a array)

    Vegeu

#### Col·leccions polimòrfiques - llistes heterogènies d'elements etiquetats

El tipus és una unió discriminada oberta, sense declaració prèvia de tipus, d'elements etiquetats anomenats (variant types).
La finalitat és discriminar els elements d'una col·lecció per encaix de patrons de l'etiqueta, que ha de començar per una cometa revessa, feta amb l'accent greu seguit d'espai, i un identificador que comenci per majúscula
* Cada etiqueta (constructor) s'acompanya d'un sol valor (component) sempre del mateix tipus
* El tractament serà per encaix de patrons segons l'etiqueta
* Les llistes de variants es poden comparar, encara que continguin elements amb constructors diferents.
Exemple:#llistes obertes d'elements etiquetats

#### tipus Unicode

Vegeu biblioteca Camomile

#### tipus fantasma

De l'anglès "Phantom types". Tipus sense definició o amb paràmetres de tipus que no intervenen a la definició.
Vegeu

### expressions
#### declaracions locals

amb àmbits successius de visibilitat

#### funcions
##### operadors de funcions

Contràriament a ML i al Haskell no n'hi ha.
La composició de funcions en un llenguatge estricte, genera estructures intermèdies i és preferible resoldre el problema de la desforestació fusionant manualment les operacions en una funció amb un sol bucle.
La biblioteca Batteries defineix (-|) com a operador de composició.

##### pas de paràmetres etiquetat

* per nom
L'opcio de compilació -nolabels requereix l'ordenació estricta dels paràmetres a la crida (ignora les etiquetes de paràmetres no opcionals).

##### paràmetres opcionals

* paràmetres opcionals
Requeriment: un paràmetre opcional ha d'ésser seguit, com a mínim, d'un paràmetre anònim (no etiquetat), el qual tanca la possible seqüència de paràmetres opcionals.
* paràmetres opcionals amb valor per omissió

#### operadors

Permet l'ús en prefix (entre parèntesis) o bé infix dels operadors binaris.
El caràcter inicial de l'operador determina la seva precedència (per exemple els definits començant per '*' tenen la mateixa precedència dels operadors multiplicatius). Vegeu Taula de Precedències i associativitat dels operadors

#### excepcions
### Programació imperativa

La que modifica l'estat.

#### Referències

* ref introdueix una referència (punter) a l'allotjament d'un altre objecte
* (!) és l'operador invers que ens revela el valor de l'objecte referit per la variable
* (:=) assigna un valor a l'objecte referit per la variable

#### control imperatiu
### Orientació a objectes (aspectes imperatiu i funcional)

Vegeu Facilita objectes immediats d'una sola instància i classes d'objectes immutables o mudables.
* Els camps (clàusula val) són privats, accessibles només per als mètodes propis o de classes derivades.
* Els mètodes poden contenir el modificador private.
* La clàusula object admet la declaració d'una ref. a la instància, anomenada habitualment self com a object (self) ... end
* Poden incorporar una clàusula d'inicialització (initializer)
* Objectes d'una sola instància (ang: singleton) ometent la clàusula class

#### classes d'objectes

* tots els camps són d'accés privat
* new en genera una instància.

##### objectes mudables

Incorporant el qualificatiu mutable als camps
Pot incorporar una clàusula d'inicialització initializer que el generador new executa.
El desallotjament automàtic fa innecessaris els destructors. Malgrat això, es pot registrar una funció com a finaliser al recollidor de brossa.
Execució a l'intèrpret ocaml

##### actualització funcional dels objectes immutables

La construcció {< ... >} permet l'actualització funcional en una nova instància, retornant-ne un clon actualitzat.

##### classes abstractes

Els mètodes es poden fer abstractes (pendents d'especificar en classes derivades) amb la qualificació "virtual". Les classes amb mètodes virtuals han de ser declarades virtuals.

##### herència

Les classes poden tenir herència múltiple. En cas de col·lisió de noms de mètode heretats, preval l'heretat darrer.

##### Interfícies d'objectes

A l'estil dels Interface de Java, designen el conjunt de tipus que implementen la signatura descrita amb class type.

##### Col·leccions de valors amb funcionalitat comuna

Per exemple, llistes amb elements d'aquells tipus que implementin una funcionalitat determinada per una interfície. Cal fer un up-cast (caracterització a tipus menys especialitzat) de cadascun dels elements al tipus de la interfície.

##### llistes obertes d'elements etiquetats

Unió discriminada oberta (sense definició prèvia de tipus)

##### classes amb parametrització de tipus (genèrics)

Vegeu

##### constructors de còpia

* Oo.copy crea una còpia superficial (la que no duplica els valors referits per punters ref).

### Mòduls

Un fitxer de codi sense clàusula module es considera un mòdul en si mateix i el seu nom de mòdul és el del fitxer amb la primera lletra majúscula.
Per fer-ne servir un identificador cal prefixar-lo: "Nom_fitxer.ident"; per incorporar tots els seus identificadors a l'àmbit actual s'utilitza la clàusula open
La clàusula module introdueix un submòdul que s'adreça externament com a Nom_fitxer.Nom_modul

#### Compilació

En una compilació els fonts s'han d'especificar en ordre tal que si Mòdul_A crida Mòdul_B, Mòdul_B ha de precedir Mòdul_A.
En cas que les referències entre mòduls fossin circulars, cal generar i compilar primer els fitxers de signatura (secció següent).
També es pot compilar a fitxer biblioteca, especificant -a

#### Compilació amb biblioteques del sistema de paquets

per exemple la biblioteca de tractament de tires de caràcters Unicode del paquet "Camomile" incorporada amb el gestor de paquets Findlib. o la distribució en codi font GODI
* ocamlfind, interfície del gestor de paquets, proporciona directoris, biblioteques i opcions al compilador segons la info. del fitxer META del paquet.
o amb compilació i relligat separats
a Linux amb la codificació descrita a la variable d'entorn LANG = ca_ES.UTF-8
"CamomileLibrary" NO és el nom del fitxer biblioteca, és un mòdul generat amb l'opció -pack del compilador (empaqueta com a submòduls els mòduls esmentats com a paràmetres). Aquest sistema no és regla general dels paquets.

#### Generació d'intèrprets personalitzats

OcamlMkTop permet crear avaluadors d'expressions OCaml (intèrprets o Toplevels en argot OCaml) amb mòduls i biblioteques precarregats.
A voltes dona millor informació d'errors en cas de manca d'adequació de crides Ocaml a biblioteques del sistema subjacent.
Incorporant l'exemple anterior

#### Signatura d'un mòdul

Seqüència d'especificacions de tipus dels identificadors exportats per un mòdul.

##### Generació partint del codi font

En cas que interessi declarar d'accés privat (d'ús intern) algun identif. d'un mòdul-fitxer, generarem un fitxer amb la seva signatura amb la comanda següent, redirigint la sortida:
Com que només s'exporten els identificadors presents a la signatura, editarem el .mli eliminant les declaracions que volem d'accés privat, i el compilarem amb ocamlc, generant el .cmi (interfície compilada)

##### amb signatura explícita

(:) equival a l'adscripció opaca del ML Estàndard quedant els tipus tan visibles com ho siguin a la signatura, i quedant d'accés privat els elements de l'estruct. no presents a la signatura.
o també

##### composició de signatures

A partir de v3.12: herència (include) múltiple i substitució de tipus eliminant la instrucció type interna de les signatures incloses.

#### Estructures paramètriques: Functors

Vegeu ref.

#### Serialització

Amb el mòdul Marshal.

#### Autodocumentació

Els comentaris entre (** i *) es poden fer servir per generar un fitxer d'autodocumentació mitjançant l'eina ocamldoc
Els comentaris entre (* i *) no entren a l'autodocumentació.
S'hi poden incloure camps estàndard per documentar el mòdul i els paràmetres de les definicions. (els tipus no cal posar-los-hi que ja surten automàticament) com ara
Vegeu-ne l'ús a l'exemple més avall. Un exemple, amb el fitxer de signatura i sense, seria
Generaria els fitxers de documentació Modul.html i type_Modul.html

### Arrencada

Vegeu
compilació
dona la següent sortida
Altres sistemes:
* Alain Frish Getopt Arxivat 2009-04-05 a Wayback Machine. a l'estil de GNU GetOpt.

### API Estàndard

Les operacions predefinides són al mòdul Pervasives, obert d'entrada.
Els tipus predefinits s'esmenten aquí.
Les biblioteques estàndards s'especifiquen aquí

### Extensions dels tipus de fitxers
#### de fonts
##### .ml

    fitxer font

##### .mli

    fitxer d'interfície

##### .mll

    document de lèxic per al generador d'analitzadors de lèxic (ocamllex)

##### .mly

    document de gramàtica per al generador d'analitzadors gramaticals (ocamlyacc)

#### compilats
##### .cmo

    fitxer de codi objecte bytecode (codi intermedi)

##### .cmi

    fitxer d'interfície, compilat

##### .cmx

    fitxer de codi objecte nadiu (propi de l'arquitectura del processador)

##### biblioteques
###### .cma

    biblioteca de codi objecte bytecode de relligat estàtic (en temps de compilació)

###### .cmxa

    biblioteca de codi objecte nadiu de relligat estàtic

###### .cmxs

    biblioteca de codi objecte nadiu de relligat dinàmic (com .dll (a windows)/.so (a unix)) (només per a la plataforma amd64 (x86-64))

### Gestió de paquets
#### Findlib

El gestor de paquets Findlib funciona només sobre sistemes Unix. Vegeu enllaços.
El fitxer de projecte del paquet duu per nom META.
Per instal·lar un paquet precompilat, descarregat manualment:
Per especificar-lo en la compilació vegeu secció més amunt #Compilació amb biblioteques del sistema de paquets

#### Distribució GODI

GODI és un rebost de paquets de codi font que en facilita la instal·lació i actualització compilant a destinació.
Incorpora un programa anomenat godi_console que proporciona una interfície de menús en una consola de comandes, per a la selecció, instal·lació i actualització dels paquets
A l'hora d'instal·lar un paquet, cal fer primer l'operació test per comprovar si manquen paquets dels quals depèn, que haurem d'assenyalar "per instal·lar" individualment.
Per anul·lar les operacions GODI marcades, si no ens en sortim, cal cercar l'arxiu "build/wishes.txt" de la instal·lació GODI i buidar-lo o eliminar-lo.
Els paquets de distribució Godi poden tenir un nom lleugerament diferent del nom amb Findlib (per exemple godi-camomile per al paquet camomile). Per utilitzar-los en compilació cal fer servir el nom original del paquet (per exemple camomile) i el sistema ja descrit per al Findlib.

### Compartint recursos

En cas d'executar més d'un programa ocaml alhora, de cara a minimitzar l'ús de memòria hi ha les següents opcions:

#### Un únic gestor de memòria

    La compilació a bytecode permet tenir una única instància del gestor de memòria i interfase amb el sistema operatiu. el programa ocamlrun interpreta el codi intermedi.

#### Relligat dinàmic amb biblioteques

    Vegeu ref. ocamlmklib genera biblioteques estàtiques i dinàmiques partint d'objectes i biblioteques de codi OCaml i codi C.

### Portabilitat

El codi intermedi (bytecode) pot córrer a, pràcticament, qualsevol plataforma compatible amb POSIX amb un compilador compatible amb ANSI-C.
La llista oficial de plataformes suportades aquí.

### JoCaml

JoCaml és una extensió del llenguatge que implementa l'àlgebra de processos CSP anomenada "càlcul Join" i facilita la concurrència per pas de missatges amb sincronització per encaix de patrons per a sistemes distribuïts amb migració de processos.

## OCaml sobre JavaVM

Amb el programari OCamlJava Requereix JVM >= 1.6
* N'és un exemple l'intèrpret en una applet aquí.

### Execució de codi intermedi OCaml (projecte Cadmium)

Cadmium per a l'Android: joecaml constitueix una reimplementació per a una versió més antiga de Java, la 1.5 compatible amb Android. (Cadmium de OCamlJava requereix Java 1.6)

### Compilació a codi intermedi JVM (projecte Cafesterol)
## OCaml a Javascript
### ocamljs

    rerefons de compilador generant Javascript per al compilador ocaml

### js_of_ocaml

    traductor de codi intermedi ocamlc a javascript

## OCaml per a l'iPhone / iPad

* Compilador creuat per a l'iPhone/iPad., funciona integrat amb l'entorn de desenvolupament Xcode per als ordinadors de l'Apple.
* Exemple d'aplicació per a l'iPad

## OCaml a l'Android

* OCaml Toplevel: intèrpret (de Keigo Imai) descarregable des del Google Market
* Cadmium de OCamlJava per a l'Android

## OCaml sobre Xen

* OpenMirage és una implementació per desenvolupar micronuclis servidors d'aplicacions Núvol d'internet sobre l'hipervisor Xen (sense sistema operatiu).

## Exemples
### Ent./Sortida

Compila, executa, genera interfície (signatura) i genera fitxers d'autodocumentació (de la implementació nom-amb-primera-lletra-majúscula.html i de la interfície type_nom-amb-primera-lletra-majúscula.html)

### Llistes d'avaluació tardana

Estalvien espai en el tractament de llistes llargues o infinites.

### Interfície d'entorn gràfic -- Hola món a GTK amb Glade

Glade és una eina de disseny d'interfícies gràfiques d'usuari per a l'entorn GTK que desa el disseny en format GladeXML que els programes poden carregar fàcilment per instanciar-ne els elements gràfics i connectar-hi els gestors d'esdeveniments.
El programari lablgtk2 conté els connectors a les API de GTK i Glade així com un convertidor que del format GladeXML genera un mòdul OCaml amb la definició de la interfície. Per exemple, dissenyant al Glade una finestra de nom window1 amb l'etiqueta "Hola món" desant el fitxer com a hola_mon_interficie.glade.
A la versió més recent de Glade, cal especificar a les preferències, com a format de projecte, el libGlade (GladeXML v.2.0) en comptes del GtkBuilder que ve predeterminat.
L'antic convertidor ml-glade que traduïa fitxers GladeXML versió 1, no ha sigut actualitzat a les versions de Glade actuals i ha quedat obsolet.

### Composició de signatures

A partir de la versió 3.12 permet la inclusió múltiple de signatures mitjançant la substitució de tipus de la segona en endavant. Vegeu ref.

### Productor / consumidor

Més info al manual "Unix systems programming in Objective Caml"
* Compilació amb fils d'exec. lleugers (del planificador de l'intèrpret) (Lightweight threads) (només a bytecode): ocamlc -vmthread
* Compilació amb fils d'exec. del sistema (només a codi nadiu), en cas que els suporti: ocamlopt -thread
dona:

### STM - Memòria transaccional -- Emulació de les var. de sincronització TMVar del Haskell - GHC

Amb la biblioteca coThreads
A l'Ubuntu:
Vegeu també:
* MVars al Haskell
* STM al GHC
* Compilació amb fils d'exec. lleugers (del planificador de l'intèrpret), a codi intermedi ocaml.
* Compilació amb fils d'exec. del sistema, a codi nadiu

## Referències

* 1 2 Canvi de nom de Objective Caml a OCaml
* ↑ El llenguatge Caml i extensions(anglès)
* ↑ Microsoft Research - F sostingut -- "El nucli del llenguatge és compartit amb OCaml"(anglès)
* ↑ Linux Weekly News (anglès)
* ↑ The Computer Language Benchmarks Game - GNU GCC respecte de OCaml(anglès)
* ↑ Plataformes suportades(anglès)
* ↑ Intèrpret ocaml o toplevel Arxivat 2010-08-09 a Wayback Machine.(anglès) Avaluador d'expressions de nivell global (toplevel)
* ↑ Quin sistema és més eficient, Haskell o bé OCaml?(anglès)
* ↑ Garbage Collection(anglès) Recol·lecció de memòria brossa
* ↑ Ocaml-tutorial - Garbage collection(anglès)
* ↑ Ubuntu - modalitats per a temps-real(anglès)
* ↑ IDEone - Interfícies amb l'entorn d'execució remota
* ↑ És possible escriure tires de text literal als fonts en UTF-8 en OCaml? Arxivat 2009-01-07 a Wayback Machine. (anglès)
* ↑ nova sintaxi opcional(anglès)
* ↑ Guia sobre la sintaxi revisada(anglès)
* ↑ «Literals int32, int64, nativeint». Arxivat de l'original el 2010-08-13. [Consulta: 13 setembre 2010].
* ↑ mòdul String Tipus String(anglès)
* ↑ Vectors - mòdul Array(anglès)
* ↑ Variant types (anglès)
* 1 2 Biblioteca Camomile de tipus Unicode
* ↑ Control d'accés estàtic fent servir Phantom types(anglès)
* ↑ Tipus fantasmes (Phantom types) a Haskell(anglès)
* ↑ Expressions(anglès)
* ↑ «Operador de composició (-|)». Arxivat de l'original el 2014-10-21. [Consulta: 13 febrer 2013].
* ↑ «Opcions de compilació». Arxivat de l'original el 2009-12-04. [Consulta: 6 desembre 2009].
* ↑ Optional arguments
* ↑ operadors infix(anglès)
* ↑ taula de precedències i associativitat dels operadors(anglès)
* ↑ Objectes a OCaml Arxivat 2009-11-29 a Wayback Machine. (anglès)
* ↑ finalitzadors al recollidor de brossa(anglès)
* ↑ Objectes funcionals Arxivat 2009-11-29 a Wayback Machine.(anglès)
* ↑ Tipus i Genericitat (anglès)
* ↑ Clonant objectes Arxivat 2009-11-29 a Wayback Machine.(anglès)
* 1 2 El gestor de paquets Findlib (anglès)
* 1 2 GODI distribució en codi font(anglès)
* 1 2 Ocamlfind, interfície del gestor de paquets(anglès)
* ↑ Linker options(anglès) Vegeu opcions als fitxers META dels paquets.
* ↑ Opcions del compilador ocamlc Arxivat 2009-12-04 a Wayback Machine. (anglès) Vegeu opció -pack
* ↑ Makefile del paquet Camomile (anglès) Genera mòdul CamomileLibrary per empaquetament (-pack) dels altres fitxers objecte
* ↑ OcamlMkTop(anglès)
* 1 2 Substitució del tipus en signatures Arxivat 2010-08-13 a Wayback Machine.(anglès)
* ↑ Mòduls parametritzats(anglès)
* ↑ Serialització: mòdul Marshal
* ↑ El generador d'autodocumentació Arxivat 2009-02-20 a Wayback Machine. (anglès)
* ↑ Biblio estàndard Arg (anglès)
* ↑ «Operacions predefinides». Arxivat de l'original el 2009-04-17. [Consulta: 27 abril 2009].
* ↑ «Tipus i excepcions predefinits». Arxivat de l'original el 2009-04-27. [Consulta: 27 abril 2009].
* ↑ Biblioteques estàndards
* 1 2 Lexer and parser generators (ocamllex, ocamlyacc) Arxivat 2019-08-16 a Wayback Machine. (anglès)
* ↑ Generació de biblioteques de relligat dinàmic (opció -shared) Arxivat 2010-08-26 a Wayback Machine.(anglès) "Només a la plataforma amd64"
* ↑ Fitxer META(anglès)
* ↑ Paquets del rebost del GODI(anglès)
* ↑ El programa ocamlrun Arxivat 2010-08-09 a Wayback Machine.(anglès)
* ↑ biblioteques de relligat dinàmic (DLL) Arxivat 2010-08-09 a Wayback Machine. (anglès)
* ↑ El programa ocamlmklib Arxivat 2010-07-24 a Wayback Machine.(anglès)
* ↑ Portabilitat - Plataformes suportades(anglès)
* ↑ Jocaml
* ↑ Join calculus tutorial
* ↑ OcamlJava(anglès)
* ↑ Presentació OcamlJava Paris 2008(anglès)
* ↑ Cadmium per a l'Android(anglès)
* ↑ ocamljs - wiki amb documentació al viver de projectes de Google(anglès) el codi més recent cal cercar-lo al GitHub
* ↑ ocamljs al viver GitHub(anglès)
* ↑ js_of_ocaml - traductor a javascript(anglès)
* ↑ Compilador Ocaml creuat per a l'iphone (anglès)
* ↑ Compilador creuat Ocaml per a l'iPhone treballant dins l'entorn Xcode
* ↑ OCaml a l'iPad(anglès)
* ↑ Keigo Imai - OCaml Toplevel a l'Android Arxivat 2011-07-15 a Wayback Machine.(japonès)
* ↑ OpenMirage Arxivat 2015-05-10 a Wayback Machine.(anglès) Desenvolupament sobre Xen
* ↑ biblioteca lablGTK de connectors a GTK i Glade(anglès)
* ↑ format libGlade: GladeXML v.2.0 Arxivat 2010-07-02 a Wayback Machine.(anglès)
* ↑ Traductor obsolet ml-glade (glade v.1 a ocaml)(anglès)
* ↑ Unix system programming in Objective Caml(anglès)
* ↑ Biblioteca threads Arxivat 2010-08-27 a Wayback Machine.(anglès)
* ↑ Projecte coThreads(anglès) Biblioteca STM (Memòria transaccional)

## Vegeu també

* Haskell llenguatge de programació funcional pur que facilita el paral·lelisme i l'aprofitament dels múltiples nuclis dels processadors actuals

## Enllaços externs

* Web oficial de OCaml (anglès)