Snobol – Wikipedia, wolna encyklopedia

Snobol (String Oriented Symbolic Language) – język programowania zaprojektowany specjalnie do przetwarzania napisów. Obecnie pojęcie Snobol obejmuje rodzinę języków programowania, wśród których wyróżnia się język Snobol4 (number 4).

Źródła i rozwinięcie Snobola

[edytuj | edytuj kod]

Snobol wywodzi się częściowo z

  • COMIT-a, a częściowo
  • z idei zawartych w algorytmie Markowa.

Snobol powstał w Bell Telephone Laboratories w 1962 r. Pierwsza jego realizacja została stworzona na maszynie IBM 7090. Około 1965 roku powstał Snobol3. Dalsze prace nad rozwojem Snobola doprowadziły do powstania w 1968 r. języka Snobol4.

Rozwój idei zawartych w języku Snobol oraz ukierunkowanie prac na większą uniwersalność doprowadziły do powstania nowych języków takich jak Icon.

Dialekty języka Snobol

[edytuj | edytuj kod]

Język Snobol4 doczekał się kilku implementacji różniących się między sobą w szczegółach realizacji. Warto tu wymienić następujące wersje:

  • SIL (Snobol Implementation Language),
  • Mainbol (Macro Implementation of Snobol),
  • Fastbol (Fast Snobol),
  • Spitbol (Speedy Implementation of Snobol),
  • Sitbol.

Program w języku Snobol

[edytuj | edytuj kod]

Program komputerowy w języku Snobol4 składa się z ciągu instrukcji zakończonego instrukcją end, która równocześnie pełni funkcję etykiety dla skoku. Instrukcje rozdzielone są separatorem (średnik lub znak końca wiersza). Kontynuacja instrukcji w kolejnym wierszu wymaga aby pierwszy znak linii kontynuacyjnej był znakiem „+” lub „.”. Komentarzem jest linia rozpoczynająca się od znaku „*”.

Instrukcja w języku Snobol4 ma postać:

 etykieta reguła skok 
  • Etykieta instrukcji ma takie samo znaczenie jak w większości języków programowania – identyfikuje ona miejsce w programie, do którego może nastąpić skok.
  • Reguła określa konkretną akcję do wykonania
    • przypisanie
    • uzgodnienie z wzorcem
    • zamiana
    • wyrażenie
  • Skok może być
    • bezwzględny –: (etykieta)
    • skok w przypadku sukcesu –: S(etykieta)
    • skok w przypadku niepowodzenia –: F(etykieta)
    • skoki warunkowe (kolejność S i F dowolna) –: S(etykieta1) F(etykieta2)

Instrukcja przypisania ma postać znaną z ogólnych języków programowania:

WCZYTAJ WIERSZ=INPUT :F(WCZYTAJ) 

Instrukcja uzgadniania z wzorcem ma postać:

PRZEDMIOT WZORZEC: S(etykieta1) F(etykieta2) 

Jej działanie polega na przeglądaniu łańcucha PRZEDMIOT w poszukiwaniu wystąpienia WZORCA i wykonaniu skoku do etykiety1, gdy WZORZEC zostanie znaleziony (instrukcja kończy się sukcesem) lub etykiety2, gdy WZORZEC nie zostanie znaleziony (uzgodnienie zawodzi).

Instrukcja zamiany łączy w sobie działanie dwu powyższych i na postać:

PRZEDMIOT WZORZEC=PODMIOT: S(etykieta1) F(etykieta2) 

w której znalezienie wzorca spowoduje w łańcuchu PRZEDMIOT jego zastąpienie łańcuchem PODMIOT.

Wyrażenie to dowolne poprawne w Snobolu wyrażenie.

Typy danych

[edytuj | edytuj kod]

We wczesnych wersjach Snobola jedynym typem danych był napis (łańcuch) i nawet operacje arytmetyczne były wykonywane na liczbach pamiętanych w postaci napisów.

W Snobol4 dostępne są typy danych:

  • łańcuch (napis): string
  • liczba całkowita: integer
  • liczba zmiennopozycyjna: real
  • nazwa: name
  • tablica: array
  • wzorzec: pattern
  • tabela: table
  • wyrażenie: expresion
  • lista: list

Programista może wyprowadzać własne typy danych.

Składnia

[edytuj | edytuj kod]

Składnia języka Snobol znacząco odbiega od składni „typowych” języków programowania wysokiego poziomu i ma wiele „udziwnień” powodujących często błędy wśród programistów przyzwyczajonych do tradycyjnego zapisu programu, np.

  • kontynuacja instrukcji wymaga w kolejnym wierszu umieszczenia znaku + lub.,
  • zapis wyrażenia wymaga oddzielenia spacjami operatorów i argumentów, np. ‘A+B’ jest błędne i należy pisać ‘A + B’,
  • instrukcja bez etykiety musi się rozpoczynać spacją (pierwszy znak wiersza), gdyż w przeciwnym przypadku pierwszy wyraz instrukcji będzie zinterpretowany jako etykieta,
  • brak struktur sterujących: pętle realizuje się za pomocą skoków do etykiety, instrukcję warunkową poprzez odpowiednie frazy F i S pola skoku,
  • i wiele innych.

W Snobolu można definiować podprogramy w postaci funkcji.

Procesor Snobola

[edytuj | edytuj kod]

Procesor Snobola to aparat uzgadniania. Aby skutecznie pisać programy w tym języku należy zrozumieć działanie aparatu przeszukiwania wzorca i sposoby jego sterowania. Aparat ten jest analogiczną procedurą do działania aparatu wnioskowania w języku Prolog.

Tak więc podobnie jak w Prologu program jest tłumaczony na kod wewnętrzny procesora Snobola, a nie na kod wewnętrzny maszyny. W implementacjach kompilatorów procesor jest włączany do kodu wynikowego i interpretuje swój język wewnętrzny będący wynikiem translacji kodu źródłowego w Snobolu na kod wewnętrzny procesora Snobola. Działanie procesora Snobola opiera się na predykatach, tzn. funkcjach, które mogą bądź generować sukces (powodzenie), bądź mogą zawodzić. Dostępne są również predykaty standardowe, którymi można wpływać na przebieg procesu uzgadniania. Istnieje tu więc pewna analogia do aparatu wnioskowania Prologu.

Snobol zawiera mechanizm automatycznej regeneracji pamięci dynamicznej.

Słowa kluczowe

[edytuj | edytuj kod]

W Snobolu słowa kluczowe zapewniają dostęp do informacji procesora Snobola, przy czym program może je jedynie odczytywać, nie można przypisywać im nowych wartości z wyjątkiem kilku zmiennych systemowych.

Implementacja dla komputera Odra 1305

[edytuj | edytuj kod]

W Polsce zrealizowano dystrybucję Spitbola dla komputerów Odra 1305 w Instytucie Fizyki Uniwersytetu Jagiellońskiego pracującą pod systemem GEORGE 3 w oparciu o pierwszą, autorską wersję Macro-Spitbol dla maszyn serii ICL 1900. Wersja 4.1 uruchomiona została 1983 r.

Przykład

[edytuj | edytuj kod]
          DEFINE('COPYL(L)X,Y')   COPYL   COPYL = COPY(L); X = COPYL          :(K.COPYL)   LOOP    Y = DIFFER(NEXT(X)) COPY(NEXT(X))   :F(RETURN)           PREV(Y) = X; NEXT(X) = Y; X = Y     :(LOOP)   K.COPYL 

Zobacz też

[edytuj | edytuj kod]

Bibliografia

[edytuj | edytuj kod]