Sather - Sather
Dla osób o nazwisku zobacz Sather (nazwisko) .
Paradygmat | obiektowy , funkcjonalny |
---|---|
Zaprojektowany przez | Steve Omohundro |
Deweloper | Uniwersytet Kalifornijski, Berkeley , Uniwersytet Waikato , projekt GNU |
Po raz pierwszy pojawiły się | 1990 |
Wersja stabilna | 1.2.3/7 lipca 2007 r
|
Dyscyplina pisania | statyczny , mocny |
Strona internetowa | www |
Główne wdrożenia | |
Sather ICSI, Sather GNU | |
Wpływem | |
Eiffel , CLU , Common Lisp , Schemat | |
Pod wpływem | |
Fajny |
Sather to obiektowy język programowania . Powstał około 1990 roku w Międzynarodowym Instytucie Informatyki (ICSI) na Uniwersytecie Kalifornijskim w Berkeley , opracowanym przez międzynarodowy zespół kierowany przez Steve'a Omohundro . Obsługuje garbage collection i generyki według podtypów .
Pierwotnie był oparty na Eiffel , ale różni się i teraz zawiera kilka funkcjonalnych funkcji programowania .
Nazwa jest inspirowana Eiffelem; Sather Wieża jest rozpoznawalny punkt orientacyjny w Berkeley, nazwany Jane Krom Sather , wdowa Peder Sather , który przekazał dużych sum do powstania uniwersytetu.
Sather czerpie również inspirację z innych języków programowania i paradygmatów: iteratorów , projektowania kontraktowego , klas abstrakcyjnych , dziedziczenia wielokrotnego , funkcji anonimowych , przeciążania operatorów , systemu typów kontrawariantnych .
Oryginalna implementacja Berkeley (ostatnia stabilna wersja 1.1 została wydana w 1995 roku, nie jest już utrzymywana) została przyjęta przez Free Software Foundation, stając się więc GNU Sather. Ostatnia stabilna wersja GNU (1.2.3) została wydana w lipcu 2007 roku i obecnie oprogramowanie nie jest utrzymywane. Było kilka innych wariantów: Sather-K z Uniwersytetu w Karlsruhe ; Sather-W z University of Waikato (wdrożenie Sather w wersji 1.3); port Petera Naullsa z ICSI Sather 1.1 na RISC OS ; oraz pSather, równoległa wersja ICSI Sather adresująca architektury wieloprocesorowe z niejednorodnym dostępem do pamięci, ale prezentująca programiście model pamięci współdzielonej.
Były kompilator ICSI Sather (obecnie GNU Sather) jest zaimplementowany jako kompilator do C , tzn. kompilator nie generuje obiektu ani kodu maszynowego , ale pobiera kod źródłowy Sather i generuje kod źródłowy C jako język pośredni . Optymalizacja jest pozostawiona kompilatorowi C.
Kompilator GNU Sather, napisany w samym Sather, jest objęty podwójną licencją GNU GPL i LGPL .
Witaj świecie
class HELLO_WORLD is
main is
#OUT+"Hello World\n";
end;
end;
Kilka uwag:
- Nazwy klas to WIELKIMI LITERAMI; to nie tylko konwencja, ale jest ona egzekwowana przez kompilator.
- Wywoływana metoda
main
jest punktem wejścia do wykonania. Może należeć do dowolnej klasy, ale jeśli jest inny niżMAIN
, musi być określony jako opcja kompilatora. -
#
jest symbolem konstruktora: wywołujecreate
metodę klasy, której nazwa występuje po operatorze. W tym przykładzie jest używany do tworzenia instancjiOUT
klasy, która jest klasą dla standardowego wyjścia . +
Operator został przeciążony przez klasę do dołączania ciąg przekazany jako argument do strumienia.- Operatorzy takie jak
+
to cukier syntaktyczny dla umownie nazwanych wywołań metod:a + b
skróta.plus(b)
. Zwykłe konwencje pierwszeństwa arytmetycznego są używane do rozwiązywania kolejności wywoływania metod w złożonych formułach.
Przykład iteratorów
Ten program drukuje liczby od 1 do 10.
class MAIN is
main is
loop
i := 1.upto!(10);
#OUT + i + "\n";
end;
end;
end;
Konstrukt loop
... end
jest preferowanym sposobem definiowania pętli, chociaż while
i repeat
- until
są również dostępne. W obrębie konstrukcji może być użyty jeden lub więcej iteratorów. Nazwy iteratorów zawsze kończą się wykrzyknikiem. (Ta konwencja jest wymuszana przez kompilator.) upto!
jest metodą INT
klasy akceptującą jeden once
argument, co oznacza, że jego wartość nie zmieni się w miarę uzyskiwania wyników iteratora. upto!
można zaimplementować w INT
klasie z kodem podobnym do poniższego.
upto!(once m:INT):SAME is
i: INT := self; -- initialise i to the value of self,
-- that is the integer of which this method is called
loop
if i>m then
quit; -- leave the loop when i goes beyond m
end;
yield i; -- else use i as return value and stay in the loop
i := i + 1; -- and increment
end;
end;
Informacje o typie zmiennych są oznaczone składnią przyrostka variable:CLASS
. Typ można często wywnioskować, a zatem informacje o typowaniu są opcjonalne, jak w anInteger::=1
. SAME
jest pseudoklasą odnoszącą się do bieżącej klasy.