Articulo de referencia

OCaml

{{cite web|title=Modules|url=https://ocaml.org/learn/tutorials/modules.html|access-date=22 February 2020}} [[Object-oriented programming|object-oriented]]"},"family":{"wt":"[[ML...

OCaml ( / ˈ 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

El equipo de desarrollo de OCaml recibe un premio en el Simposio sobre Principios de Lenguajes de Programación (POPL) 2024.

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:

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:

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 = 7

OCaml 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 = Ninguno

Este 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 = 15

Otra 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 = 15

Dado 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 enteros

Además, se puede omitir el argumento de lista haciendo uso de una aplicación parcial :

sea ​​suma = Lista . fold_left (+) 0

Ordenació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 right

O 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 right

Problema 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 1

Numerales 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 1

Funciones 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 = 102

Lenguas 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

Software escrito en OCaml

Usuarios

Al menos varias docenas de empresas utilizan OCaml en algún grado. [ 30 ] Algunos ejemplos notables incluyen:

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

  1. "Módulos" . Consultado el 22 de febrero de 2020 .
  2. Leroy, Xavier (1996). "Objective Caml 1.00" . Lista de correo caml-list.
  3. "Notas de la versión de OCaml 5.5.0" .
  4. "Influencias - The Rust Reference" . The Rust Reference . Consultado el 31 de diciembre de 2023 .
  5. «Jérôme Vouillon» . www.irif.fr. ​Consultado el 14 de junio de 2024 .
  6. "Didier Remy" . paulillac.inria.fr . Consultado el 14 de junio de 2024 .
  7. "Historia de OCaml" . Consultado el 24 de diciembre de 2016 .
  8. Noticias semanales de Linux .
  9. "AJ Milner - Galardonado con el Premio AM Turing" . amturing.acm.org . Consultado el 6 de octubre de 2022 .
  10. 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 . 
  11. 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 .
  12. 1 2 3 4 5 6 7 "Una historia de OCaml – OCaml" . v2.ocaml.org . Consultado el 7 de octubre de 2022 .
  13. "Lanzamiento del paquete OCaml 5.0.0" . OCaml . Archivado del original el 26 de marzo de 2023. Consultado el 16 de diciembre de 2022 .
  14. "Projet Cristal" . cristal.inria.fr . Consultado el 7 de octubre de 2022 .
  15. "Equipo Gallium - Inicio" . gallium.inria.fr . Consultado el 7 de octubre de 2022 .
  16. "Inicio" . cambium.inria.fr . Consultado el 7 de octubre de 2022 .
  17. "Gobernanza y membresía del compilador OCaml" . 2023.
  18. "Gobernanza y proyectos de OCaml" . 2023.
  19. "ocaml/asmcomp en trunk · ocaml/ocaml · GitHub" . GitHub . Consultado el 2 de mayo de 2015 .
  20. Un dominio es una unidad de paralelismo en OCaml; un dominio generalmente corresponde a un núcleo de CPU.
  21. "OCaml - El sistema de nivel superior o REPL (ocaml)" . ocaml.org . Consultado el 17 de mayo de 2021 .
  22. "OCaml - Compilación por lotes (Ocamlc)" .
  23. "3.7. Opciones — Programación en OCaml: Correcta + Eficiente + Hermosa" . cs3110.github.io . Consultado el 7 de octubre de 2022 .
  24. oleg-at-okmij.org. "BER MetaOCaml" . okmij.org .
  25. EasyCrypt/easycrypt , EasyCrypt, 5 de julio de 2024 , consultado el 5 de julio de 2024
  26. "Messenger.com ahora se ha convertido en un 50% a Reason · Reason" . reasonml.github.io . Consultado el 27 de febrero de 2018 .
  27. "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 .
  28. "Inferir analizador estático" . Inferir .
  29. "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.
  30. "Empresas que utilizan OCaml" . OCaml.org . Consultado el 14 de mayo de 2021 .
  31. "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 .
  32. 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 .
  33. "Flow en GitHub" . GitHub . 2023.
  34. Yaron Minsky (1 de noviembre de 2011). "OCaml para las masas" . Consultado el 2 de mayo de 2015 .
  35. Yaron Minsky (2016). "Conferencia magistral: observaciones de un programador funcional" . Usos comerciales de la programación funcional en la ACM .
  36. Yaron Minsky (2023). "Signals & Threads" (Podcast). Jane Street Capital .
  37. La astuta táctica de retención de Jane Street , The Economist , 26 de junio de 2025.
  38. Anil Madhavapeddy (2016). "Mejorando Docker con Unikernels: Presentación de HyperKit, VPNKit y DataKit" . Docker, Inc.
  39. "VPNKit en GitHub" . GitHub . 2023.
  40. 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 . 
  • Sitio web oficialEdita esto en Wikidata
  • Manual de OCaml
  • Gestor de paquetes OCaml
  • OCaml del mundo real