limpio | |
---|---|
Semántica | funcional |
clase de idioma | lenguaje de programación funcional puro [d] ,lenguajey lenguaje de programación no estricto [d] |
Apareció en | 1987 |
Autor | Grupo de Investigación de Tecnología de Software de la Universidad Radboud Nijmegen |
Liberar | 3.1 (5 de enero de 2022 ) |
sistema de tipos | estricto |
Implementaciones principales | limpio |
sido influenciado | Inclinarse |
Licencia | GNU LGPL |
Sitio web | clean.cs.ru.nl |
Clean es un lenguaje de programación funcional puro que soporta los principios básicos del paradigma de programación funcional . Para los cálculos , utiliza métodos matemáticos tradicionales para derivar valores: una sustitución unificada e inducción matemática .
La distribución Clean incluye un entorno de desarrollo integrado (IDE) para Windows.
El lenguaje limpio es similar en muchos aspectos (incluso sintácticamente ) al lenguaje Haskell . La principal diferencia entre Clean y Haskell es la forma en que interactúa con el estado externo (es decir, la forma de E/S ): en lugar de mónadas , Clean usa tipos que garantizan la unicidad . Esto proporciona más eficiencia en los fragmentos de código relevantes, ya que las estructuras de datos abstractas se actualizan destructivamente , no se reemplazan.
El traductor de lenguaje limpio utiliza la reescritura y reducción de gráficos y genera código nativo con una eficiencia relativamente alta (algunas veces superando a Haskell, otras veces rezagándose) utilizando C como lenguaje intermedio.
módulo factorial importar StdEnv factor 0 = 1 hecho n = n * hecho ( n -1 ) // Encuentra el factorial de 10 Start = fac 10 | módulo factorial2 importar StdEnv factor 0 = 1 fac n = prod [ 1 .. n ] // Producto de números del 1 al n // Encuentra el factorial 6 Inicio = fac 6 |
Esta declaración describe que la función es un operador infijo asociativo por la derecha con precedencia 8: esto significa que x*x^(n-1)es equivalente x*(x^(n-1))a (x*x)^(n-1). Este operador está predefinido en StdEnv , la biblioteca estándar de Clean.
Cálculos basados en la reescritura y reducción de gráficos. Las constantes como los números son gráficos, mientras que las funciones son fórmulas de reescritura de gráficos. Esto, combinado con la compilación a código nativo, hace que los programas escritos en Clean y que usan un alto nivel de abstracción se ejecuten relativamente rápido. Así lo confirman las pruebas de Computer Language Benchmarks Game.
Las versiones anteriores de Clean se escribieron completamente en C para evitar problemas de activación del compilador .
El sistema SAPL compila Core Clean en JavaScript y no utiliza el código de bytes 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. Es una máquina de reescritura de gráficos abstractos imperativa . Generar código de máquina concreto a partir de código ABC abstracto es un paso relativamente pequeño, por lo que es mucho más fácil generar código para múltiples arquitecturas con máquina ABC.
La máquina ABC tiene un modelo de memoria inusual. Tiene una tienda de gráficos para guardar el gráfico editado durante la sobrescritura. La pila A (argumento) almacena los argumentos relacionados con los nodos en el almacenamiento de gráficos. Por lo tanto, los argumentos del nodo se pueden reescribir, lo cual es necesario para la coincidencia de patrones. La pila B (valor básico - valores básicos) contiene valores básicos (enteros, caracteres, números, etc.). Aunque no es estrictamente necesario (todos estos elementos pueden ser nodos en el almacén de gráficos), usar una pila separada es mucho más eficiente. La pila C (Control) contiene las direcciones de retorno para el control de flujo.
Clean tiene versiones para Microsoft Windows , Apple Macintosh , Solaris y Linux .
Algunas bibliotecas no están disponibles para algunas plataformas. Por ejemplo, ObjectIO solo está disponible para Windows y Mac. La función de grabar altavoces en archivos solo está disponible para Windows.
La sintaxis de Clean es muy similar a Haskell, con algunas diferencias notables:
Haskell | limpio | Observaciones |
---|---|---|
[ x | x <- [ 1 .. 10 ] , es impar x ] | [ x \\ x <- [ 1 .. 10 ] | es imparx ] _ | Lista de inclusió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 |
( Eq a , Eq b ) => ... | ... | Ecuación a y ecuación b | aserciones de clase y contextos |
divertido t @ ( Nodo l x r ) = ... | divertido t =: ( Nodo l x r ) = ... | como patrones |
si x > 10 entonces 10 sino x | si ( x > 10 ) 10 x | si |
Básicamente, Haskell tiene más azúcar sintáctico que Clean.
Lenguajes de programación | |
---|---|
|