Clean | |
Clean | |
Extensii fișiere | .icl, .dcl, .abc, .sapl |
---|---|
Paradigmă | funcțional |
Apărut în | 1987 |
Proiectat de | Software Technology Research Group of Radboud University Nijmegen |
Ultima versiune | 3.0/ octombrie 19, 2018 |
Tipare | static, dinamic |
Influențat de | Lean, Miranda, Haskell |
Influențe | Haskell, Idris[1] |
Sistem de operare | Cross-platform |
Licență | GNU LGPL, Licență BSD, commercial software |
Prezență online | clean.cs.ru.nl |
Modifică date / text |
Clean este un limbaj de programare pur funcțional. O mare parte din perioada dezvoltării active a limbajului s-a numit Concurrent Clean, dar acest lucru s-a schimbat la un moment dat. Clean a fost dezvoltat de un grup de cercetători de la Universitatea Radboud din Nijmegen, 1987.
Limbajul Clean a apărut pentru prima dată în 1987 și se dezvoltă încă[2]. Are în comun multe proprietăți cu Haskell: transparență referențială, înțelegere de listă, gărzi, colectare de gunoi, funcții de ordin superior, curățare și evaluare leneșă.
În Windows, un mediu de dezvoltare integrat (IDE) este inclus în distribuția Clean.
Metoda Clean de a trata stările mutabile și I/O se face printr-un sistem cu fir de execuție unic, spre deosebire de utilizarea de monade de către Haskell. Compilatorul folosește sistemul cu fir de execuție unic pentru a genera un cod mai eficient, deoarece știe că orice tip de unicitate poate fi folosit o singură dată. Prin urmare, o valoare unică poate fi modificată într-o structură de date persistentă[3].
module hello
Start :: {#Char}
Start = "Hello, world!"
module factorial
import StdEnv
fac 0 = 1
fac n = n * fac (n-1)
// find the factorial of 10
Start = fac 10
|
module factorial2
import StdEnv
fac 0 = 1
fac n = prod [1..n] // The product of the numbers 1 to n
// find the factorial of 6
Start = fac 6
|
module fibonacci
fib 0 = 0
fib 1 = 1
fib n = fib (n - 2) + fib (n - 1)
Start = fib 7
(^) infixr 8 :: Int Int -> Int
(^) x 0 = 1
(^) x n = x * x ^ (n-1)
Declarația de tip afirmă că funcția este un operator infixat asociativ drept cu prioritatea 8: aceasta indică faptul că x*x^(n-1)
este echivalent cu x*(x^(n-1))
față de (x*x)^(n-1)
. Acest operator este predefinit în biblioteca standard StdEnv.
Calculul se bazează pe rescrierea și reducerea grafului. Constantele, cum ar fi numerele, sunt grafuri, iar funcțiile sunt formule de rescriere ale grafurilor. Acest lucru, combinat cu compilarea codului sursă, face ca programele Clean care utilizează abstractizarea înaltă să funcționeze relativ repede, după cum arată testele efectuate cu The Computer Language Benchmarks Game (în română Gama Programelor Benchmarkmark pentru Limbaje de Programare).[4]
Versiunile anterioare ale sistemului Clean au fost scrise complet în C, evitând astfel problemele de bootstrapping.
Sistemul SAPL compilează Core Clean pentru JavaScript și nu utilizează codul ABC.
Clean este disponibil pentru Microsoft Windows, Macintosh, Solaris și Linux.
Unele biblioteci nu sunt disponibile pe toate platformele, cum ar fi ObjectIO, care este disponibil numai pe Windows și Mac. Caracteristica de a scrie dinamica fișierelor este disponibilă numai pe Windows.
Clean este licență dublă: este disponibilă în condițiile GNU LGPL și de asemenea, sub licență de proprietate. Pentru biblioteci, sistem de rulare și exemple, nu GNU LGPL, dar se aplică licența BSD simplificată.
Un test din 2008 arată că, în majoritatea cazurilor, Clean este mai rapid decât Haskell:[5]
Limba | Pri | Sym | Inter | Fib | Match | Ham | Twi | Qns | Kns | Parse | Plog | Qsort | Isort | Msort |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
SAPL Int | 6.1 | 17.6 | 7.8 | 7.3 | 8.5 | 15.7 | 7.9 | 6.5 | 47.1 | 4.4 | 4.0 | 16.4 | 9.4 | 4.4 |
SAPL Bas | 4.3 | 13.2 | 6.0 | 6.5 | 5.9 | 9.8 | 5.6 | 5.1 | 38.3 | 3.8 | 2.6 | 10.1 | 6.7 | 2.6 |
GHC | 2.0 | 1.7 | 8.2 | 4.0 | 4.1 | 8.4 | 6.6 | 3.7 | 17.7 | 2.8 | 0.7 | 4.4 | 2.3 | 3.2 |
GHC -O | 0.9 | 1.5 | 1.8 | 0.2 | 1.0 | 4.0 | 0.1 | 0.4 | 5.7 | 1.9 | 0.4 | 3.2 | 1.9 | 1.0 |
Clean | 0.9 | 0.8 | 0.8 | 0.2 | 1.4 | 2.4 | 2.4 | 0.4 | 3.0 | 4.5 | 0.4 | 1.6 | 1.0 | 0.6 |
După cum se poate observa, Clean întrece Haskell (GHC) în aproape toate cazurile testate. Numai combinatorii de parser sunt mai rapizi în Haskell. Folosind GHC-O obținem unele optimizări, făcând potrivirea modelului și funcțiile de ordin mai înalt mai rapid decât în Clean. În cele mai multe cazuri, cu toate acestea, Clean depășește GHC-O sau cel puțin nu este mai lent.
Sintaxa lui Clean este foarte asemănătoare cu cea a lui Haskell, cu unele diferențe notabile:[3]
Haskell | Clean | Comentarii |
---|---|---|
[ x | x <- [1..10] , isOdd x]
|
[ x \\ x <- [1..10] | isOdd x]
|
lista de înțelegere |
x:xs
|
[x:xs]
|
contra operator |
data Tree a
= Empty
| Node (Tree a) a (Tree a)
|
:: Tree a
= Empty
| Node (Tree a) a (Tree a)
|
tipul de date algebric |
(Eq a, Eq b) => ...
|
... | Eq a & Eq b
|
aserțiuni și contexte de clasă |
fun t@(Node l x r) = ...
|
fun t=:(Node l x r) = ...
|
ca-modele |
if x > 10 then 10 else x
|
if (x > 10) 10 x
|
if |
Canalul IRC: #cleanlang pe freenode