Clean (limbaj de programare)

Clean
Clean
Extensii fișiere.icl, .dcl, .abc, .sapl
Paradigmăfuncțional
Apărut în1987; acum 37 ani (1987)
Proiectat deSoftware Technology Research Group of Radboud University Nijmegen
Ultima versiune3.0/ octombrie 19, 2018; acum 6 ani, 1 lună și 13 zile (2018-10-19)
Tiparestatic, dinamic
Influențat deLean, Miranda, Haskell
InfluențeHaskell, Idris[1]
Sistem de operareCross-platform
LicențăGNU LGPL, Licență BSD, commercial software
Prezență onlineclean.cs.ru.nl

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

[modificare | modificare sursă]

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

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 infixat:

  (^) 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

[modificare | modificare sursă]

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]

  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 Clean este transformat în limbaj Clean intermediar independent de platformă (.abc), implementat în C și Clean.
  3. Codul ABC este convertit în cod obiect (.o) folosind C.
  4. 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.

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

Versus Haskell

[modificare | modificare sursă]

Un test 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 î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

[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

Canalul IRC: #cleanlang pe freenode

  1. ^ "Idris - Uniqueness Types". Accesat în . 
  2. ^ „FAQ - Clean”. 
  3. ^ a b ftp://ftp.cs.ru.nl/pub/Clean/papers/2007/achp2007-CleanHaskellQuickGuide.pdf[nefuncționalăarhivă]
  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 . [nefuncționalăarhivă]

Legături externe

[modificare | modificare sursă]