Czysty (język programowania)
Paradygmat | funkcjonalny |
---|---|
Zaprojektowany przez | Grupa badawcza technologii oprogramowania na Uniwersytecie Radboud w Nijmegen |
Po raz pierwszy pojawiły się | 1987 |
Wersja stabilna | 3.1 / 5 stycznia 2022
|
Dyscyplina pisania | silny , statyczny , dynamiczny |
system operacyjny | Międzyplatformowe |
Licencja | Uproszczony BSD |
Rozszerzenia nazw plików | .icl, .dcl, .abc |
Strona internetowa | |
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
Początek = „Witaj, świecie!”
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
|
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
- Pliki źródłowe (.icl) i pliki definicji (.dcl) są tłumaczone na Core Clean, podstawowy wariant Clean, w Clean.
- Core clean jest konwertowany na niezależny od platformy język pośredni Clean (.abc), zaimplementowany w C i Clean.
- Pośredni kod ABC jest konwertowany na kod obiektowy (.o) przy użyciu C .
- 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
- Wyczyść Wiki
- clean-lang.org : publiczny rejestr z czystymi pakietami
- cloogle.org : wyszukiwarka do wyszukiwania w czystych pakietach