Translator języka ALGOL-1204M: Różnice pomiędzy wersjami

Przejdź do nawigacji Przejdź do wyszukiwania
brak opisu edycji
Nie podano opisu zmian
Linia 214: Linia 214:
* Parametr formalny <tt><nowiki><S></nowiki></tt> 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.
* Parametr formalny <tt><nowiki><S></nowiki></tt> 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.
* <tt>VALIST OVERFLOW</tt> - przetłumaczenie programu wymaga wprowadzenia zbyt wielu zmiennych dodatkowych.
* <tt>VALIST OVERFLOW</tt> - przetłumaczenie programu wymaga wprowadzenia zbyt wielu zmiennych dodatkowych.
== Wykaz komunikatów translatora ==
Poniżej zestawiono podstawowe komunikaty translatora XTA4.
* <tt>END</tt> - translacja wykonana do końca.
* <tt>SORRY</tt> - zleconej pracy translator nie może wykonać.
* <tt>SPACE OVERFLOW</tt> - brak miejsca w pamięci.
* <tt>TRANSLATE PROGRAM</tt> - żądanie przetłumaczenia programu.
= Instrukcja eksploatacyjna programów wżutkowych =
== 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).
: <tt>RTA4 [,<TZ BIN>] [,<WO>]...</tt>
gdzie <tt><WO> =</tt>
* ?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: <tt>PROG1</tt>.
\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: <tt>FILE1</tt>.
\p\r\o\c\e\d\u\r\e aaa(...);
.....
.....
\e\n\d;
?
Sposób kompilacji poszczególnych zbiorów:
a). Kompilacja procedury aaa w zbiorze FILE1.
XTA4, FILE1, BBB,?TPR
b). Kompilacja programu w zbiorze PROG1.
XTA4, PROG1, DDD
c). 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>

Menu nawigacyjne