Clean (programmeringsspråk)
Paradigm | funktionell |
---|---|
Designad av | Software Technology Research Group vid Radboud University Nijmegen |
Dök först upp | 1987 |
Stabil frisättning | 3.1 / 5 januari 2022
|
Maskinskrivningsdisciplin | stark , statisk , dynamisk |
OS | Cross-plattform |
Licens | Förenklad BSD |
Filnamnstillägg | .icl, .dcl, .abc |
Hemsida | |
Influerad av | |
Lean , Miranda , Haskell | |
Influerad av | |
Haskell , Idris |
Clean är ett generellt rent funktionellt datorprogrammeringsspråk . Det kallades Concurrent Clean System , sedan Clean System , senare bara Clean . Clean har utvecklats av en grupp forskare från Radboud University i Nijmegen sedan 1987.
Funktioner
Språket Clean dök upp första gången 1987. Även om utvecklingen av själva språket har saktat ner, arbetar vissa forskare fortfarande med språket. 2018 grundades ett spin-off-företag som även använder Clean.
Clean delar många egenskaper och syntax med ett yngre syskonspråk, Haskell : referenstransparens , listförståelse , vakter , sophämtning , högre ordningsfunktioner , currying och lat utvärdering . Clean hanterar dock föränderligt tillstånd och I/O genom ett unikt typsystem , i motsats till Haskells användning av monader . Kompilatorn drar fördel av unikhetstypsystemet för att generera mer effektiv kod, eftersom den vet att när som helst under programmets körning kan endast en referens existera till ett värde med en unik typ. Därför kan ett unikt värde ändras på plats .
En integrerad utvecklingsmiljö (IDE) för Microsoft Windows ingår i Clean-distributionen.
Exempel
Start = "Hej världen!"
0
fac :: Int -> Int fac = 1 fac n = n * fac ( n -1 ) Start = fac 10
|
fac :: Int -> Int fac n = prod [ 1 .. n ] // Produkten av talen 1 till n Start = fac 10
|
0
fib :: Int -> Int fib = 1 fib 1 = 1 fib n = fib ( n - 2 ) + fib ( n - 1 ) Start = fib 7
|
fibs :: Int Int -> [ Int ] fibs x_2 x_1 = [ x_2 : fibs x_1 ( x_2 + x_1 )] fib :: Int -> Int fib n = ( fibs 1 1 ) !! n Start = fib 7
|
Infix- operatör:
0
( ^ ) infixr 8 :: Int Int -> Int ( ^ ) x = 1 ( ^ ) x n = x * x ^ ( n -1 )
Typdeklarationen anger att funktionen är en rätt associativ infixoperator med prioritet 8: denna anger att x*x^(n-1)
är ekvivalent med x*(x^(n-1))
i motsats till (x*x) )^(n-1)
. Denna operatör är fördefinierad i StdEnv, standardbiblioteket Clean.
Hur Clean fungerar
Beräkningen baseras på omskrivning och reduktion av grafer . Konstanter som siffror är grafer och funktioner är formler för omskrivning av grafer. Detta, i kombination med kompilering till inbyggd kod, gör att Clean-program som använder hög abstraktion körs relativt snabbt enligt Computer Language Benchmarks Game .
Sammanställning
- Källfiler (.icl) och definitionsfiler (.dcl) översätts till Core Clean, en grundläggande variant av Clean, i Clean.
- Core clean konverteras till Cleans plattformsoberoende mellanspråk (.abc), implementerat i C och Clean.
- Mellanliggande ABC-kod konverteras till objektkod (.o) med C .
- Objektkoden länkas till andra filer i modulen och runtime-systemet och konverteras till en normal körbar fil med hjälp av systemlinkern ( när den är tillgänglig) eller en dedikerad länkare skriven i Clean på Windows .
Tidigare versioner av Clean-system skrevs helt i C , vilket undviker bootstrapping-problem.
SAPL-systemet kompilerar Core Clean till JavaScript och använder inte ABC-kod.
ABC-maskinen
För att minska gapet mellan Core Clean, ett funktionsspråk på hög nivå, och maskinkod används ABC-maskinen. Detta är en imperativ maskin för omskrivning av abstrakta grafer . Att generera konkret maskinkod från abstrakt ABC-kod är ett relativt litet steg, så genom att använda ABC-maskinen är det mycket lättare att rikta in sig på flera arkitekturer för kodgenerering.
ABC - maskinen har en ovanlig minnesmodell . Den har ett graflager för att hålla den rena grafen som skrivs om. A(rgument)-stacken innehåller argument som refererar till noder i graflagret. På så sätt kan en nods argument skrivas om, vilket behövs för mönstermatchning . B(asic value)-stacken innehåller grundläggande värden (heltal, tecken, reella, etc.). Även om det inte är strikt nödvändigt (alla dessa element kan också vara noder i grafarkivet), är det mycket mer effektivt att använda en separat stack. C(kontroll)-stacken innehåller returadresser för flödeskontroll.
Runtime -systemet , som är länkat till varje körbar fil, har en utskriftsregel
som skriver ut en nod till utgångskanalen. När ett program körs skrivs startnoden ut .
För detta måste den skrivas om till rotnormalform, varefter dess barn skrivs om till rotnormalform, etc., tills hela noden skrivs ut.
Plattformar
Clean är tillgängligt för Microsoft Windows ( IA-32 och X86-64 ), macOS ( X86-64 ) och Linux ( IA-32 , X86-64 och AArch64 ).
Vissa bibliotek är inte tillgängliga på alla plattformar, som ObjectIO som bara är tillgängligt på Windows. Funktionen för att skriva dynamik till filer är också endast tillgänglig på Windows.
Tillgängligheten för Clean per plattform varierar med varje version:
Version | Datum | Linux | Mac OS | Oracle Solaris | Windows | Diverse | |||||
---|---|---|---|---|---|---|---|---|---|---|---|
IA-32 | X86-64 | AArch64 | Motorola 68040 | PowerPC | X86-64 | SPARC | IA-32 | X86-64 | |||
3.1 | 5 januari 2022 | Ja | Ja | Ja | Nej | Nej | Ja | Nej | Ja | Ja | |
3.0 | 2 oktober 2018 | Ja | Ja | Nej | Nej | Nej | Ja | Nej | Ja | Ja | |
2.4 | 23 december 2011 | Ja | Ja | Nej | Nej | Nej | Ja | Nej | Ja | Ja | |
2.3 | 22 december 2010 | Ja | Ja | Nej | Nej | Nej | Nej | Nej | Ja | Ja | |
2.2 | 19 december 2006 | Ja | Ja | Nej | Nej | Ja | Nej | Ja | Ja | Ja | |
2.1.1 | 31 maj 2005 | Ja | Nej | Nej | Nej | Ja | Nej | Ja | Ja | Nej | |
2.1.0 | 31 oktober 2003 | Ja | Nej | Nej | Nej | Ja | Nej | Ja | Ja | Nej | |
2.0.2 | 12 december 2002 | Ja | Nej | Nej | Nej | Ja | Nej | Ja | Ja | Nej | |
2.0.1 | 4 juli 2002 | Ja | Nej | Nej | Nej | Ja | Nej | Ja | Ja | Nej | |
2.0 | 21 december 2001 | Nej | Nej | Nej | Nej | Nej | Nej | Nej | Ja | Nej | |
1.3.3 | 13 september 2000 | Ja | Nej | Nej | Nej | Ja | Nej | Ja | Ja | Nej | |
1.3.2 | 1 juli 1999 | Nej | Nej | Nej | Ja | Ja | Nej | Ja | Ja | Nej | |
1.3.1 | januari 1999 | Ja | Nej | Nej | Nej | Ja | Nej | Ja | Ja | Nej | |
1.3 | 22 maj 1998 | Ja | Nej | Nej | Nej | Ja | Nej | Ja | Ja | Nej | |
1.2.4 | juni 1997 | Nej | Nej | Nej | Ja | Ja | Nej | Nej | Ja | Nej | |
1.2.3 | maj 1997 | Nej | Nej | Nej | Ja | Ja | Nej | Nej | Ja | Nej | |
1.2 | 13 januari 1997 | Nej | Nej | Nej | Ja | Ja | Nej | Nej | Nej | Nej | |
1.1.3 | oktober 1996 | Nej | Nej | Nej | Nej | Nej | Nej | Ja | Nej | Nej | OS/2 ( i80386 ) |
1.1.2 | september 1996 | Ja | Nej | Nej | Nej | Nej | Nej | Ja | Nej | Nej | SunOS 4 ( SPARC ) |
1.1 | mars 1996 | Ja | Nej | Nej | Ja | Nej | Nej | Nej | Nej | Nej | |
1.0.2 | september 1995 | Ja | Nej | Nej | Ja | Nej | Nej | Ja | Nej | Nej | OS/2 ( i80386 ); SunOS 4 ( SPARC ) |
1.0 | maj 1995 | Nej | Nej | Nej | Ja | Nej | Nej | Nej | Nej | Nej | OS/2 ( i80386 ) |
0.8.4 | 11 maj 1993 | Ja | Nej | Nej | Ja | Nej | Nej | Nej | Nej | Nej | Experimentell T800- transputerutlösning |
0.8.3 | 26 februari 1993 | Nej | Nej | Nej | Ja | Nej | Nej | Nej | Nej | Nej | |
0.8.1 | 19 oktober 1992 | Nej | Nej | Nej | Ja | Nej | Nej | Nej | Nej | Nej | |
0,8 | 13 juli 1992 | Nej | Nej | Nej | Ja | Nej | Nej | Nej | Nej | Nej | OS/2 ( i80386 ); SunOS 3–4 ( SPARC ) |
0,7 | maj 1991 | Nej | Nej | Nej | Ja | Nej | Nej | Nej | Nej | Nej | SunOS 3–4 ( SPARC ) |
Jämförelse med Haskell
Ett riktmärke från 2008 visade att Clean native-kod presterar ungefär lika bra som Haskell ( GHC ), beroende på riktmärket.
Syntaktiska skillnader
Syntaxen för Clean är mycket lik den för Haskell, med några anmärkningsvärda skillnader:
Haskell | Rena | Anmärkningar |
---|---|---|
[ x | x <- [ 1 .. 10 ] , ärOdd x ]
|
[ x \\ x <- [ 1 .. 10 ] | ärOdd x ]
|
listförståelse |
x : xs
|
[ x : xs ]
|
nackdelar operatör |
dataträd a = tomt | _ Nod ( Träd a ) a ( Träd a )
|
:: Träd a = Tomt | Nod ( Träd a ) a ( Träd a )
|
algebraisk datatyp |
( Ekv a , Ekv b ) => ...
|
... | Ekv a & Ekv b
|
klasspåståenden och sammanhang |
fun t @ ( Nod l x r ) = ...
|
fun t =: ( Nod l x r ) = ...
|
som-mönster |
om x > 10 så 10 annat x
|
om ( x > 10 ) 10 x
|
om |
I allmänhet har Haskell introducerat mer syntaktisk socker än Clean.
externa länkar
- Rensa Wiki
- clean-lang.org : offentligt register med Clean-paket
- cloogle.org : en sökmotor för att söka i Clean-paket