Clean (limbaj de programare)

De la Wikipedia, enciclopedia liberă
Jump to navigation Jump to search
Clean
Extensii fișiere.icl, .dcl, .abc, .sapl
Paradigmăfuncțional
Apărut în 1987; 33 ani în urmă (1987)
Dezvoltat deSoftware Technology Research Group of Radboud University Nijmegen
Ultima versiune3.0/ 19 octombrie 2018; acum 15 luni (2018-10-19)
Tipul de tipărirestatic, dinamic
Influențat deLean, Miranda, Haskell
InfluențeHaskell, Idris[1]
Sistem de operareCross-platform
LicențăGNU LGPL, Licență BSD, commercial software
Websiteclean.cs.ru.nl

Clean este un limbaj de programare de calculator pur funcțional. Pentru o mare parte din istoria dezvoltării active a limbajului sa numit Concurrent Clean, dar acest lucru a fost abandonat la un moment dat. Clean a fost dezvoltat de un grup de cercetători de la Universitatea Radboud din Nijmegen, 1987.

Caracteristici[modificare | modificare sursă]

Limba Clean a apărut pentru prima dată în 1987 și se dezvoltă încă[2]. Împarte multe proprietăți cu Haskell: transparență referențială, înțelegere de listă, paznici, colectare de gunoi, funcții de ordin superior, curtare și evaluare leneșă.

În Windows, un mediu de dezvoltare integrat (IDE) este inclus în distribuția Clean.

Metoda Clean pentru a face față stării mutabile și I/O se face printr-un sistem de tiparire a unicității, spre deosebire de utilizarea de monede de către Haskell. Compilatorul folosește sistemul de tip unicitate 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ă[3].

Exemple[modificare | modificare sursă]

Program Hello, world!:

 module hello
 Start :: {#Char} 
 Start = "Hello, world!"

Factorial:

  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

Numerele Fibonacci:

  module fibonacci
  fib 0 = 0
  fib 1 = 1
  fib n = fib (n - 2) + fib (n - 1) 
  Start = fib 7

Operator infix:

  (^) 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 de infix 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[modificare | modificare sursă]

Calculul se bazează pe rescrierea și reducerea graficului. Constantele, cum ar fi numerele, sunt graficele și funcțiile sunt formule de rescriere în grafuri. Acest lucru, combinat cu compilația cu codul nativ, face ca programele Clean care utilizează abstractizarea înaltă să funcționeze relativ repede, în conformitate cu Jocul Benchmarkmarks Language of Computer[4].

Compilare[modificare | modificare sursă]

  1. Fișierele sursă (.icl) și fișierele de definiție (.dcl) sunt traduse în Core Clean, o variantă de bază a Clean, în Clean.
  2. Core curat este transformat în biciclete curat independent de platformă (.abc), implementat în C și curat.
  3. Bytecode este convertit în cod obiect (.o) folosind C.
  4. Codul obiect este legat de alte fișiere din modul și de sistemul de execuție și este convertit într-un executabil normal în Clean.

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[modificare | modificare sursă]

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.

Licență[modificare | modificare sursă]

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

Versus Haskell[modificare | modificare sursă]

Viteză[modificare | modificare sursă]

Un punct de referință din 2008 arată că, în majoritatea cazurilor, Clean este mai rapid decât Haskell:[5]

Comparația vitezei a cinci compilatoare (timpul în secunde)
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 outruns Haskell (GHC) în aproape toate cazurile de testare. 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[modificare | modificare sursă]

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

Comunitate[modificare | modificare sursă]

Canalul IRC: #cleanlang pe freenode

Note[modificare | modificare sursă]

  1. ^ "Idris - Uniqueness Types". Accesat în . 
  2. ^ „FAQ - Clean”. 
  3. ^ a b ftp://ftp.cs.ru.nl/pub/Clean/papers/2007/achp2007-CleanHaskellQuickGuide.pdf
  4. ^ „Which programming languages are fastest?”. Computer Language Benchmarks Game. Arhivat din original în . 
  5. ^ Jansen, Jan Martin; Koopman, Pieter; Plasmeijer, Rinus (). „From Interpretation to Compilation” (PDF). Accesat în . 

Legături externe[modificare | modificare sursă]