Clean es un lenguaje de programación funcional puro de propósito general . Originalmente llamado Concurrent Clean System [ 3 ] o Clean System , [ 4 ] [ 5 ] ha sido desarrollado por un grupo de investigadores de la Universidad Radboud en Nijmegen desde 1987. [ 6 ] [ 7 ] Aunque el desarrollo del lenguaje se ha ralentizado, algunos investigadores siguen trabajando en él. [ 8 ] En 2018, se fundó una empresa derivada que utiliza Clean. [ 9 ]
Características
Clean comparte muchas propiedades y sintaxis con un lenguaje hermano menor, Haskell : transparencia referencial , comprensión de listas , guardas , recolección de basura , funciones de orden superior , currificación y evaluación perezosa . Sin embargo, Clean maneja el estado mutable y la entrada/salida (E/S) a través de un sistema de tipos de unicidad , a diferencia del uso de mónadas de Haskell . El compilador aprovecha el sistema de tipos de unicidad para generar código más eficiente, ya que sabe que en cualquier momento durante la ejecución del programa, solo puede existir una referencia a un valor con un tipo único. Por lo tanto, un valor único puede modificarse directamente . [ 10 ]
La distribución Clean incluye un entorno de desarrollo integrado (IDE) para Microsoft Windows .
Ejemplos
Inicio = "¡Hola, mundo!"( ^ ) infixr 8 :: Int Int -> Int ( ^ ) x 0 = 1 ( ^ ) x n = x * x ^ ( n -1 )La declaración de tipo indica que la función es un operador infijo asociativo derecho con prioridad 8: esto indica 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
La computación se basa en la reescritura y reducción de grafos . Las constantes, como los números, son grafos, y las funciones son fórmulas de reescritura de grafos. Esto, combinado con la compilación a código nativo, hace que los programas Clean, que utilizan un alto nivel de abstracción, se ejecuten relativamente rápido según The Computer Language Benchmarks Game . [ 11 ] Una prueba de rendimiento de 2008 demostró que el código nativo de Clean tiene un rendimiento similar al del Glasgow Haskell Compiler (GHC), dependiendo de la prueba. [ 12 ]
Compilación
La compilación de Clean a código máquina se realiza de la siguiente manera:
- Los archivos fuente (.icl) y los archivos de definición (.dcl) son traducidos a Core Clean, una variante básica de Clean, por el frontend del compilador escrito en Clean.
- El código principal de Clean se convierte en el lenguaje intermedio independiente de la plataforma de Clean (.abc), mediante el backend del compilador escrito en Clean y C.
- El código ABC intermedio se convierte a código objeto (.o) mediante el generador de código escrito en C.
- El código objeto se enlaza con otros archivos del módulo y del sistema de tiempo de ejecución y se convierte en un ejecutable normal utilizando el enlazador del sistema (cuando esté disponible) o un enlazador dedicado escrito en Clean en Windows .
Las versiones anteriores del compilador Clean estaban escritas completamente en C , evitando así problemas de arranque.
La máquina ABC
El código ABC mencionado anteriormente es una representación intermedia para una máquina abstracta . Debido a que la generación de código máquina para el código ABC es relativamente sencilla, es fácil admitir nuevas arquitecturas. La máquina ABC es una máquina imperativa de reescritura de grafos abstractos . [ 13 ] Consta de un almacén de grafos para contener el grafo Clean que se está reescribiendo y tres pilas:
- La pila A (de argumentos) contiene argumentos que hacen referencia a nodos en el almacén de grafos.
- La pila B (valor básico) almacena valores básicos (enteros, caracteres, números reales, etc.). Si bien estos valores podrían ser nodos en el almacenamiento del grafo, se utiliza una pila separada para mayor eficiencia.
- La pila C(control) almacena direcciones de retorno para el control de flujo.
El sistema de ejecución , que está integrado en cada ejecutable, crea un Startnodo en el almacén de grafos y lo coloca en la pila A. A continuación, comienza a imprimirlo y a evaluarlo según sea necesario.
Ejecutando Clean en el navegador
Aunque Clean se usa normalmente para generar ejecutables nativos, varios proyectos han habilitado aplicaciones en navegadores web . El proyecto SAPL, ahora abandonado , compilaba Core Clean a JavaScript y no usaba código ABC. Desde 2019, se usa en su lugar un intérprete de código ABC, escrito en WebAssembly . [ 14 ] [ 15 ]
Plataformas
Clean está disponible para Microsoft Windows ( IA-32 y X86-64 ), macOS ( X86-64 ) y Linux ( IA-32 , X86-64 y AArch64 ).
Algunas bibliotecas no están disponibles en todas las plataformas, como ObjectIO , que solo está disponible en Windows. Asimismo, la función para escribir datos dinámicos en archivos solo está disponible en Windows.
La disponibilidad de Clean por plataforma varía con cada versión: [ 16 ] [ 17 ]
Comparación con Haskell
La sintaxis de Clean es muy similar a la de Haskell, con algunas diferencias notables. En general, Haskell ha introducido más azúcar sintáctico que Clean: [ 10 ]
Referencias
- ↑ "Descargar Clean" . Clean . Consultado el 23 de julio de 2019 .
- ↑ "Idris - Tipos de singularidad" . Consultado el 20 de noviembre de 2018 .
- ↑ "Clean 0.7: Léame" . Archivado del original el 24 de mayo de 2019.
- ↑ "Clean 1.0: Léame" . Archivado del original el 5 de mayo de 2019.
- ↑ "Clean 1.3: Léame" . Archivado del original el 27 de abril de 2019.
- ^ "Universidad Radboud de Nijmegen: Departamento de Ciencia del Software: Software" .
- ↑ "Preguntas frecuentes" . Limpiar . Consultado el 26 de noviembre de 2021 .
- ↑ "Publicaciones" . Limpio . Consultado el 26 de noviembre de 2021 .
- ↑ "Inicio" . Tecnología de software TOP . Consultado el 26 de noviembre de 2021 .
- 1 2 "Enlace FTP" (PDF) . ftp.cs.ru.nl ( FTP ).(Para ver los documentos, consulte Ayuda:FTP )
- ↑ "¿Qué lenguajes de programación son los más rápidos?" . Juego de evaluación comparativa de lenguajes informáticos . Archivado del original el 28 de junio de 2011.
- ^ Jansen, Jan Martín; Koopman, Pieter; Plasmeijer, Rinus (2008). «De la interpretación a la recopilación» (PDF) . Servidor FTP ( FTP ) . Consultado el 21 de mayo de 2016 .(Para ver los documentos, consulte Ayuda:FTP )
- ^ Koopman, Pieter (10 de diciembre de 1990). Programas funcionales como especificaciones ejecutables (Doctor). Universidad Católica de Nijmegen. pag. 35.ISBN 90-9003689-X.
- ↑ "Clean and iTasks / ABC Interpreter · GitLab" . Clean and iTasks en GitLab . Consultado el 13 de abril de 2023 .
- ↑ Staps, Camil; van Groningen, John; Plasmeijer, Rinus (15 de julio de 2021). «Interacción perezosa de código compilado e interpretado para entornos aislados y sistemas distribuidos». Actas del 31.er Simposio sobre Implementación y Aplicación de Lenguajes Funcionales . págs. 1-12 . doi : 10.1145/3412932.3412941 . ISBN 9781450375627. S2CID 202751977 .
- ↑ "Historial de versiones" . Limpio . Consultado el 7 de enero de 2022 .
- ↑ "Índice de /Limpio" . Consultado el 7 de enero de 2022 .
Enlaces externos
- Wiki limpia
- clean-lang.org : registro público con paquetes Clean
- cloogle.org : un motor de búsqueda para buscar en paquetes Clean.
- Lenguajes funcionales
- lenguajes de programación para la reescritura de términos
- Compiladores libres y de código abierto
- Software libre multiplataforma
- Lenguajes de programación creados en 1987
- Lenguajes de programación de tipado estático