Translator języka ALGOL-1204M
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, translator 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> IN BOUND PAIR LIST - wykaz par granicznych w opisie tablic zawiera lokalną nazwę <I>.
- NUMBER LIST OVERFLOW - 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).
- <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.
Wykaz komunikatów translatora
Poniżej zestawiono podstawowe komunikaty translatora XTA4.
- END - translacja wykonana do końca.
- SORRY - zleconej pracy translator nie może wykonać.
- SPACE OVERFLOW - brak miejsca w pamięci.
- TRANSLATE PROGRAM - żądanie przetłumaczenia programu.
Instrukcja eksploatacyjna programów użytkowych
Uruchamianie programów binarnych
Programy binarne, które powstały w wyniku translacji zleceniem XTA4 są ładowane do pamięci operacyjnej i jednocześnie uruchamiane specjanym loader'em. Dla uruchomienia tego loader'a służy zlecenie języka operatora RTA4 (Run program Translator Algol 1204).
- RTA4 [,<TZ BIN>] [,<WO>]...
gdzie <WO> = ?TRA, ?DIT, ?ODL, ?OML, ?W, ?W0, ?W1
Pierwszy parametr zlecenia określa tytuł zbioru binarnego a pozostałe parametry oznaczają opcje uruchomienia programu. Jeżeli podany tytuł zbioru binarnego nie będzie zbiorem binarnym algolowskim (utworzonym zleceniem XTA4) i nie będzie posiadał typu BAL (Binary ALgol program) to sygnalizowany będzie komunikat LOAD ERROR. Programu takiego nie można załadować do pamięci.
- ?TRA - polecenie uruchomienie programu ze śladem.
- ?DIT - polecenie drukowania na monitorze 10 ostatnich wierszy śladu dynamicznego. ślad będzie drukowany jeęli wystąpił błąd w programie.
- ?ODL - polecenie wykonania wydruków przez programy wynikowe dużymi literami.
- ?OML - polecenie wykonywania wydruków przez programy wynikowe dużymi i małymi literami.
- ?W - polecenie wykonania instrukcji algolowskich: setinput(1); setoutput(2); i uruchomienie programu od początku.
- ?W0 - polecenie wykonania instrukcji algolowskich setinput(0); setoutput(0); i uruchomienie programu od początku.
- ?W1 - polecenie wykonania instrukcji algolowskich setinput(1); setoutput(0); i uruchomienie programu od początku.
Standardowo użyta jest opcja ?W0. (tzn. czytanie i pisanie z/na monitor).
Uwaga: Instrukcje setinput(); i setoutput(); mogą mieć argumenty w przedziale 0 - 99. Nie należy używać tego samego strumienia dla instrukcji wejścia i wyjścia. W przypadku ustawienia stumienia instrukcją setoutput(1) przyjmuje się jako wyjściowy strumień 2 tzn. że instrukcje setoutput(1) i setoutput(2) są takie same. Każde użycie instrukcji setinput musi być przy uruchomieniu programu ( RTA4 ) poprzedzine przywiązaniem strumienia instrukcją OSL'a ASS do odpowiedniego zbioru danych, wyników lub urządzenia. Tak przyjęta struktura instrukcji setinput i setoutput umożliwia współpracę programu z kilkoma zbiorami danych i wyników.
Przykład:
Użycie instrukcji: setinput(1); setoutput(2); obliguje użytkownika do wcześniejszego przywiązania strumieni odpowiednio zleceniami programu OSL:
ASS 1 <TZ> ASS 2 <TZ>
i uruchomienie loader'a w sposób następujący:
RTA4,<TZ BIN> [,<WO>]
Wykonanie zlecenia RALG bez parametrów spowoduje załadowanie symulatora maszyny ODRA-1204 i uruchomienie go. Program zgłosi się znakiem "@" i przejdzie na nasłuch zleceń symulatora. Użytkownik ma wtedy możliwość pracy tak samo jak na ODRZE. Bezparametrowa postać zlecenia RALG umożliwia uruchomienie istniejących już programów binarnych pracujących poprzednio na maszynie Odra1204 a do żródeł tych programów już nie ma dostępu. Sposób uruchomienia takich programów jest takie samo jak na maszynie Odra. (szczegółowy opis zawiera druga część instrukcji).
Wielkości obszaru roboczego dla bębna:
- Dla XTA4: komórka o adresie 074630.
- Dla RTA4: komórka o adresie 075130.
Sygnalizacja błędów w czsie działania programu
Niektóre błędy w programie, na przykład:
- niezgodność wykazu parametrów aktualnych z odpowiednim wykazem parametrów formalnych,
- niewłaściwa liczba wskaźników w zmiennej,
- niedopuszczalna wartość parametru aktualnego funkcji standardowej,
są wykrywane i sygnalizowane dopiero w czasie działania fragmentu programu zawierającego taki błąd. Sygnał błędu, drukowany zawsze na monitorze, jest symbolem lub zwrotem, który łatwo kojarzy się z rodzajem wykrytego błędu. Na przykład próba obliczenia sqrt(-2) spowoduje wydrukowanie sygnału SQRT, a pierwszy z trzech błędów wymienionych na początku tego punktu spowoduje wydrukowanie sygnału PARAMETER LIST. Po wydrukowaniu sygnału błędu program zatrzymuje się. Dlatego sygnały takie nazywamy sygnałami zatrzymania. Niektóre błędy można próbować pominąć, przy czym skutki pominięcia są w pełni określone.
Błędy nie wykrywane
Niektóre błędy formalne znajduję się w programie nie są wykrywane ani w czasie tłumaczenia, ani w czasie wykonywania programu, więc oczywiście nie są sygnalizowane. Niżej podajemy pełny opis takich błędów i ich skutków.
- Jeżeli w czasie wykonania działania na liczbach całkowitych przekroczono przedział liczb całkowitych, albo wykonano dzielenie całkowite przez zero, to wynik działania nie jest określony.
- Jeżeli w treści funkcji F nie wykonano podstawienia pod nazwę F, to wartość F nie jest określona.
- Jeżeli PA jest parametrem aktualnym odpowiadającym parametrowi formalnemu PF i są spełnione następujące warunki:
- PF ma jedną ze specyfikacji \r\e\a\l, \i\n\t\e\g\e\r lub \b\o\o\l\e\a\n,
- PF nie jest umieszczony w zbiorze wartości,
- treść procedury zawiera podstawienie pod PF,
- PA nie jest zmienną,
- to wykonanie podstawienia pod PF nie ma żadnych skutków, w szczególności nie powoduje nadania wartości żadnej zmiennej.
Ślad dynamiczny i ślad retroaktywny programu
śladem programu nazywamy wykaz nazw procedur niestandardowych lub etykiet napotkanych w czasie pracy programu. Wykaz wydrukowany w czasie pracy programu nazywamy śladem dynamicznym, a wykaz drukowany na specjalne żądanie po zatrzymaniu pracy programu nazywamy śladem retroaktywnym. ślad może być pomocą np. przy szukaniu błędów sygnalizowanych w czasie działania programu. Aby skorzystać z możliwości drukowania śladu, należy uruchomić translator z opcją ?TRA. Wtedy do programu zostanie dołączony rozkaz warunkowego drukowania etykiety przed instrukcją. Jeżeli w czasie wykonywania programu jest włączona opcja ?TRA, to przed każdym wykonaniem instrukcji z odpowiednią etykietą na aktualnym wyjściu będzie wydrukowana nazwa tej etykiety, każdorazowo w nowym wierszu, poprzedzona gwiazdką. Jeżeli wystąpią procedury i funkcje to rozkaz warunkowego drukowania nazwy jest dołączony do opisu procedury lub funkcji w momencie czytania pary symboli:
\p\r\o\c\e\d\u\r\e <nazwa>
na początku opisu procedury lub funkcji. Jeżeli w czasie działania programu jest zapalona opcja ?TRA, to nazwa procedury jest drukowana po sprawdzeniu zgodności wykazu parametrów formalnych z wykazem parametrów aktualnych wywołania tej procedury. Jeżeli program zawiera możliwość drukowania śladu, to po zatrzymaniu tego programu - na przykład wskutek wykrycia błędu - można wydrukować na monitorze 10 ostatnich wierszy śladu dynamicznego. Służy do tego opcja "?DIT". Po wykonaniu tej opcji maszyna drukuje komunikat END. Sygnał zatrzymania SORRY oznacza, że w programie nie ma możliwości drukowania śladu. Typowy sposób korzystania ze śladu retroaktywnego polega na tłumaczeniu programu z opcją ?TRA i wykonaniu programu z tą opcją. ślad jest wówczas uwzględniony, ale nie drukowany. Po wykryciu błędu (jeżeli wystąpiła opcja ?DIT przy uruchomieniu programu) otrzymujemy lokalizację błędu z dokładnością zależną od liczby i położenia etykiet i odwołań do procedur i funkcji niestandardowych. Pisząc długie programy warto użyć pewnej liczby etykiet niepotrzebnych z punktu widzenia organizacji programu, ale użytecznych przy liczeniu wierszy i w razie drukowania śladu. Program przetłumaczony z uwzględnieniem śladu zajmuje zawsze więcej pamięci i działa wolniej niż po przetłumaczeniu bez uwzględnienia śladu.
Numerowanie wierszy i punkty orientacyjne
Ponumerowanie wierszy - wszystkich lub tylko niektórych – jest potrzebne do interpretacji wykazu błędów wykrytych w czasie tłumaczenia, a także do przygotowania wykazu poprawek. Numeracja wierszy zaczyna się od jedynki ; liczy się tylko wiersze zawierające co najmniej jeden znak widoczny na monitorze. Czynność numerowania wierszy długiego programu można znacznie uprościć drukując w czasie tłumaczenia wykaz tzw. punktów orientacyjnych. Jeżeli program jest translowany z opcją ?LIS, to translator drukuje na monitorze wykaz tych fragmentów programu, które mają jedną z trzech postaci:
<numer lini> <etykieta> : <numer lini> \p\r\o\c\e\d\u\r\e <nazwa> <numer lni> \f\o\r <nazwa>
i nie wchodzą w skład łańcucha, komentarza, ani zbioru specyfikacji; są to zatem instrukcje z etykietą, początki opisów procedur i początki instrukcji "dla", czyli miejsca, które łatwo odnależć nawet w długim programie. Fragment jednej z trzech wymienionych postaci nazywamy punktem orientacyjnym. Przed każdym punktem orientacyjnym translator drukuje numer tego wiersza tłumaczonego programu lub procedury, w którym występuje pierwszy znak następujący po tym punkcie orientacyjnym. W praktyce będzie to najczęściej po prostu numer wiersza, w którym znajduje się punkt orientacyjny, w wyjątkiem będzie etykieta umieszczona w oddzielnym wierszu. Jeżeli w czasie drukowania wykazu punktów orientacyjnych translator sygnalizuje błędy, to otrzymujemy wiersze wykazu błędów pomieszane z wierszami wykazu punktów orientacyjnych; łatwo można odróżnić te dwa rodzaje wierszy, ponieważ sygnały błędów zaczynają się od litery E, a punkty orientacyjne - od odstępu.
Sygnały i komunikaty programów użytkowych
Podczas pracy programów użytkowych mogą zajść nieprzewidziane okoliczności (np. obliczanie pierwiastka z liczby ujemnej, brak pamięci itp.). Jeżeli wystąpi błąd w pracy programu i ten błąd zostanie wykryty przez program, wówczas na monitorze drukowany jest komunikat o tym błędzie. Po wykryciu błędu program zatrzymuje się i czeka na interwencję operatora. Istnieją możliwości wznowienia pracy programu przy pomocy zleceń "GO" oraz "SKIP". W powyższym wykazie drukowanych komunikatów jest podana przyczyna błędu oraz sposób postępowania operatora.
- END - program wykonano do końca.
- ARC - błąd przy obliczeniu wartości funkcji arc sin lub arc cos. Zlecenie "SKIP" powoduje nadanie funkcji wartości 0.0 i kontynuowanie obliczeń.
- EXP - parametr aktualny funkcji exp ma wartość zbyt dużą. Zlecenie "SKIP" powoduje nadanie funkcji wartości 0.0 i kontynuowanie obliczeń.
- EXPONENTATION - wynik potęgowania nie jest określony.
- LN - parametr aktualny funkcji nie jest dodatni. Zlecenie "SKIP" powoduje nadanie funkcji wartości0 i kontynuowanie obliczeń.
- SQRT - parametr aktualny funkcji sqrt jest ujemny. Zlecenie "SKIP" powoduje nadanie funkcji wartości 0.0 i kontynuowanie obliczeń.
- TRIG - błąd przy obliczaniu wartości funkcji sin, cos lub tan. Zlecenie "SKIP " powoduje nadanie funkcji wartości 0.0 i kontynuowanie obliczeń.
- BOUND PAIR
- w wykazie par granicznych granica dolna jest większa od granicy górnej
- w opisie tablic z mianem OWN wykaz par granicznych zawiera więcej niż 10 par granicznych.
- FORMAT - błędne S w wykonywanej instrukcji format(s). zlecenie "GO" powoduje wykonanie na monitorze print(s) i ponowne zatrzymanie, a zlecenie "SKIP" powoduje wykonanie instrukcji format i kontynuację obliczeń.
- IO PARAETER - błędna wartość parametru aktualnego procedury wejścia lub wyjścia np. setinput(-1) lub outchar(120).
- RI CONVERSION - niewykonalna zmiana z typu {r{e{a{l na typ {i{n{t{e{g{e{r.
- SPACE OVERFLOW - brak miejsca w pamięci (zbyt duża tablica albo zbyt wiele jednocześnie czynnych procedur).
- SUBSCRIPT - liczba wskaźników przy zmiennej nie jest równa.
- NUMBER - błąd w czytanej liczbie. Zlecenie "SKIP" powoduje rozpoczęcie procesu czytania liczby od początku.
- PARAMETER LIST
- lista parametrów aktualnych nie jest równa liczbie parametrów formalnych;
- typ lub rodzaj parametru aktualnego nie jest zgodny ze specyfikacją odpowiedniego paraetru formalnego.
- STRING - czytany łańcuch nie mieści się w tablicy.
- TRANSLATE PROGRAM - żądanie przetłumaczenia programu.
- SUBSCRIPT
- lista wskaźników przy zmiennej nie jest równa liczbie par granicznych w opisie odpowiedniej tablicy;
- wartość wskaźnika nie należy do przedziału określonego odpowiednią parą graniczną;
- skok przy nie określonym przełączeniu.
Segmentacja programów w ALGOLu
W Algolu-1204 segmentacji programu nie wykonuje się zbyt często, ponieważ wielkość pamięci operacyjnej maszyny jest wystarczająca dla zapamiętania przekładu typowych programów obliczeniowych. Jeżeli przekład programu nie mieści się w pamięci maszyny, tzn. w czasie tłumaczenia tego programu translator sygnalizuje SPACE OVERFLOW, to - pomijając przypadek stosowania wersji A translatora lub nieoptymalnego programowania - mamy do czynienia z programem dość złożonym. W programie tego rodzaju można prawie zawsze wyodrębnić pewną liczbę procesów obliczeniowych rozłącznych w tym sensie, że po zakończeniu każdego z nich instrukcje realizujące ten proces przez dłuższy czas nie będą wykonywane. Programy tego rodzaju dobrze nadają się do segmentacji. Aby wykonać segmentowanie programu, należy wyodrębnić procesy obliczeniowe opisać w postaci procedur do niezależnego tłumaczenia z parametrami oznaczjącymi dane i wyniki tego procesu. Procedury te należy przetłumaczyć i wyprodukować kod binarny do określonego zbioru dyskowego. Z informacji podanych podanych wcześniej wynika, że samo przygotowanie jakiegoś segmentu programu nie przesądza jeszcze o tym, w jakim programie segment ten będzie użyty. Tak więc raz wykonany komplet segmentów może być używany w wielu różnych programach.
Przykład programu segmentowanego:
Program główny w zbiorze: PROG1.
\b\e\g\i\n ..... \d\r\u\m \p\r\o\c\e\d\u\r\e aaa(...); ..... Setinput(51); aaa(...); setinput( powrót do starego wejścia> ) ..... \e\n\d; ?
Procedura w zbiorze: FILE1.
\p\r\o\c\e\d\u\r\e aaa(...); ..... ..... \e\n\d; ?
Sposób kompilacji poszczególnych zbiorów:
- Kompilacja procedury aaa w zbiorze FILE1.
XTA4, FILE1, BBB,?TPR
- Kompilacja programu w zbiorze PROG1.
XTA4, PROG1, DDD
- Uruchomienie programu.
ASS, ...... ASS, 51, BBB RTA4, DDD
Alfabet języka ALGOL-1204M
Każdy tekst algolowski zapisany jest przy użyciu ściśle określonych symboli, zwanych symbolami podstawowymi. Zbiór symboli podstawowych języka wzorcowego jest stosunkowo bogaty - składa się z małych i dużych liter alfabetu angielskiego, cyfr, oraz innych znaków kodu ISO-7. Składa się on również z ponad 30 każdą literą w wyrazie (\b\e\g\i\n, \e\n\d itd.). Są to tzw. słowa kluczowe języka. Przedstawiony niżej alfabet języka ALGOL-1204M jest zapisany w metajęzyku i znacznie się różni od języka wzorcowego ALGOL 60 [8] i języka ALGOL-1204 dla maszyny Odra-1204. W szczególności zmianą uległy operatory arytmetyczne, relacji i logiczne.
Opis w metajęzyku.
- <symbol podstawowy> ::= <litera> | <cyfra> | <warość logiczna> | <ogranicznik>
- <litera> ::= a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z|A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z
- <cyfra> ::= 0|1|2|3|4|5|6|7|8|9
- <wartość logiczna> ::= \t\r\u\e | \f\a\l\s\e
- <ogranicznik> ::= <operator>|<przerywnik>|<nawias>|<miano>|<specyfikator>
- <operator> ::= <operator arytmetyczny>|<operator relacji>|<operator logiczny>|<operator następstwa>
- <operator arytmetyczny> ::= + | - | * | / | \d\i\v | **
- <operator relacji> ::= \l\t | \l\e | = | \n\e | \g\e | \g\t
- <operator logiczny> ::= \e\q\v | \i\m\p | \o\r | \a\n\d | \n\o\t
- <operator następstwa> ::= \g\o \t\o | \i\f | \t\h\e\n | \e\l\s\e | \f\o\r | \d\o
- <przerywnik> ::= ,|.|~|:|;|:=| | \s\t\e\p | \u\n\t\i\l | \w\h\i\l\e | \c\o\m\m\e\n\t
- <nawias> ::= (|)|[|]|'|"| \b\e\g\i\n | \e\n\d
- <miano> ::= \o\w\n | \b\o\o\l\e\a\n | \i\n\t\e\g\e\r | \r\e\a\l | \a\r\r\a\y | \s\w\i\t\c\h | \p\r\o\c\e\d\u\r\e
- <specyfikator> ::= \s\t\r\i\n\g | \l\a\b\e\l | \v\e\l\u\e
Przykłady programowania w ALGOLu-1204M
Ponieważ ograniczenia Algolu-1204M nie są zbyt krępujące, więc znane z podręczników Algol-60 przykłady programowania są ważne w ALGOLu-1204M. Istnieją jednak pewne różnice wynikające z maszyny i systemu operacyjnego (wspomniane wcześniej). W tej części instrukcji chcemy użytkownikowi przedstawić sposób pzygotowywania programów w języku Algol-1204M. Programy w tym języku przygotowuje się w podobny sposób jak dowolny tekst, tzn. można je wpisywać do zbioru dyskowego, listować poprawiać dostępnymi zleceniami programu OSL. Każdy tekst w języku ALGOL musi być zakończony znakiem "?" podanym za ostatniią instrukcją programu od nowej linii. Za znakiem "?" należy podać jeszcze 10 spacji. Cały alfabet języka składa się z dużych liter. Natomiast słowa kluczowe nie są podkreślane lecz użyty jest do tego znak "\" np. \b\e\g\i\n, \r\e\a\l itd. Istnieje możliwość przygotowania takiej wersji translatora, który kompiluje programy zbudowane z dużych i małych liter alfabetu.
Istnieją programy żródłowe napisane w ALGOLu-1204 w kodzie OPTIMA. Można wczytać takie programy (taśmy żródłowe) używając do tego programu OPTISO. Program ten dokona konwersji z kodu maszyny do pisania OPTIMA na kod ISO-7. Wczytany program nadaje się do natychmiastowej translacji (bez dodatkowych zmian) przez translator XALG.
Sposób uruchomienia programu:
- OPTISO,<TZ WY> [,WO ]
gdzie WO = ?OML, ?ODL
Opcja ?OML - zapalona określa małe i duże litery, natomiast zapalona opcja ?ODL - oznacza konwersję tylko na duże litery. Standardowo wejście jest określone jako czytnik taśmy papierowej i nazwa tego urządzenia brzmi TR2. Urządzenie te musi być utworzone procedurą instalującą kompilator Algolu lub posiadać parametry PA1 i PA 2 odpowiednie.
Źródło: Translator języka ALGOL-1204M dla minikomputera MERA-400 w systemie operacyjnym CROOK-4 (wersja-6/A) - Translator-TA4, Janusz Gocałek, Jacek Klauziński, Ryszard Zenker, Poznań 1986