Translator języka ALGOL-1204M

Z MERA 400 wiki
Wersja z dnia 16:56, 2 wrz 2013 autorstwa Amo (dyskusja | edycje) (Utworzono nową stronę "= Wstęp = == Wykaz oznaczeń == * OSL - język operatora * TZ - oznacza tytuł zbioru, parametr zleceń; * WO - oznacza wskazanie opcji w zleceniach. Wskazanie opcji ...")
(różn.) ← poprzednia wersja | przejdź do aktualnej wersji (różn.) | następna wersja → (różn.)
Przejdź do nawigacji Przejdź do wyszukiwania

Wstęp

Wykaz oznaczeń

  • OSL - język operatora
  • TZ - oznacza tytuł zbioru, parametr zleceń;
  • WO - oznacza wskazanie opcji w zleceniach. Wskazanie opcji składa się ze znaku "?" i następującego po nim trzyliterowego identyfikatora opcji;
  • <> - wyrażenie w nawiasach ostrych oznacza zmienną meta-językową czyli określenie parametru, który należy podstawić w to miejsce;
  • [] - wyrażenie w nawiasach prostokątnych oznacza opcję czyli parametr który można pominąć;
  • {} - wyrażenie w nawiasach sześciennych obejmuje parametry obowiązkowe;
  • ... - wielokropek oznacza możliwość wystąpienia dalszych parametrów o znaczeniu analogicznym co poprzednie;
  •  ? - znak zapytania poprzedza trzyznakowy tekst określający odpowiedni warunek (opcje);

Uwagi dla czytelnika

Przyjmujemy, że czytelnik zna międzynarodowy język algorytmiczny ALGOL 60 w zakresie ogólnie dostępnej książki:

Język ALGOL 60, Stefan Paszkowski, Wydanie drugie poprawione i uzupełnione, Warszawa 1968. PWN.

z tego powodu omawiamy tylko sprawy specyficzne dla konkretnej reprezentacji ALGOLu dla maszyny Mera-400. Niniejszy tekst dotyczy translatorów wersji A i B opracowanych dla minikomputera Mera 400, pracujących pod kontrolą systemu operacyjnego CROOK-4.

Związek ALGOLu-1204M z językiem ALGOL-60

ALGOL-1204M jest w sensie gramatycznym podzbiorem ALGOLu-60. Rozumiemy przez to, że jeżeli pominiemy pewne szczegóły typograficzne związane z możliwościami urządzeń i komputera, to każdy program napisany w ALGOLu-1204M jest pod względem gramatycznym programem w ALGOLu-60. Niżej podano pełny wykaz ograniczeń obowiązujących w ALGOLu-1204M.

Ograniczenia gramatyczne.

  • Każdy parametr formalny musi mieć specyfikację.
  • Etykieta musi być nazwą.

Ograniczenia i zmiany semantyczne.

  • Skok przy nie określonym przełączeniu powoduje zatrzymanie programu i sygnalizację błędu.
  • Wynik potęgowania jest typu \i\n\t\e\g\e\r, jeżeli podstawa jest typu \i\n\t\e\g\e\r, a wykładnik jest liczbą całkowitą; w przeciwnym razie wynik potęgowania jest typu \r\e\a\l.

Ograniczenia ilościowe.

  • Nazwy, których 63 początkowe znaki są takie same uważa się za identyczne.
  • Wykaz par granicznych w opisie tablic z mianem \o\w\n może zawierać co najwyżej 10 par granicznych.
  • Stopień procedury nie może przekraczać 3.

Stopniem procedury nazywamy liczbę całkowitą określoną następująco:

  • program główny jest procedurą stopnia zero;
  • procedura jest stopnia n, jeżeli najwęższy opis procedury zawierający opis tej pierwszej jest stopnia n-1. Stopień procedury określa więc głębokość zanurzenia opisu procedury w innych opisach procedur.

Istnieją również inne ograniczenia ilościowe spowodowane skończoną wielkością rejestrów maszyny i sposobem pamiętania informacji przez translator. Nie wymieniamy wszystkich tych ograniczeń, ponieważ są one tak dobrane, że ich przekroczenie jest mało prawdopodobne bez uprzedniego wypełnienia całej dostępnej pamięci maszyny informacjami o tłumaczonym programie. Przekroczenie jakiegoś ograniczenia jest sygnalizowane z wyjątkiem przekroczenia przedziału liczb całkowitych przy wykonywaniu działań na takich wielkościach.

Zmiany.

  • Wszystkie słowa kluczowe języka ALGOL-1204M zawierają zamiast znaku podkreślenia znak "\" (np. \b\e\g\i\n, \r\e\a\l, itd.)
  • Język ALGOL-1204M całkowicie zbudowany jest z dużych liter (możliwa jest wersja translatora z małymi i dużymi literami).
  • Całkowicie język ALGOL-1204M jest zbudowany ze znaków kodu ISO-7.
  • Operatory arytmetyczne i logiczne języka zastąpiono odpowiednimi słowami kluczowymi (pkt.3).

Instrukcja eksploatacyjna translatora ALGOL-1204M

Uruchomienie translatora

W systemie operacyjnym CROOK-4, trnslator języka ALGOL-1204M jest oddzielnym programem użytkowym. Jest on dostępny dla każdego użytkownika zadeklarowanego w systemie. W wyniku kompilacji programu napisanego w ALGOLu uzyskuje się gotowy moduł binarny do natychmiastowego uruchomienia.

Proces kompilacji realizuje następujące zlecenie programu OSL:

XTA4 [,<TZ WE>] [,<TZ BIN>] [,<WO>]...

Gdzie <WO> =

  • ?LIS
  • ?TRA
  • ?TPR
  • ?ODL
  • ?OML

Zlecenie uruchamia translację programu napisanego w języku ALGOL-1204M. Parametr pierwszy zlecenia zawiera tytuł zbioru wejściowego z tekstem żródłowym w tym języku. Parametr drugi określa tytuł zbioru binarnego. Zbiór ten jest tworzony (jeżeli nie istnieje) przez translator, a po zakończeniu translacji jest zamykany. Taki zbiór binarny posiada typ BAL (Binary ALgol program). Parametr trzeci określa opcje przebiegu translacji.

Znaczenie opcji:

  • ?LIS - polecenie wyprowadzenia na monitor punktów orientacyjnych.
  • ?TRA - polecenie wykonania translacji ze śladem dynamicznym i śladem retroaktywnym.
  • ?TPR - polecenie wykonania translacji procedury.
  • ?ODL - polecenie wykonania translacji programu w języku Algol napisanego tylko dużymi literami.
  • ?OML - polecenie wykonania translacji programu dużymi i małymi literami (standard kompilatora).

Jeżeli zlecenie wywołane jest bez parametru drugiego to nastąpi jedynie tzw. test translacji. W tym przypadku nie będzie wyprodukowany kod binarny do zbioru. Zlecenie to można uruchomić bez parametrów. Wtedy translator zgłosi się znakiem "@". Można wtedy używać jego standardowych zleceń.

Proces translacji

Tłumaczenie programu translator wykonuje w sposób natychmiastowy wg. podanych parametrów zlecenia programu OSL. Jeżeli w czasie tłumaczenia translator wykrył błędy, to sygnałem zatrzymania jest komunikat SORRY. W przeciwnym razie sygnał zatrzymania ma postać:

pP rR

na przykład p270 r11192 - gdzie P jest liczbą słów maszynowych przekładu programu, a R jest liczbą komórek roboczych dostępnych dla rezerwacji dynamicznej (np. dla tablic i segmentów programu).

Ogólne uwagi o działaniu translatora

Dla lepszego rozumienia i interpretacji sygnałów drukowanych przez translator ALGOLu-1204M pożyteczna jest pewna ogólna znajomość sposobu pracy tego translatora. Proces tłumaczenia jest wykonywany w dwóch rozłącznych w czasie etapach. Czynności wykonywane w każdym z tych etapów opisujemy krótko poniżej.

ETAP 1.

Translator czyta tekst programu ze zbioru dyskowego i zapamiętuje go w bardzo dogodnej do dalszej analizy i wymagającej bardzo mało pamięci. W czasie czytania translator analizuje strukturę blokową programu oraz opisy nazw i ich obszary działania. Wyrażenia, warunki "dla", warunki "jeśli" rozpoczynające instrukcje i instrukcje podstawowe są w tym czsie tylko przetwarzane i zapamiętywane, bez analizowania ich poprawności gramatycznej. Opisy zmiennych prostych, wykazy parametrów formalnych, zbiory wartościi specyfikacje są analizowane dokładnie, a następnie usuwane z tekstu programu. Etap 1 kończy się praktycznie z chwilą przeczytania zbioru z dysku. W czasie działania etapu 1 są wykrywane niektóre błędy formalne znajdujące się w programie. Etap 2 działa wtedy, gdy w etapie 1 nie wykryto żadnego błędu.

ETAP 2.

W celu sprawdzenia, czy tekst przedstawiony do tłumaczenia jest programem, translator wykonuje pełny rozbiór gramatyczny zapamiętanego tekstu wykorzystując utworzone w etapie 1 informacje o nazwach i ich obszarach działania. Jednocześnie program jest tłumaczony na kod wewnętrzny maszyny, przy czym przekład częściowo optymalizuje się w celu odpowiedniego wykorzystania możliwości maszyny. W czasie działania etapu 2 może ulec zniszczeniu zapis etapu 1 w pamięci maszyny. Dzieje się to jednak tylko w razie istotnej potrzeby, przy tłumaczeniu większych programów.

Po zakończeniu tłumaczenia następuje przejście do stanu STOP. Sygnał zatrzymania zawiera informację o objętości przekładu i zapasie wolnych komórek pamięci. Translator w czsie tłumaczenia programów nie wykorzystuje dysku. Obydwa etapy są organizowane w pamięci maszyny.

Działanie translatora po wykryciu błędu

Wykrycie błędu w tłumaczonym programie powoduje wydrukowanie odpowiedniego sygnału błędu. Jeżeli tłumaczony tekst jest ciągiem symboli podstawowych ALGOLu 1204M i są jeszcze wolne miejsca w pamięci maszyny, to po wykryciu błędu translator kontynuje analizę programu po odpowiednim skorygowaniu informacji o tym programie; jeśli automatyczne skorygowanie tych informacji jest niemożliwe, to translator przechodzi do stanu STOP. Sygnałem zatrzymania jest komunikat SORRY. Przetłumaczenie programu, w którym translator wykrył błąd jest niemożliwe. Otrzymuje się jedynie wykaz wykrytych błędów; na ogół jednak nie są to wszystkie błędy występujące w programie.

Sygnalizacja błędów w czasie tłumaczenia

Każdy sygnał błędu jest drukowany w jednym wierszu i ma następującą postać:

E n <opis błędu>

litera E oznacza, że translator wykrył błąd, a n jest numerem wiersza aktualnie analizowanego przez translator; często n jest także równe numerowi wiersza, w którym wystąpił błąd. Różnica między tymi numerami może być duża, jeżeli błąd polega na jakiejś niezgodności dwóch odległych od siebie części programu. Do tworzenia opisów błędów translator używa symboli czterech rodzajów:

  • Symboli podstawowych ALGOLu, które oznaczają siebie - np. \i\f, \t\h\e\n, \e\l\s\e, \b\e\g\i\n, itd:
  • Krótkich zwrotów lub słów zaczerpniętych z orginalnej terminologi algolowskiej, np. OUT OF SCOPE, UNDECLARED
  • Symboli występujących w tłumaczonym tekście, np. nazw tam użytych
  • Symboli oznaczających elementy składniowe ALGOLu, różne od symboli podstawowych.

Te ostatnie są utworzone z pierwszych liter odpowiednich terminów algolowskich. Na przykład symbol SIMAREX pochodzi od "simple arithmetic expression", FORCL - od "for clause" itd. Znaczenia wszystkich symboli podano w dodatku instrukcji. Wszystkie sygnały błędu translator tworzy wybierając odpowiednie symbole spośród wymienionych wyżej w punktach a-d; powstaje w ten sposób informacja, którą należy traktować zawsze jako komentarz do błędu wykrytego w programie, a nie jako błędny fragment programu. Aby wyjaśnić sposób interpretacji sygnałów błędu rozważmy przykład tekstu algolowskiego zawierającego błędy. Jest to przykład sztuczny, ale dobrze ilustrujący postać sygnalizacji błędu.

Przykład:

  P:\b\e\g\i\n
      \i\n\t\e\g\e\r i,k;
      \a\r\r\a\y x,y[1:k];
      read(k,y);
      \f\o\r i=1 \s\t\e\p 1 \u\n\t\i\l k \d\o
        \b\e\g\i\n
         \i\n\t\e\g\e\r s;
   l:    read(s;
         \i\f s-1=
           \t\h\e\n print s+1)
           \e\l\s\e x[i]:=\i\f i-2*2=i \t\h\e\n i+k
        \e\n\d i;
      \i\f s=7
        \t\h\e\n \g\o \t\o l;
      sort and output(x,y,k);
      \i\f wait(co dalej)=0
        \t\h\e\n \g\o \t\o p
     \e\n\d

W czasie tłumaczenia tego tekstu translator wydrukuje następujące informacje:

E 3 k in bound pair list
E 4 y undeclared
E 5 \f\o\r simarva relop
E 8 proid ( simarva ;
E 10 simarex relop \t\h\e\n
E 10 prints undeclared
E 12 ifcl simarex \e\n\d
E 13 s out of scope
E 14 l out of scope
E 15 sortandoutput undeclared
E 16 codalej undeclared

Przy niewielkiej wprawie i znajomości odpowiedniej terminologii angielskiej przytoczony wykaz można zinterpretować bez żadnych dodatkowych informacji; zawsze jest to możliwe po przejrzeniu skorowidza umieszczonego w dodatku. Spośród jedenastu przytoczonych sygnałów znaczenie siedmiu wynika natychmiast stąd, że:

IN BOUND PAIR LIST oznacza: "w wykazie par granicznych" UNDECLARED oznacza: "nie opisane" OUT OF SCOPE oznacza: "poza obszarem działania"

a symbole występujące pod tymi zwrotami są nazwami występującymi w tekście tłumaczonym przez translator. Pozostałe cztery sygnały są opisami błędów gramatycznych. W skorowidzu znajdziemy następujące wyjaśnienia:

  • SIMARVA simple aritmetic variable - prosta zmienna arytmetyczna
  • RELOP relational operator - operator relacji
  • PROID procedure identifier - nazwa procedury
  • SIMAREX simple arithmetic expresion - proste wyrażenie arytmetyczne
  • IFCL if clause - warunek "jeśli"

Znając sens symboli występujących w sygnale, nietrudno już zinterpretować ten sygnał w całości. Na przykład sygnał:

E 5 \F\O\R SIMARVA RELOP

oznacza, że w czasie analizy wiersza nr 5 translator wykrył w programie obecność ciągu elementów składniowych

\F\O\R <prosta zmienna arytmetyczna> <operator relacji>

który w żadnym poprawnym programie nie może wystąpić. Analogicznie trzeba odczytać pozostałe trzy sygnały błędów gramatycznych. Już z tego niewielkiego przykładu wynikają pewne ogólne wnioski:

Wniosek 1. Sygnały translatora są wynikiem czysto mechanicznej analizy programu. Człowiek analizujący ten sam tekst prawdopodobnie powie, że np. w wierszu 5 brakuje dwukropka, w wierszach 8 i 10 brakuje nawiasów do pary i jeszcze jakiegoś wyrażenia po prawej stronie równości, a w wierszu 16 brakuje nawiasów łańcuchowych.

Wniosek 2. Interpretując sygnały błędów trzeba pamiętać, że wydrukowany przez translator numer wiersza nie zawsze odnosi się do wiersza w którym wystąpił błąd. Na przykład, błąd występujący zapewne w wierszu 9 jest sygnalizowy w czasie analizy wiersza 10. Stanie się zrozumiałe, jeśli przypomnimy sobie, że układ graficzny programu nie ma żadnego wpływu na jego interpretację. W tej sytuacji brak wyrażenia po prawej stronie znaku równości można wykryć dopiero po przejściu do analizy następnego wiersza. Niekiedy sygnał błędu zawiera tylko jeden symbol elementu składniowego. Oznacza to, że wymieniony element jest poprawny po względem semantycznym.

Niekiedy translator zatrzymuje się natychmiast po wykryciu i zasygnalizowaniu jednego błędu. Oznacza to, że analizowany program nie jest ciągiem symboli ALGOLu 1204M albo pamięć operacyjna jest już całkowicie wypełniona informacjami o tłumaczonym programie.

Wykaz błędów

Przekroczenie ograniczeń ilościowych translatora, niektóre błędy semantyczne i niektóre grube błędy gramatyczne w pierwszym etapie tłumaczenia są opisywane przy pomocy krótkich zwrotów zaczerpniętych z terminologii angielskiej. Niżej podajemy wykaz tych zwrotów. Symbol <I> oznacza nazwę, a symbol <S> oznacza nazwę lub symbol podstawowy użyty w programie.

  • DECLIST OVERFLOW - zbyt wiele opisów lub specyfikacji (informacje o opisach zajmują więcej, niż 2048 komórek pamięci).
  • IDLIST OVERFLOW - zbyt wiele różnych nazw (nazwy zajmują więcej, niż 1024 komórek pamięci).
  • <I></nowiki IN BOUND PAIR LIST</tt> - wykaz par granicznych w opisie tablic zawiera lokalną nazwę <nowiki><I></nowiki. * <tt>NUMBER LIST OVERFLOW</tt> - zbyt wiele różnych stałych (więcej, niż 510 różnych stałych całkowitych lub więcej, niż 512 różnych stałych rzeczywistych). * <tt><nowiki><I> OUT OF SCOPE - nazwy <I> opisanej w programie użyto poza jej obszarem działania.
  • <I> := OUT OF PROCEDURE BODY - podstawienie pod nazwę procedury <I> występuje poza treścią tej procedury.
  • <I> REPEATED
    • Nazwa <I> opisana powtórnie na tym samym poziomie;
    • Nazwa <I> powtórzona w wykazie parametrów formalnych;
    • Nazwa <I> powtórzona w zbiorze wartości;
    • Parametr formalny <I> powtórnie specyfikowany;
  • PROCEDURE LEVEL OVERFLOW - stopień procedury większy od 3.
  • SPACE OVERFLOW - brak miejsca w pamięci maszyny.
  • STRING LIST OVERFLOW - zbyt wiele łańcuchów (kolejny czytany łańcuch jest różny od wszystkich dotąd przeczytanych łańcuchów zajmujących łącznie więcej, niż 1024 komórki pamięci).
  • <I> UNDECLARED - użyta nazwa <I> nie jest w programie opisana, ani nie jest nazwą standardową.
  • <S> UNEXPECTED
    • Symbol <S> użyty w niedopuszczalnym kontekście;
    • Nazwa <S> wymieniona w zbiorze wartości lub w zbiorze specyfikacji nie występuje w wykazie parametrów formalnych;
  • Parametr formalny <S> o specyfikacji _\l_\a_\b_\e_\l, _\s_\w_\i_\ t_\c_\h, _\s_\t_\r_\i_\n_\g, _\p_\r_\o_\c_\e_\d_\u_\r_\e, umieszczony w zbiorze wartości.
  • VALIST OVERFLOW - przetłumaczenie programu wymaga wprowadzenia zbyt wielu zmiennych dodatkowych.