El ML concurrente (CML) es una extensión concurrente del lenguaje de programación ML estándar que se caracteriza por su capacidad para permitir a los programadores crear abstracciones de comunicación componibles que son de primera clase en lugar de integradas en el lenguaje. El diseño de CML y sus operaciones primitivas se han adoptado en varios otros lenguajes de programación como GNU Guile , [5] Racket , [6] y Manticore. [4]
Paradigma | Computación concurrente |
---|---|
Familia | ML |
Apareció por primera vez | 1991 [1] |
Sitio web | http://cml.cs.uchicago.edu/ |
Implementaciones importantes | |
SML / NJ , [2] MLton , [3] Manticore [4] |
Conceptos
Muchos lenguajes de programación que admiten la concurrencia ofrecen canales de comunicación que permiten el intercambio de valores entre procesos o subprocesos que se ejecutan simultáneamente en un sistema. Las comunicaciones establecidas entre procesos pueden seguir un protocolo específico, lo que requiere que el programador escriba funciones para establecer el patrón de comunicación requerido. Mientras tanto, un sistema de comunicación a menudo requiere establecer múltiples canales, como a múltiples servidores , y luego elegir entre los canales disponibles cuando hay nuevos datos disponibles. Esto se puede lograr mediante sondeo , como con la operación de selección en sistemas Unix.
La combinación de los protocolos específicos de la aplicación y la comunicación multipartita puede resultar complicada debido a la necesidad de introducir el sondeo y la verificación del bloqueo dentro de un protocolo preexistente. El aprendizaje automático concurrente resuelve este problema al reducir este acoplamiento de conceptos de programación mediante la introducción de eventos sincronizables . [7] Los eventos son una abstracción de primera clase que se puede usar con una operación de sincronización (llamada sync
en CML y Racket) para bloquear potencialmente y luego producir algún valor resultante de la comunicación (por ejemplo, datos transmitidos en un canal).
En CML, los eventos se pueden combinar o manipular mediante una serie de operaciones primitivas. Cada operación primitiva construye un nuevo evento en lugar de modificar el evento en el lugar, lo que permite la construcción de eventos compuestos que representan el patrón de comunicación deseado. Por ejemplo, CML permite al programador combinar varios subeventos para crear un evento compuesto que luego puede hacer una elección no determinista de uno de los subeventos. Otra primitiva crea un nuevo evento que modificará el valor resultante de la sincronización en el evento original. Estos eventos incorporan patrones de comunicación que, en un lenguaje que no sea CML, normalmente se manejarían mediante un ciclo de sondeo o una función con controladores para cada tipo de evento.
Hola Mundo
Aquí hay un programa que se imprime "Hello, world!"
en la consola. Genera un hilo con un canal para cadenas y otro hilo que imprime una cadena recibida en el canal. Utiliza SML / NJ y CML. (Tenga en cuenta que el nombre del montón será diferente en plataformas que no sean linux-x86; es posible que deba cambiar la línea con "cml_test.x86-linux" a algo diferente).
cml_test.cm |
---|
Biblioteca estructura Holaes $ c ml / base . cm $ c ml / cml . cm cml_test . sml |
cml_test.sml |
estructura Hola = estructura abrir CML divertido hola () = dejar val c : cadena chan = canal () en spawn ( fn () => TextIO . print ( recv c )); send ( c , "¡Hola, mundo! \ n " ); salir () final fun main (_, argv ) = RunCML . doit ( fn () => ignorar ( generar hola ), NINGUNO )final |
intento |
---|
$ ml-build cml_test.cm Hello.main Standard ML of New Jersey v110.60 [construido: lunes 27 de noviembre 14:19:21 2006] [escaneando cml_test.cm] [biblioteca $ cml / base.cm es estable] [biblioteca $ cml / cml.cm es estable] [análisis (cml_test.cm): cml_test.sml] [creando directorio .cm / SKEL] [biblioteca $ cml / cml-internal.cm es estable] [biblioteca $ cml / core-cml .cm es estable] [biblioteca $ SMLNJ-BASIS / base.cm es estable] [compilando (cml_test.cm): cml_test.sml] [creando directorio .cm / GUID] [creando directorio .cm / x86-unix] [código : 2170, datos: 42, env: 2561 bytes] [escaneando 18518-export.cm] [escaneando (18518-export.cm): cml_test.cm] [parsing (18518-export.cm): 18518-export.sml] [compilación (18518-export.cm): 18518-export.sml] [código: 309, datos: 37, env: 42 bytes] $ heap2exec cml_test.x86-linux cml_test $ ./cml_test ¡Hola, mundo! |
enlaces externos
Referencias
- ^ Reppy, John H. (junio de 1991). CML: un lenguaje concurrente de orden superior . PLDI.
- ^ "¿Qué es el ML estándar de Nueva Jersey?" . Consultado el 5 de abril de 2021 .
- ^ "ConcurrentMLImplementation" . Consultado el 5 de abril de 2021 .
- ^ a b Fluet, Matthew; Bergstrom, Lars; Ford, Nic; Rainey, Mike; Reppy, John; Shaw, Adam; Xiao, Yingqi (mayo de 2009). "Programación en Manticore, un lenguaje funcional paralelo heterogéneo" (PDF) . Consultado el 11 de julio de 2018 .
- ^ Wingo, Andy (29 de junio de 2017). "Un nuevo AA concurrente" . Consultado el 11 de julio de 2018 .
- ^ Flatt, Matthew; Findler, Robert Bruce (2004). "Abstracciones de sincronización seguras". Actas de la Conferencia ACM SIGPLAN 2004 sobre diseño e implementación de lenguajes de programación . 39 (6): 47–58. doi : 10.1145 / 996841.996849 .
- ^ Reppy, John H. (1993). ML concurrente: Diseño, aplicación y semántica . Programación funcional, concurrencia, simulación y razonamiento automatizado . Apuntes de conferencias en informática. 693 . págs. 165–198. CiteSeerX 10.1.1.50.7965 . doi : 10.1007 / 3-540-56883-2_10 . ISBN 978-3-540-56883-4.