OCaml ( / oʊ ˈ k æ m əl / oh- KAM -əl , anteriormente Objective Caml ) es un lenguaje de programación de propósito general , de alto nivel y multiparadigma que extiende el dialecto Caml de ML con características orientadas a objetos . OCaml fue creado en 1996 por Xavier Leroy , Jérôme Vouillon, [ 5 ] Damien Doligez , Didier Rémy, [ 6 ] Ascánder Suárez y otros.
El conjunto de herramientas de OCaml incluye un intérprete interactivo de alto nivel , un compilador de bytecode , un compilador de código nativo optimizador, un depurador reversible y un gestor de paquetes ( OPAM ), junto con un sistema de compilación modular para OCaml ( Dune ). OCaml se desarrolló inicialmente en el contexto de la demostración automática de teoremas y se utiliza en software de análisis estático y métodos formales . Más allá de estos ámbitos, se ha empleado en programación de sistemas , desarrollo web y utilidades financieras específicas, entre otros dominios de aplicación.
El acrónimo CAML originalmente significaba Categorical Abstract Machine Language (Lenguaje de Máquina Abstracto Categórico ), pero OCaml omite esta máquina abstracta . [ 7 ] OCaml es un proyecto de software libre y de código abierto gestionado y mantenido principalmente por el Instituto Francés de Investigación en Informática y Automatización (Inria). A principios de la década de 2000, muchos lenguajes, en particular F# y Scala , adoptaron elementos de OCaml .
Filosofía
Los lenguajes derivados de ML son conocidos principalmente por sus sistemas de tipos estáticos y compiladores con inferencia de tipos . OCaml unifica la programación funcional , imperativa y orientada a objetos bajo un sistema de tipos similar a ML. Por lo tanto, los programadores no necesitan estar muy familiarizados con el paradigma de los lenguajes puramente funcionales para usar OCaml.
Al exigir al programador que trabaje dentro de las restricciones de su sistema de tipos estático , OCaml elimina muchos de los problemas de tiempo de ejecución relacionados con los tipos que se asocian con los lenguajes de tipado dinámico . Además, el compilador de inferencia de tipos de OCaml reduce considerablemente la necesidad de las anotaciones de tipo manuales que se requieren en la mayoría de los lenguajes de tipado estático. Por ejemplo, los tipos de datos de las variables y las firmas de las funciones generalmente no necesitan declararse explícitamente, como sucede en lenguajes como Java y C# , ya que se pueden inferir a partir de los operadores y otras funciones que se aplican a las variables y otros valores en el código. El uso eficaz del sistema de tipos de OCaml puede requerir cierta sofisticación por parte del programador, pero esta disciplina se ve recompensada con un software fiable y de alto rendimiento.
OCaml se distingue quizás más de otros lenguajes con origen académico por su énfasis en el rendimiento. Su sistema de tipos estático evita las discrepancias de tipos en tiempo de ejecución y, por lo tanto, elimina las comprobaciones de tipos y seguridad en tiempo de ejecución que sobrecargan el rendimiento de los lenguajes de tipado dinámico, al tiempo que garantiza la seguridad en tiempo de ejecución, excepto cuando se desactiva la comprobación de límites de matrices o cuando se utilizan algunas características que no son seguras en cuanto a tipos, como la serialización . Estas situaciones son lo suficientemente raras como para que evitarlas sea perfectamente posible en la práctica.
Además de la sobrecarga que supone la comprobación de tipos, los lenguajes de programación funcional suelen ser difíciles de compilar a código máquina eficiente debido a problemas como el problema de los argumentos funcionales (funarg) . Junto con las optimizaciones estándar de bucles, registros e instrucciones, el compilador optimizador de OCaml emplea métodos de análisis estático de programas para optimizar el empaquetado de valores y la asignación de cierres , lo que ayuda a maximizar el rendimiento del código resultante, incluso si utiliza ampliamente construcciones de programación funcional.
Xavier Leroy ha afirmado que "OCaml ofrece al menos el 50% del rendimiento de un compilador C decente" [ 8 ] , aunque una comparación directa es imposible. Algunas funciones de la biblioteca estándar de OCaml se implementan con algoritmos más rápidos que las funciones equivalentes en las bibliotecas estándar de otros lenguajes. Por ejemplo, la implementación de la unión de conjuntos en la biblioteca estándar de OCaml es, en teoría, asintóticamente más rápida que la función equivalente en las bibliotecas estándar de lenguajes imperativos (p. ej., C++, Java) porque la implementación de OCaml puede aprovechar la inmutabilidad de los conjuntos para reutilizar partes de los conjuntos de entrada en la salida (véase la estructura de datos persistente ).
Historia

Desarrollo de ML (Meta Lenguaje)
Entre las décadas de 1970 y 1980, Robin Milner , un científico informático británico y ganador del Premio Turing , trabajó en el Laboratorio de Fundamentos de la Informática de la Universidad de Edimburgo . [ 9 ] [ 10 ] Milner y otros trabajaban en demostradores de teoremas , que históricamente se habían desarrollado en lenguajes como Lisp . Milner se topó repetidamente con el problema de que los demostradores de teoremas intentaban afirmar que una prueba era válida al juntar no-pruebas. [ 10 ] Como resultado, pasó a desarrollar el metalenguaje para su Lógica para Funciones Computables , un lenguaje que solo permitiría al escritor construir pruebas válidas con su sistema de tipos polimórfico. [ 11 ] ML se convirtió en un compilador para simplificar el uso de LCF en diferentes máquinas y, en la década de 1980, se convirtió en un sistema completo por sí mismo. [ 11 ] ML serviría finalmente como base para la creación de OCaml.
A principios de la década de 1980, se produjeron algunos avances que impulsaron al equipo Formel de INRIA a interesarse por el lenguaje ML. Luca Cardelli , profesor de investigación en la Universidad de Oxford , utilizó su máquina abstracta funcional para desarrollar una implementación más rápida de ML, y Robin Milner propuso una nueva definición de ML para evitar divergencias entre diversas implementaciones. Simultáneamente, Pierre-Louis Curien, investigador sénior en la Universidad Paris Diderot , desarrolló un cálculo de combinadores categóricos y lo vinculó con el cálculo lambda , lo que condujo a la definición de la máquina abstracta categórica (CAM). Guy Cousineau, investigador en la Universidad Paris Diderot, reconoció que esto podría aplicarse como método de compilación para ML. [ 12 ]
Primera implementación
Caml fue diseñado y desarrollado inicialmente por el equipo Formel de INRIA, liderado por Gérard Huet . La primera implementación de Caml se creó en 1987 y se siguió desarrollando hasta 1992. Aunque fue Ascánder Suárez quien lo impulsó, Pierre Weis y Michel Mauny continuaron con el desarrollo después de que él se marchara en 1988. [ 12 ]
Se cita a Guy Cousineau recordando que su experiencia con la implementación de lenguajes de programación era inicialmente muy limitada, y que hubo múltiples deficiencias de las que él es responsable. A pesar de esto, cree que "Ascander, Pierre y Michel hicieron un trabajo bastante bueno". [ 12 ]
Luz de leguas
Entre 1990 y 1991, Xavier Leroy diseñó una nueva implementación de Caml basada en un intérprete de bytecode escrito en C. Además, Damien Doligez escribió un sistema de gestión de memoria, también conocido como recolector de basura secuencial , para esta implementación. [ 11 ] Esta nueva implementación, conocida como Caml Light , reemplazó a la antigua implementación de Caml y se ejecutaba en pequeñas máquinas de escritorio. [ 12 ] En los años siguientes, aparecieron bibliotecas como las herramientas de manipulación de sintaxis de Michel Mauny y ayudaron a promover el uso de Caml en equipos educativos y de investigación. [ 11 ]
Luz especial Caml
En 1995, Xavier Leroy lanzó Caml Special Light, una versión mejorada de Caml. [ 12 ] Se añadió un compilador de código nativo optimizador al compilador de bytecode, lo que aumentó considerablemente el rendimiento hasta niveles comparables con lenguajes convencionales como C++ . [ 11 ] [ 12 ] Además, Leroy diseñó un sistema de módulos de alto nivel inspirado en el sistema de módulos de Standard ML, que proporcionaba potentes herramientas para la abstracción y la parametrización, y facilitaba la creación de programas de mayor envergadura. [ 11 ]
Objetivo Caml
Didier Rémy y Jérôme Vouillon diseñaron un sistema de tipos expresivo para objetos y clases, que se integró en Caml Special Light. Esto dio lugar al desarrollo del lenguaje Objective Caml, lanzado por primera vez en 1996 y posteriormente renombrado como OCaml en 2011. Este sistema de objetos admitía notablemente muchos modismos de la programación orientada a objetos de forma estáticamente segura, mientras que esos mismos modismos causaban inestabilidad o requerían comprobaciones en tiempo de ejecución en lenguajes como C++ o Java . En 2000, Jacques Garrigue amplió Objective Caml con varias características nuevas, como métodos polimórficos, variantes y argumentos etiquetados y opcionales. [ 11 ] [ 12 ]
Desarrollo en curso
Se han añadido mejoras al lenguaje de forma incremental durante las últimas dos décadas para dar soporte a las crecientes bases de código comerciales y académicas en OCaml. [ 11 ] La versión OCaml 4.0 de 2012 añadió tipos de datos algebraicos generalizados (GADT) y módulos de primera clase para aumentar la flexibilidad del lenguaje. [ 11 ] La versión OCaml 5.0.0 de 2022 [ 13 ] es una reescritura completa del entorno de ejecución del lenguaje, eliminando el bloqueo global del recolector de basura y añadiendo manejadores de efectos mediante continuaciones delimitadas . Estos cambios permiten el soporte para el paralelismo de memoria compartida y la concurrencia sin distinción de color , respectivamente.
El desarrollo de OCaml continuó dentro del equipo Cristal en INRIA hasta 2005, cuando fue sucedido por el equipo Gallium. [ 14 ] Posteriormente, Gallium fue sucedido por el equipo Cambium en 2019. [ 15 ] [ 16 ] A partir de 2023, hay 23 desarrolladores principales de la distribución del compilador de una variedad de organizaciones [ 17 ] y 41 desarrolladores para el ecosistema más amplio de herramientas y empaquetado de OCaml. [ 18 ] En 2023, el compilador OCaml fue reconocido con el premio ACM SIGPLAN's Programming Languages Software Award .
Características
OCaml cuenta con un sistema de tipos estático , inferencia de tipos , polimorfismo paramétrico , recursión de cola , coincidencia de patrones , cierres léxicos de primera clase , functores (módulos paramétricos) , manejo de excepciones , manejo de efectos y recolección automática de basura generacional incremental .
OCaml destaca por extender la inferencia de tipos al estilo ML a un sistema de objetos en un lenguaje de propósito general. Esto permite el subtipado estructural , donde los tipos de objetos son compatibles si sus firmas de métodos son compatibles, independientemente de su herencia declarada (una característica inusual en lenguajes de tipado estático).
Se proporciona una interfaz de funciones externas para enlazar con primitivas de C , incluyendo soporte de lenguaje para matrices numéricas eficientes en formatos compatibles con C y Fortran . OCaml también permite crear bibliotecas de funciones OCaml que se pueden enlazar a un programa principal en C, de modo que se pueda distribuir una biblioteca OCaml a programadores de C que no tengan conocimientos ni instalación de OCaml.
Aunque OCaml no cuenta con un sistema de macros como parte inseparable del lenguaje ( metaprogramación ), es decir, con soporte integrado para el preprocesamiento , la plataforma OCaml sí ofrece soporte oficial para una biblioteca que permite escribir dichos preprocesadores . Estos pueden ser de dos tipos: uno que opera a nivel de código fuente (como en C) y otro que opera a nivel del árbol de sintaxis abstracta . Este último, denominado PPX (acrónimo de Pre-Processor eXtension), es el recomendado.
La distribución de OCaml contiene:
- Herramientas de análisis léxico y sintáctico llamadas ocamllex y ocamlyacc
- Depurador que permite retroceder para investigar errores.
- Generador de documentación
- Perfilador : para medir el rendimiento
- Muchas bibliotecas de uso general
El compilador de código nativo está disponible para muchas plataformas, incluidas Unix , Microsoft Windows y Apple macOS . La portabilidad se logra mediante la compatibilidad con la generación de código nativo para las principales arquitecturas:
- X86-64 (AMD64), RISC-V y ARM64 (en OCaml 5.0.0 y superior) [ 19 ]
- IBM Z (antes de OCaml 5.0.0 y de nuevo en OCaml 5.1.0)
- Potencia (antes de OCaml 5.0.0, y que reaparecerá en OCaml 5.2.0)
- IA-32 y ARM (antes de OCaml 5.0.0)
- SPARC (antes de OCaml 4.06.0)
- DEC Alpha , HPPA , IA64 y MIPS (antes de OCaml 4.00.0)
El compilador de código de bytes admite el funcionamiento en cualquier arquitectura de 32 o 64 bits cuando la generación de código nativo no está disponible, requiriendo únicamente un compilador de C.
Los programas de código de bytes y código nativo de OCaml se pueden escribir en un estilo multihilo , con cambio de contexto preventivo . Los hilos de OCaml en el mismo dominio [ 20 ] se ejecutan únicamente mediante tiempo compartido . Sin embargo, un programa de OCaml puede contener varios dominios.
Ejemplos de código
Los fragmentos de código OCaml se estudian más fácilmente introduciéndolos en el REPL de nivel superior . Esta es una sesión interactiva de OCaml que imprime los tipos inferidos de las expresiones resultantes o definidas. [ 21 ] El nivel superior de OCaml se inicia simplemente ejecutando el programa OCaml:
$ ocaml Versión de OCaml 5.4.0 Escriba #help;; para obtener ayuda.#A continuación, se puede introducir el código en el indicador "#". Por ejemplo, para calcular 1+2*3:
# 1 + 2 * 3 ;; - : int = 7OCaml deduce que el tipo de la expresión es "int" (un entero de precisión de máquina ) y da como resultado "7".
Hola Mundo
El siguiente programa "hello.ml":
print_endline "¡Hola mundo!"se puede ejecutar directamente:
$ ocaml hello.ml
compilado en un ejecutable de código de bytes :
$ ocamlc hello.ml -o hello
o compilado en un ejecutable de código nativo optimizado :
$ ocamlopt hello.ml -o hello
y ejecutado:
$ ./hola ¡Hola mundo! $El primer argumento de ocamlc, "hello.ml", especifica el archivo fuente a compilar y la bandera "-o hello" especifica el archivo de salida. [ 22 ]
Opción
El optionconstructor de tipos en OCaml, similar al Maybetipo en Haskell , aumenta un tipo de datos dado para devolver Someun valor del tipo de datos dado, o para devolver None. [ 23 ] Esto se utiliza para expresar que un valor puede estar presente o no.
# Algunos 42 ;; - : int opción = Algunos 42 # Ninguno ;; - : ' una opción = NingunoEste es un ejemplo de una función que extrae un entero de una opción, si lo hay, y lo convierte en una cadena , o, si no, devuelve una cadena vacía:
let extract o = match o with | Some i -> string_of_int i | None -> "" ;;# extraer ( Algunos 42 );; - : cadena = "42" # extraer Ninguno ;; - : cadena = ""Sumar una lista de números enteros
Las listas son uno de los tipos de datos fundamentales en OCaml. El siguiente ejemplo de código define una función recursiva llamada `sum` que acepta un argumento, `integers` , que se supone que es una lista de enteros. Nótese la palabra clave ` recrecursiva`, que indica que la función es recursiva. La función itera recursivamente sobre la lista de enteros dada y proporciona la suma de sus elementos. La instrucción `match` tiene similitudes con el elemento ` switch` de C , aunque es mucho más general.
let rec sum integers = (* La palabra clave rec significa 'recursivo'. *) match integers with | [] -> 0 (* Devuelve 0 si integers es la lista vacía []. *) | first :: rest -> first + sum rest ;; (* Llamada recursiva si integers es una lista no vacía; first es el primer elemento de la lista y rest es una lista con el resto de los elementos, posiblemente []. *)# suma [ 1 ; 2 ; 3 ; 4 ; 5 ];; - : int = 15Otra forma es utilizar la función de plegado estándar que funciona con listas.
let sum integers = List . fold_left ( fun accumulator x -> accumulator + x ) 0 integers ;;# suma [ 1 ; 2 ; 3 ; 4 ; 5 ];; - : int = 15Dado que la función anónima es simplemente la aplicación del operador +, esto se puede abreviar a:
sea suma enteros = Lista . fold_left (+) 0 enterosAdemás, se puede omitir el argumento de lista haciendo uso de una aplicación parcial :
sea suma = Lista . fold_left (+) 0Ordenación rápida
OCaml se presta a expresar algoritmos recursivos de forma concisa. El siguiente ejemplo de código implementa un algoritmo similar a quicksort que ordena una lista en orden ascendente.
let rec qsort = function | [] -> [] | pivot :: rest -> let is_less x = x < pivot in let left , right = List . partition is_less rest in qsort left @ [ pivot ] @ qsort rightO bien, utilizando la aplicación parcial del operador >=.
let rec qsort = function | [] -> [] | pivot :: rest -> let is_less = (>=) pivot in let left , right = List . partition is_less rest in qsort left @ [ pivot ] @ qsort rightProblema de cumpleaños
El siguiente programa calcula el número más pequeño de personas en una habitación para las cuales la probabilidad de cumpleaños completamente únicos es menor al 50% (el problema del cumpleaños , donde para 1 persona la probabilidad es 365/365 (o 100%), para 2 es 364/365, para 3 es 364/365 × 363/365, etc.) (respuesta = 23).
sea year_size = 365 .let rec birthday_paradox prob people = let prob = ( year_size -. float people ) /. year_size *. prob in if prob < 0 . 5 then Printf . printf "answer = %d \n " ( people + 1 ) else birthday_paradox prob ( people + 1 ) ;;paradoja_del_cumpleaños 1 . 0 1Numerales de la iglesia
El siguiente código define una codificación Church de números naturales , con sucesor (succ) y suma (add). Un numeral Church nes una función de orden superior que acepta una función fy un valor , xy se aplica fexactamente veces. Para convertir un numeral Church de un valor funcional a una cadena, le pasamos una función que antepone la cadena a su entrada y la cadena constante . El ejemplo dado muestra el numeral Church para cinco como “SSSSS0”.xn"S""0"
let zero f x = x let succ n f x = f ( n f x ) let one = succ zero let two = 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 church_5 = to_string ( add ( succ two ) two ) ;; print_endline church_5 ;Función factorial de precisión arbitraria (bibliotecas)
OCaml ofrece acceso directo a diversas bibliotecas. Por ejemplo, incluye una biblioteca integrada para aritmética de precisión arbitraria . Dado que la función factorial crece muy rápidamente, supera con facilidad los límites de los números de precisión de máquina (normalmente de 32 o 64 bits). Por lo tanto, la función factorial resulta idónea para la aritmética de precisión arbitraria.
En OCaml, el módulo Num (ahora reemplazado por el módulo ZArith) proporciona aritmética de precisión arbitraria y se puede cargar en un nivel superior en ejecución usando:
# # usar "topfind" ;; # # requerir "num" ;; # abrir Num ;;La función factorial se puede escribir entonces utilizando los operadores numéricos de precisión arbitraria =/ , */ y -/ :
# let rec fact n = if n =/ Int 0 then Int 1 else n */ fact ( n -/ Int 1 );; val fact : Num . num -> Num . num = < fun >Esta función puede calcular factoriales mucho mayores, como 120!:
# cadena_de_num ( hecho ( Int 120 ));; - : cadena = "6689502913449127057588118054090372586752746333138029810295671352301633 55724496298936687416527198498130815763789321409055253440858940812185989 8481114389650005964960521256960000000000000000000000000000"Triángulo (gráficos)
El siguiente programa renderiza un triángulo giratorio en 2D usando OpenGL :
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 () en GlMat . modo ` modelview ; Glut . displayFunc ~ cb : render ; Glut . idleFunc ~ cb :( Some Glut . postRedisplay ); Glut . mainLoop ()Se requieren las bibliotecas LablGL para OpenGL. El programa se puede compilar a código de bytes con:
$ ocamlc -I +lablGL lablglut.cma lablgl.cma simple.ml -o simple
o a nativecode con:
$ ocamlopt -I +lablGL lablglut.cmxa lablgl.cmxa simple.ml -o simple
o, más sencillamente, utilizando el comando de compilación ocamlfind.
$ ocamlfind opt simple.ml -package lablgl.glut -linkpkg -o simple
y correr:
$ ./simple
En OCaml se pueden desarrollar programas gráficos 2D y 3D mucho más sofisticados y de alto rendimiento. Gracias al uso de OpenGL y OCaml, los programas resultantes pueden ser multiplataforma, compilándose sin necesidad de modificaciones en muchas de las principales plataformas.
secuencia de Fibonacci
El siguiente código calcula la secuencia de Fibonacci de un número n dado como entrada. Utiliza recursión de cola y coincidencia de patrones.
sea fib n = sea rec fib_aux m a b = coincidir m con | 0 -> a | _ -> fib_aux ( m - 1 ) b ( a + b ) en fib_aux n 0 1Funciones de orden superior
Las funciones pueden recibir otras funciones como entrada y devolver otras funciones como resultado. Por ejemplo, aplicar dos veces a una función f produce una función que aplica f dos veces a su argumento.
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 );;# add2 98 ;; - : int = 100 # add_str "Prueba" ;; - : string = "Prueba Prueba Prueba Prueba"La función twice utiliza una variable de tipo 'a' para indicar que puede aplicarse a cualquier función f que mapee un tipo 'a' a sí misma, en lugar de solo a funciones int->int . En particular, twice incluso puede aplicarse a sí misma.
# let fourtimes f = ( dos veces dos veces ) f ;; val fourtimes : ( ' a -> ' a ) -> ' a -> ' a = < fun > # let add4 = fourtimes inc ;; val add4 : int -> int = < fun > # add4 98 ;; - : int = 102Lenguas derivadas
MetaOCaml
MetaOCaml [ 24 ] es una extensión de programación multietapa de OCaml que permite la compilación incremental de nuevo código máquina durante el tiempo de ejecución. En ciertas circunstancias, es posible obtener mejoras de velocidad significativas utilizando la programación multietapa , ya que se dispone de información más detallada sobre los datos a procesar en tiempo de ejecución que en tiempo de compilación regular, por lo que el compilador incremental puede optimizar muchos casos de comprobación de condiciones, etc.
Como ejemplo: si en tiempo de compilación se sabe que se necesita con frecuencia alguna función de potencia , pero el valor de se conoce solo en tiempo de ejecución , se puede utilizar una función de potencia de dos etapas en MetaOCaml:x->x^nn
sea rec potencia n x = si n = 0 entonces .< 1 >. sino si n par entonces sqr ( potencia ( n / 2 ) x ) sino .<.~ x *. .~( potencia ( n - 1 ) x )>.En cuanto nse conoce en tiempo de ejecución, se puede crear una función de potencia especializada y muy rápida:
.< fun x -> .~( potencia 5 .< x >.)>.El resultado es:
fun x_1 -> ( x_1 * let y_3 = let y_2 = ( x_1 * 1 ) in ( y_2 * y_2 ) in ( y_3 * y_3 ))La nueva función se compila automáticamente.
Otros idiomas derivados
- F# es un lenguaje de framework .NET basado en OCaml.
- JoCaml integra construcciones para el desarrollo de programas concurrentes y distribuidos .
- Reason es una sintaxis y un conjunto de herramientas alternativos para OCaml, creados en Facebook , que pueden compilarse tanto a código nativo como a JavaScript .
Software escrito en OCaml
- Ahrefs, un producto de software SEO
- Alt-Ergo , un solucionador SMT .
- Astrée , un analizador estático
- Be Sport , una red social
- Coccinelle , una utilidad para transformar el código fuente de programas en C.
- Rocq (nombre anterior: Coq ), un sistema formal de gestión de pruebas .
- Easycrypt, un conjunto de herramientas para escribir pruebas asistidas por computadora . [ 25 ]
- F* , un lenguaje de programación de alto nivel, multiparadigma, funcional y orientado a objetos, destinado a la verificación de programas .
- FFTW , una biblioteca para calcular transformadas discretas de Fourier . Varias rutinas en C han sido generadas por un programa OCaml llamado
genfft. - La versión web de Facebook Messenger . [ 26 ]
- Flow, un analizador estático creado en Facebook que infiere y verifica tipos estáticos para JavaScript . [ 27 ]
- Frama-C , un marco de trabajo para analizar programas en C.
- GeneWeb , software de genealogía multiplataforma, gratuito y de código abierto.
- El compilador del lenguaje de programación Hack , creado en Facebook, extiende PHP con tipos estáticos.
- El compilador del lenguaje de programación Haxe .
- HOL Light , un asistente de pruebas formal.
- Infer, un analizador estático creado en Facebook para Java , C, C++ y Objective-C , utilizado para detectar errores en aplicaciones iOS y Android . [ 28 ]
- Liquidsoap , un lenguaje de scripting para generar flujos multimedia.
- MirageOS , un marco de programación unikernel escrito íntegramente en OCaml.
- MLdonkey , una aplicación de intercambio de archivos entre pares basada en la red EDonkey .
- Ocsigen , un framework de desarrollo web y móvil cliente-servidor.
- Opa , un lenguaje de programación gratuito y de código abierto para el desarrollo web.
- Owl Scientific Computing , un sistema especializado en computación científica y de ingeniería.
- Reason es una sintaxis alternativa para OCaml que se asemeja más a C o JavaScript.
- ReScript , un lenguaje de programación de tipado estático que se transpila a JavaScript.
- El compilador de Rust se implementó inicialmente en OCaml antes de convertirse en un sistema autoalojado .
- Tezos , una plataforma de contratos inteligentes que se auto-modifica y que utiliza XTZ como moneda nativa.
- Unison , un programa de sincronización de archivos para sincronizar archivos entre dos directorios.
- El intérprete de referencia para WebAssembly , un código de bytes de bajo nivel destinado a la ejecución dentro de navegadores web . [ 29 ]
- Xen Cloud Platform (XCP), una solución de virtualización llave en mano para el hipervisor Xen .
Usuarios
Al menos varias docenas de empresas utilizan OCaml en algún grado. [ 30 ] Algunos ejemplos notables incluyen:
- Bloomberg LP , que creó BuckleScript, un backend de compilador OCaml dirigido a JavaScript (que posteriormente evolucionó a ReScript ). [ 31 ]
- Citrix Systems , que utiliza OCaml en XenServer (renombrado como Citrix Hypervisor durante 2018). [ 32 ]
- Facebook , que desarrolló Flow, [ 33 ] Hack, Infer, Pfff y ReasonML en OCaml.
- Jane Street Capital , una firma de negociación por cuenta propia , que adoptó OCaml como su lenguaje preferido en sus inicios [ 34 ] y continúa usándolo a partir de 2023. [ 35 ] [ 36 ] En junio de 2025 anunció una bifurcación, OxCaml . [ 37 ]
- Docker , que utiliza OCaml en las ediciones de escritorio en macOS y Windows . [ 38 ] [ 39 ] [ 40 ]
En el ámbito de la docencia e investigación académica, OCaml tiene una presencia destacada en los programas de enseñanza de informática, tanto en universidades como en centros de enseñanza superior. En ocaml.org se puede consultar una lista de recursos educativos y estos programas .
Referencias
- ↑ "Módulos" . Consultado el 22 de febrero de 2020 .
- ↑ Leroy, Xavier (1996). "Objective Caml 1.00" . Lista de correo caml-list.
- ↑ "Notas de la versión de OCaml 5.5.0" .
- ↑ "Influencias - The Rust Reference" . The Rust Reference . Consultado el 31 de diciembre de 2023 .
- ↑ «Jérôme Vouillon» . www.irif.fr. Consultado el 14 de junio de 2024 .
- ↑ "Didier Remy" . paulillac.inria.fr . Consultado el 14 de junio de 2024 .
- ↑ "Historia de OCaml" . Consultado el 24 de diciembre de 2016 .
- ↑ Noticias semanales de Linux .
- ↑ "AJ Milner - Galardonado con el Premio AM Turing" . amturing.acm.org . Consultado el 6 de octubre de 2022 .
- 1 2 Clarkson, Michael; et al. "1.2. OCaml: Programación funcional en OCaml" . courses.cs.cornell.edu . Recuperado el 6 de octubre de 2022 .
- 1 2 3 4 5 6 7 8 9 "Prólogo - OCaml del mundo real" . dev.realworldocaml.org . Consultado el 6 de octubre de 2022 .
- 1 2 3 4 5 6 7 "Una historia de OCaml – OCaml" . v2.ocaml.org . Consultado el 7 de octubre de 2022 .
- ↑ "Lanzamiento del paquete OCaml 5.0.0" . OCaml . Archivado del original el 26 de marzo de 2023. Consultado el 16 de diciembre de 2022 .
- ↑ "Projet Cristal" . cristal.inria.fr . Consultado el 7 de octubre de 2022 .
- ↑ "Equipo Gallium - Inicio" . gallium.inria.fr . Consultado el 7 de octubre de 2022 .
- ↑ "Inicio" . cambium.inria.fr . Consultado el 7 de octubre de 2022 .
- ↑ "Gobernanza y membresía del compilador OCaml" . 2023.
- ↑ "Gobernanza y proyectos de OCaml" . 2023.
- ↑ "ocaml/asmcomp en trunk · ocaml/ocaml · GitHub" . GitHub . Consultado el 2 de mayo de 2015 .
- ↑ Un dominio es una unidad de paralelismo en OCaml; un dominio generalmente corresponde a un núcleo de CPU.
- ↑ "OCaml - El sistema de nivel superior o REPL (ocaml)" . ocaml.org . Consultado el 17 de mayo de 2021 .
- ↑ "OCaml - Compilación por lotes (Ocamlc)" .
- ↑ "3.7. Opciones — Programación en OCaml: Correcta + Eficiente + Hermosa" . cs3110.github.io . Consultado el 7 de octubre de 2022 .
- ↑ oleg-at-okmij.org. "BER MetaOCaml" . okmij.org .
- ↑ EasyCrypt/easycrypt , EasyCrypt, 5 de julio de 2024 , consultado el 5 de julio de 2024
- ↑ "Messenger.com ahora se ha convertido en un 50% a Reason · Reason" . reasonml.github.io . Consultado el 27 de febrero de 2018 .
- ↑ "Flow: Un verificador de tipos estático para JavaScript" . Flow . Archivado del original el 8 de abril de 2022. Consultado el 10 de febrero de 2019 .
- ↑ "Inferir analizador estático" . Inferir .
- ↑ "WebAssembly/spec: Especificación, intérprete de referencia y conjunto de pruebas de WebAssembly" . Consorcio World Wide Web . 5 de diciembre de 2019. Recuperado el 14 de mayo de 2021 a través de GitHub.
- ↑ "Empresas que utilizan OCaml" . OCaml.org . Consultado el 14 de mayo de 2021 .
- ↑ "BuckleScript: ¡Ya está aquí la versión 1.0! | Tecnología en Bloomberg" . Tecnología en Bloomberg . 8 de septiembre de 2016. Consultado el 21 de mayo de 2017 .
- ↑ Scott, David; Sharp, Richard; Gazagnaire, Thomas; Madhavapeddy, Anil (2010). Uso de la programación funcional dentro de un grupo de productos industriales: perspectivas y percepciones . Conferencia Internacional sobre Programación Funcional . Asociación para la Maquinaria de Computación . doi : 10.1145/1863543.1863557 .
- ↑ "Flow en GitHub" . GitHub . 2023.
- ↑ Yaron Minsky (1 de noviembre de 2011). "OCaml para las masas" . Consultado el 2 de mayo de 2015 .
- ↑ Yaron Minsky (2016). "Conferencia magistral: observaciones de un programador funcional" . Usos comerciales de la programación funcional en la ACM .
- ↑ Yaron Minsky (2023). "Signals & Threads" (Podcast). Jane Street Capital .
- ↑ La astuta táctica de retención de Jane Street , The Economist , 26 de junio de 2025.
- ↑ Anil Madhavapeddy (2016). "Mejorando Docker con Unikernels: Presentación de HyperKit, VPNKit y DataKit" . Docker, Inc.
- ↑ "VPNKit en GitHub" . GitHub . 2023.
- ↑ Madhavapeddy, Anil ; Scott, David J.; Ferris, Patrick; Gibb, Ryan T.; Gazagnaire, Thomas (5 de agosto de 2025). "Redes funcionales para millones de escritorios Docker (Informe de experiencia)" . Actas de la ACM sobre lenguajes de programación . 9 (ICFP): 597–615 . doi : 10.1145/3747525 . ISSN 2475-1421 .
Enlaces externos
- Lenguajes de programación de alto nivel
- Software libre multiplataforma
- Lenguajes de programación compilados
- Lenguajes de programación con sintaxis extensible
- Intérpretes de código abierto y libre
- Lenguajes funcionales
- Lenguajes de programación orientados a objetos
- Familia de lenguajes de programación ML
- Familia de lenguajes de programación OCaml
- Software programado en OCaml
- Lenguajes de programación que coinciden con patrones
- Lenguajes de programación creados en 1996
- Lenguajes de programación de tipado estático
- Software que utiliza la Licencia Pública General Reducida de GNU.