Alice ML es un lenguaje de programación funcional , multiparadigma , de alto nivel y de propósito general diseñado por el Laboratorio de Sistemas de Programación de la Universidad del Sarre , Saarbrücken , Alemania . [2] Es un dialecto de ML estándar , aumentado con soporte para evaluación perezosa , concurrencia ( multihilo y computación distribuida a través de llamadas a procedimientos remotos ) y programación de restricciones .
Alice extiende Standard ML de varias maneras que lo distinguen de su predecesor. Alice proporciona características de concurrencia como parte del lenguaje base mediante el uso de un tipo futuro que representa un valor proporcionado por un subproceso de ejecución independiente. Un subproceso que utiliza un valor futuro se bloqueará en un intento de acceder al valor hasta que el subproceso que lo realiza haya completado el cálculo. También se proporciona un concepto relacionado denominado promesa , que permite que un subproceso proporcione un valor futuro que calculará para otro subproceso. Las variables de tipo futuro y promesa se utilizan para implementar la sincronización del flujo de datos.
Al igual que el lenguaje funcional Haskell , Alice ofrece funciones que permiten una estrategia de evaluación diferida en los programas, a diferencia de la estrategia de evaluación ansiosa tradicional de ML estándar. Mientras que Haskell utiliza el modelo diferido de forma predeterminada, Alice utiliza un modelo de evaluación ansiosa de forma predeterminada, que necesita una declaración de programación explícita para que un cálculo se evalúe de forma diferida.
La implementación de Alice de la Universidad de Saarland utiliza la máquina virtual Simple Extensible Abstract Machine (SEAM) . Es un software libre y cuenta con compilación en tiempo real a código de bytes y código nativo para la arquitectura x86 .
Las primeras versiones de Alice se ejecutaban en la máquina virtual (VM) del sistema de programación Mozart (Oz), lo que permitía la interfaz entre Alice y el código de Oz .
La llamada al procedimiento remoto de Alice depende de la máquina virtual, porque puede enviar código para ser calculado desde una computadora a otra.
Alice amplía Standard ML con varias primitivas para la evaluación diferida y la concurrencia. Por ejemplo, se pueden crear subprocesos utilizando la spawn
palabra clave . Considere el algoritmo ingenuo para calcular los números de Fibonacci :
diversión fib 0 = 0 | fib 1 = 1 | fib n = fib ( n- 1 ) + fib ( n- 2 );
Para valores grandes de n
, el cálculo tardará mucho tiempo. Este cálculo se puede realizar en un hilo independiente mediantefib n
val x = spawn fib n ;
La variable x
ahora está vinculada a un denominado futuro . Cuando una operación requiere el valor de x
, se bloquea hasta que el hilo termina el cálculo. Para aprovechar el paralelismo, se podría incluso definir fib de la siguiente manera:
diversión fib 0 = 0 | fib 1 = 1 | fib n = spawn fib ( n- 1 ) + fib ( n- 2 );