Clean (limbaj de programare)
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.
Caracteristici
modificareLimbajul 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].
Exemple
modificare 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.
Cum funcționează Clean
modificareCalculul 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]
Compilare
modificare- Fișierele sursă (.icl) și fișierele de definiție (.dcl) sunt traduse în Core Clean, o variantă de bază a Clean, în Clean.
- Core Clean este transformat în limbaj Clean intermediar independent de platformă (.abc), implementat în C și Clean.
- Codul ABC este convertit în cod obiect (.o) folosind C.
- Codul obiect este legat de alte fișiere în modul, iar acesta este convertit într-un executabil normal de către editorul de legături al sistemului de operare (dacă există) sau de editorul de legături dedicat al Clean din Windows.
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.
Platforme
modificareClean 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.
Licență
modificareClean 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ă.
Versus Haskell
modificareViteză
modificareUn 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.
Diferențe sintactice
modificareSintaxa 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 |
Comunitate
modificareCanalul IRC: #cleanlang pe freenode
Note
modificare- ^ „"Idris - Uniqueness Types"”. Accesat în .
- ^ „FAQ - Clean”.
- ^ a b ftp://ftp.cs.ru.nl/pub/Clean/papers/2007/achp2007-CleanHaskellQuickGuide.pdf[nefuncțională – arhivă]
- ^ „Which programming languages are fastest?”. Computer Language Benchmarks Game. Arhivat din original în .
- ^ Jansen, Jan Martin; Koopman, Pieter; Plasmeijer, Rinus (). „From Interpretation to Compilation” (PDF). Accesat în .[nefuncțională – arhivă]