Czysty (język programowania)

Czysty
Clean 3.0 (programming language) logo.svg
Paradygmat funkcjonalny
Zaprojektowany przez Grupa badawcza technologii oprogramowania na Uniwersytecie Radboud w Nijmegen
Po raz pierwszy pojawiły się 1987 ; 36 lat temu ( 1987 )
Wersja stabilna
3.1 / 5 stycznia 2022 ; 13 miesięcy temu ( 05.01.2022 )
Dyscyplina pisania silny , statyczny , dynamiczny
system operacyjny Międzyplatformowe
Licencja Uproszczony BSD
Rozszerzenia nazw plików .icl, .dcl, .abc
Strona internetowa wyczyść .cs .ru .nl
Pod wpływem
Lean , Mirandy , Haskella
Pod wpływem
Haskella , Idrisa

Clean to czysto funkcjonalny język programowania komputerów ogólnego przeznaczenia . Nazywał się Concurrent Clean System , potem Clean System , później po prostu Clean . Clean jest rozwijany przez grupę naukowców z Uniwersytetu Radboud w Nijmegen od 1987 roku.

Cechy

Język Clean pojawił się po raz pierwszy w 1987 roku. Chociaż rozwój samego języka uległ spowolnieniu, niektórzy badacze nadal nad nim pracują. W 2018 roku powstała firma typu spin-off, która również korzysta z Clean.

Clean ma wiele właściwości i składni z młodszym językiem rodzeństwa, Haskell : przezroczystość referencyjna , rozumienie list , strażnicy , wyrzucanie elementów bezużytecznych , funkcje wyższego rzędu , curry i leniwa ocena . Jednak Clean radzi sobie ze zmiennymi stanami i wejściami/wyjściami poprzez unikatowy system typowania , w przeciwieństwie do używania monad przez Haskella . Kompilator wykorzystuje system unikalności typów do generowania wydajniejszego kodu, ponieważ wie, że w dowolnym momencie wykonywania programu może istnieć tylko jedno odwołanie do wartości o unikalnym typie. W związku z tym unikalną wartość można zmienić w miejscu .

Zintegrowane środowisko programistyczne (IDE) dla systemu Microsoft Windows jest zawarte w dystrybucji Clean.

Przykłady

Witaj świecie :

    Początek  =  „Witaj, świecie!” 

czynnikowy :

    
 0  
      

    fac  ::  Int  ->  Int  fac  =  1  fac  n  =  n  *  fac  (  n  -1  )  Start  =  fac  10 
    
     

    fac  ::  Int  ->  Int  fac  n  =  prod  [  1  ..  n  ]  // Iloczyn liczb od 1 do n  Start  =  fac  10 

Ciąg Fibonacciego :

    
 0  
   
            

    fib  ::  Int  ->  Int  fib  =  1  fib  1  =  1  fib  n  =  fib  (  n  -  2  )  +  fib  (  n  -  1  )  Początek  =  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 

Operator wrostka :

       
  0  
         (  ^  )  wrostek  8  ::  Int  Int  ->  Int  (  ^  )  x  =  1  (  ^  )  x  n  =  x  *  x  ^  (  n  -1  ) 

Deklaracja typu stwierdza, że ​​funkcja jest prawym asocjacyjnym operatorem infiksowym z priorytetem 8: oznacza to, że x*x^(n-1) jest równoważne x*(x^(n-1)) w przeciwieństwie do (x*x )^(n-1) . Ten operator jest wstępnie zdefiniowany w StdEnv, bibliotece standardowej Clean.

Jak działa Clean

Obliczenia opierają się na przepisaniu i redukcji grafu . Stałe, takie jak liczby, to wykresy, a funkcje to formuły przepisywania wykresów. To, w połączeniu z kompilacją do kodu natywnego, sprawia, że ​​czyste programy, które używają wysokiej abstrakcji, działają stosunkowo szybko, zgodnie z grą Computer Language Benchmarks Game .

Kompilowanie

  1. Pliki źródłowe (.icl) i pliki definicji (.dcl) są tłumaczone na Core Clean, podstawowy wariant Clean, w Clean.
  2. Core clean jest konwertowany na niezależny od platformy język pośredni Clean (.abc), zaimplementowany w C i Clean.
  3. Pośredni kod ABC jest konwertowany na kod obiektowy (.o) przy użyciu C .
  4. Kod obiektowy jest łączony z innymi plikami w module i systemie wykonawczym i konwertowany do normalnego pliku wykonywalnego za pomocą linkera systemowego (jeśli jest dostępny) lub dedykowanego linkera napisanego w Clean on Windows .

Wcześniejsze wersje systemu Clean były napisane w całości w C , dzięki czemu uniknięto problemów z ładowaniem.

System SAPL kompiluje Core Clean do JavaScript i nie używa kodu ABC.

Maszyna ABC

Aby wypełnić lukę między Core Clean, językiem funkcjonalnym wysokiego poziomu, a kodem maszynowym , używana jest maszyna ABC. Jest to bezwzględna maszyna do przepisywania grafów abstrakcyjnych . Generowanie konkretnego kodu maszynowego z abstrakcyjnego kodu ABC to stosunkowo mały krok, więc przy użyciu maszyny ABC znacznie łatwiej jest kierować wiele architektur do generowania kodu.

Maszyna ABC ma niezwykły model pamięci . Ma magazyn wykresów do przechowywania czystego wykresu, który jest przepisywany. Stos A(argument) zawiera argumenty odnoszące się do węzłów w magazynie wykresów. W ten sposób argumenty węzła mogą zostać przepisane, co jest potrzebne do dopasowywania wzorców . Stos B(asic value) przechowuje podstawowe wartości (liczby całkowite, znaki, liczby rzeczywiste itp.). Chociaż nie jest to absolutnie konieczne (wszystkie te elementy mogą być również węzłami w magazynie wykresów), użycie oddzielnego stosu jest znacznie bardziej wydajne. Stos C(ontrol) przechowuje adresy zwrotne do sterowania przepływem.

System wykonawczy , który jest powiązany z każdym plikiem wykonywalnym, ma regułę drukowania , która drukuje węzeł do kanału wyjściowego. Gdy program jest wykonywany, drukowany jest węzeł początkowy . W tym celu musi zostać przepisany do pierwotnej postaci normalnej, po czym jego dzieci są przepisywane do pierwotnej postaci normalnej itd., aż do wydrukowania całego węzła.

Platformy

Narzędzie Clean jest dostępne dla systemów Microsoft Windows ( IA-32 i X86-64 ), macOS ( X86-64 ) i Linux ( IA-32 , X86-64 i AArch64 ).

Niektóre biblioteki nie są dostępne na wszystkich platformach, na przykład ObjectIO, który jest dostępny tylko w systemie Windows. Również funkcja zapisu dynamiki do plików jest dostępna tylko w systemie Windows.

Dostępność Clean na platformę różni się w zależności od wersji:

Wersja Data Linuks System operacyjny Mac Oracle Solaris Okna Różnorodny
IA-32 X86-64 AArch64 Motorola 68040 PowerPC X86-64 SPARC IA-32 X86-64
3.1 5 stycznia 2022 r Tak Tak Tak NIE NIE Tak NIE Tak Tak
3.0 2 października 2018 r Tak Tak NIE NIE NIE Tak NIE Tak Tak
2.4 23 grudnia 2011 r Tak Tak NIE NIE NIE Tak NIE Tak Tak
2.3 22 grudnia 2010 Tak Tak NIE NIE NIE NIE NIE Tak Tak
2.2 19 grudnia 2006 Tak Tak NIE NIE Tak NIE Tak Tak Tak
2.1.1 31 maja 2005 r Tak NIE NIE NIE Tak NIE Tak Tak NIE
2.1.0 31 października 2003 r Tak NIE NIE NIE Tak NIE Tak Tak NIE
2.0.2 12 grudnia 2002 Tak NIE NIE NIE Tak NIE Tak Tak NIE
2.0.1 4 lipca 2002 Tak NIE NIE NIE Tak NIE Tak Tak NIE
2.0 21 grudnia 2001 NIE NIE NIE NIE NIE NIE NIE Tak NIE
1.3.3 13 września 2000 r Tak NIE NIE NIE Tak NIE Tak Tak NIE
1.3.2 1 lipca 1999 r NIE NIE NIE Tak Tak NIE Tak Tak NIE
1.3.1 styczeń 1999 r Tak NIE NIE NIE Tak NIE Tak Tak NIE
1.3 22 maja 1998 Tak NIE NIE NIE Tak NIE Tak Tak NIE
1.2.4 czerwiec 1997 r NIE NIE NIE Tak Tak NIE NIE Tak NIE
1.2.3 maj 1997 r NIE NIE NIE Tak Tak NIE NIE Tak NIE
1.2 13 stycznia 1997 NIE NIE NIE Tak Tak NIE NIE NIE NIE
1.1.3 październik 1996 NIE NIE NIE NIE NIE NIE Tak NIE NIE OS/2 ( i80386 )
1.1.2 wrzesień 1996 Tak NIE NIE NIE NIE NIE Tak NIE NIE SunOS 4 ( SPARC )
1.1 marzec 1996 Tak NIE NIE Tak NIE NIE NIE NIE NIE
1.0.2 wrzesień 1995 r Tak NIE NIE Tak NIE NIE Tak NIE NIE OS/2 ( i80386 ); SunOS 4 ( SPARC )
1.0 maj 1995 NIE NIE NIE Tak NIE NIE NIE NIE NIE OS/2 ( i80386 )
0.8.4 11 maja 1993 r Tak NIE NIE Tak NIE NIE NIE NIE NIE Eksperymentalne wydanie transputera T800
0.8.3 26 lutego 1993 NIE NIE NIE Tak NIE NIE NIE NIE NIE
0.8.1 19 października 1992 NIE NIE NIE Tak NIE NIE NIE NIE NIE
0,8 13 lipca 1992 NIE NIE NIE Tak NIE NIE NIE NIE NIE OS/2 ( i80386 ); SunOS 3-4 ( SPARC )
0,7 maj 1991 NIE NIE NIE Tak NIE NIE NIE NIE NIE SunOS 3-4 ( SPARC )

Porównanie do Haskella

Test porównawczy z 2008 roku wykazał, że czysty kod natywny działa mniej więcej tak samo dobrze jak Haskell ( GHC ), w zależności od testu porównawczego.

Różnice składniowe

Składnia Clean jest bardzo podobna do składni Haskella, z pewnymi znaczącymi różnicami:

Haskella Czysty Uwagi
         [  x  |  x  <-  [  1  ..  10  ]  ,  nieparzyste  x  ] 
         [  x  \\  x  <-  [  1  ..  10  ]  |  jest nieparzysty  x  ] 
rozumienie listy
 x  :  xs 
 [  x  :  xs  ] 
operator minusów
  
   
         Drzewo  danych  a  =  Puste  |  Węzeł  (  Drzewo  a  )  a  (  Drzewo  a  ) 
  
   
         ::  Drzewo  a  =  Puste  |  Węzeł  (  Drzewo  a  )  a  (  Drzewo  a  ) 
algebraiczny typ danych
      (  Równanie  a  ,  Równanie  b  )  =>  ... 
       ...  |  Równanie  a  i  Równanie  b 
asercje klasowe i konteksty
       zabawa  t  @  (  Węzeł  l  x  r  )  =  ... 
       zabawa  t  =:  (  Węzeł  l  x  r  )  =  ... 
jako wzorce
        jeśli  x  >  10  to  10  inaczej  x 
      jeśli  (  x  >  10  )  10  x 
Jeśli

Ogólnie rzecz biorąc, Haskell wprowadził więcej cukru składniowego niż Clean.

Linki zewnętrzne