Limpio

La versión actual de la página aún no ha sido revisada por colaboradores experimentados y puede diferir significativamente de la versión revisada el 27 de febrero de 2018; las comprobaciones requieren 8 ediciones .
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  ( 1987 )
Autor Grupo de Investigación de Tecnología de Software de la Universidad Radboud Nijmegen
Liberar 3.1 (5 de enero de 2022 ) ( 2022-01-05 )
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 .

Características de la lengua

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.

Ejemplos

¡Hola Mundo! :

módulo hola Inicio :: { # Char } Inicio = "¡Hola mundo!"

Factoriales :

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

Números de Fibonacci :

módulo fibonacci mentira 0 = 0 fib1 = 1 _ fib n = fib ( n - 2 ) + fib ( n - 1 ) Comienzo = fib 7

Operador infijo :

( ^ ) infixr 8 :: Int Int -> Int ( ^ ) x 0 = 1 ( ^ ) x norte = x * x ^ ( norte -1 )

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ómo funciona 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.

Compilación

  1. Los archivos de origen (.icl) y los archivos de definición (.dcl) se traducen de Core Clean, la variante básica de Clean, a Clean.
  2. Core Clean se convierte en código de bytes independiente de la plataforma (.abc) que se implementa en C y Clean.
  3. El código de bytes se convierte en código de objeto de objeto (.o) utilizando C.
  4. El código de objeto del objeto está vinculado a otros archivos en el módulo y el sistema de tiempo de ejecución y se convierte en un ejecutable regular.

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.

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

Plataformas

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.

Diferencias de sintaxis con Haskell

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.

Notas

Enlaces