Clean es un lenguaje de programación de computadoras de propósito general puramente funcional . Durante gran parte del historial de desarrollo activo del lenguaje, se llamó Limpieza simultánea , pero se eliminó en algún momento. [ vago ] Clean está siendo desarrollado por un grupo de investigadores de la Universidad Radboud en Nijmegen desde 1987.
Paradigma | funcional |
---|---|
Diseñada por | Grupo de Investigación en Tecnología de Software de la Universidad de Radboud Nijmegen |
Apareció por primera vez | 1987 |
Lanzamiento estable | 3.0 / 19 de octubre de 2018 |
Disciplina de mecanografía | fuerte , estático , dinámico |
SO | Multiplataforma |
Licencia | BSD simplificado [1] |
Extensiones de nombre de archivo | .icl, .dcl, .abc |
Sitio web | limpiar |
Influenciado por | |
Lean , Miranda , Haskell | |
Influenciado | |
Haskell , Idris [2] |
Características
El lenguaje Clean apareció por primera vez en 1987 y todavía se está desarrollando. [3] Comparte muchas propiedades con Haskell : transparencia referencial , comprensión de listas , protecciones , recolección de basura , funciones de orden superior , currying y evaluación perezosa .
En la distribución Clean se incluye un entorno de desarrollo integrado (IDE) para Microsoft Windows .
Limpio trata con estado mutable y E / S a través de un sistema de escritura de singularidad , en contraste con el uso de mónadas de Haskell . El compilador aprovecha el sistema de tipos de unicidad para generar código más eficiente, porque sabe que cualquier cosa con un tipo de unicidad solo se puede usar una vez. Por lo tanto, se puede cambiar un valor único . [4]
Ejemplos de
Inicio = "¡Hola, mundo!"
fac :: Int -> Int fac 0 = 1 fac n = n * fac ( n -1 ) Inicio = fac 10 | fac :: Int -> Int fac n = prod [ 1 .. n ] // El producto de los números 1 an Inicio = fac 10 |
fib :: Int -> Int fib 0 = 1 fib 1 = 1 fib n = fib ( n - 2 ) + fib ( n - 1 ) Inicio = fib 7 | fibs :: Int Int -> [ Int ] fibs x_2 x_1 = [ x_2 : fibs x_1 ( x_2 + x_1 )] fib :: Int -> Int fib n = ( fibs 1 1 ) !! norte Inicio = fib 7 |
Operador de infijo :
( ^ ) infixr 8 :: Int Int -> Int ( ^ ) x 0 = 1 ( ^ ) x norte = x * x ^ ( n -1 )
La declaración de tipo establece que la función es un operador infijo asociativo derecho con prioridad 8: esto establece que x*x^(n-1)
es equivalente a x*(x^(n-1))
en contraposición a (x*x)^(n-1)
. Este operador está predefinido en StdEnv , la biblioteca estándar de Clean.
Cómo funciona Clean
El cálculo se basa en la reescritura y reducción de gráficos . Las constantes como los números son gráficos y las funciones son fórmulas de reescritura de gráficos. Esto, combinado con la compilación en código nativo, hace que los programas Clean que utilizan una alta abstracción se ejecuten relativamente rápido de acuerdo con Computer Language Benchmarks Game . [5]
Compilando
- Los archivos de origen (.icl) y los archivos de definición (.dcl) se traducen en Core Clean, una variante básica de Clean, en Clean.
- Core clean se convierte en el lenguaje intermedio independiente de la plataforma de Clean (.abc), implementado en C y Clean.
- Código intermedio ABC se convierte en código objeto (.o) usando C .
- El código de objeto se vincula con otros archivos en el módulo y el sistema de tiempo de ejecución y se convierte en un ejecutable normal utilizando el vinculador del sistema (cuando esté disponible) o un vinculador dedicado escrito en Clean en Windows .
Las versiones anteriores del sistema Clean se escribieron completamente en C , evitando así problemas de arranque.
El sistema SAPL compila Core Clean en JavaScript y no utiliza código ABC.
La máquina ABC
Para cerrar la brecha entre Core Clean, un lenguaje funcional de alto nivel, y el código de máquina , se utiliza la máquina ABC. Esta es una imperativa máquina de reescritura de gráficos abstractos . [6] Generar código de máquina concreto a partir de código ABC abstracto es un paso relativamente pequeño, por lo que al usar la máquina ABC es mucho más fácil apuntar a múltiples arquitecturas para la generación de código.
La máquina ABC tiene un modelo de memoria poco común . Tiene un almacén de gráficos para guardar el gráfico limpio que se está reescribiendo. La pila A (argumento) contiene argumentos que se refieren a nodos en el almacén de gráficos. De esta manera, los argumentos de un nodo se pueden reescribir, lo cual es necesario para la coincidencia de patrones . La pila B (valor asic) contiene valores básicos (números enteros, caracteres, reales, etc.). Si bien no es estrictamente necesario (todos estos elementos también podrían ser nodos en el almacén de gráficos), usar una pila separada es mucho más eficiente. La pila C (ontrol) contiene direcciones de retorno para control de flujo.
El sistema de ejecución , que está vinculado a cada ejecutable, tiene una print
regla que imprime un nodo en el canal de salida. Cuando se ejecuta un programa, Start
se imprime el nodo. Para ello, debe reescribirse a la forma normal raíz, después de lo cual sus hijos se reescriben a la forma normal raíz, etc., hasta que se imprime todo el nodo.
Plataformas
Clean está disponible para Microsoft Windows , Apple Macintosh , Solaris y Linux .
Algunas bibliotecas no están disponibles en todas las plataformas, como ObjectIO, que solo está disponible en Windows y Mac. La función para escribir dinámicas en archivos solo está disponible en Windows.
Comparación con Haskell
Un punto de referencia de 2008 mostró que el código nativo limpio funciona aproximadamente igual de bien que Haskell ( GHC ), dependiendo del punto de referencia. [7]
Diferencias sintácticas
La sintaxis de Clean es muy similar a la de Haskell, con algunas diferencias notables: [4]
Haskell | Limpio | Observaciones |
---|---|---|
[ x | x <- [ 1 .. 10 ] , isOdd x ] | [ x \\ x <- [ 1 .. 10 ] | isOdd x ] | lista de comprensión |
x : xs | [ x : xs ] | operador de contras |
árbol de datos a = vacío | Nodo ( árbol a ) a ( árbol a ) | :: Árbol a = Vacío | Nodo ( árbol a ) a ( árbol a ) | tipo de datos algebraicos |
( Ecuación a , Ecuación b ) => ... | ... | Eq a y Eq b | afirmaciones y contextos de clase |
fun t @ ( Nodo l x r ) = ... | fun t =: ( Nodo l x r ) = ... | como patrones |
si x > 10 entonces 10 si no x | si ( x > 10 ) 10 x | Si |
En general, Haskell ha introducido más azúcar sintáctico que Clean.
Referencias
- ^ "Descargar limpio" . Limpio . Consultado el 23 de julio de 2019 .
- ^ "Idris - Tipos de unicidad" . Consultado el 20 de noviembre de 2018 .
- ^ "Preguntas frecuentes - Limpiar" .
- ^ a b ftp://ftp.cs.ru.nl/pub/Clean/papers/2007/achp2007-CleanHaskellQuickGuide.pdf
- ^ "¿Qué lenguajes de programación son más rápidos?" . Juego de Benchmarks de Lenguaje de Computadora . Archivado desde el original el 28 de junio de 2011.CS1 maint: bot: estado de URL original desconocido ( enlace )
- ^ Koopman, Pieter (10 de diciembre de 1990). Programas funcionales como especificaciones ejecutables (PhD). Katholieke Universiteit Nijmegen. pag. 35. ISBN 90-9003689-X.
- ^ Jansen, Jan Martin; Koopman, Pieter; Plasmeijer, Rinus (2008). "De la interpretación a la compilación" (PDF) . Consultado el 21 de mayo de 2016 . Cite journal requiere
|journal=
( ayuda )
enlaces externos
- Wiki limpio
- Cloogle: motor de búsqueda de función limpia