Clean (programmeringsspråk)

Rena
Clean 3.0 (programming language) logo.svg
Paradigm funktionell
Designad av Software Technology Research Group vid Radboud University Nijmegen
Dök först upp 1987 ; 36 år sedan ( 1987 )
Stabil frisättning
3.1 / 5 januari 2022 ; 13 månader sedan ( 2022-01-05 )
Maskinskrivningsdisciplin stark , statisk , dynamisk
OS Cross-plattform
Licens Förenklad BSD
Filnamnstillägg .icl, .dcl, .abc
Hemsida ren .cs .ru .nl
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

Hej världen :

    Start  =  "Hej världen!" 

Faktoriell :

    
 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 

Fibonacci-sekvens :

    
 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

  1. Källfiler (.icl) och definitionsfiler (.dcl) översätts till Core Clean, en grundläggande variant av Clean, i Clean.
  2. Core clean konverteras till Cleans plattformsoberoende mellanspråk (.abc), implementerat i C och Clean.
  3. Mellanliggande ABC-kod konverteras till objektkod (.o) med C .
  4. 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  10  annat  x 
      om  (  x  >  10  )  10  x 
om

I allmänhet har Haskell introducerat mer syntaktisk socker än Clean.

externa länkar