Sather - Sather

Dla osób o nazwisku zobacz Sather (nazwisko) .

Sather
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 .; 14 lat temu ( 7 lipca 2007 )
Dyscyplina pisania statyczny , mocny
Strona internetowa www .gnu .org /oprogramowanie /sather /
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 mainjest 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łuje createmetodę klasy, której nazwa występuje po operatorze. W tym przykładzie jest używany do tworzenia instancji OUTklasy, 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 + bskrót a.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... endjest preferowanym sposobem definiowania pętli, chociaż whilei repeat- untilsą 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ą INTklasy akceptującą jeden onceargument, co oznacza, że ​​jego wartość nie zmieni się w miarę uzyskiwania wyników iteratora. upto!można zaimplementować w INTklasie 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. SAMEjest pseudoklasą odnoszącą się do bieżącej klasy.

Bibliografia

Zewnętrzne linki