From: MX%"antek@mimuw.edu.pl" 1-MAR-1993 15:38:21.16 To: SALWICKI CC: Subj: Date: Mon, 1 Mar 93 14:59:27 GMT From: antek@mimuw.edu.pl To: salwicki@pauvx1.univ-pau.fr \1cw \U1STANDARD \U2POLISH \U3ITALIC \U4BOLD \U"ORATOR \U(PLORATOR \+ \+ \ \ \ \ \ \- \+ \+ \^\ \ \ \ \ \ \ \ \ \ \ \"PRZENASZALNY RUNNING SYSTEM NOWEGO LOGLANU\ \ \ \ \ \ \ \ \ \ \^ \- \+ \+ \^\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ NAPISANY W J\(E\"ZYKU C\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \^ \- \+ \- \+ \, \- \+ \+ \- \+ \- \+ \^\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \1Antoni Kreczmar\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \^ \- \+ \ \ \- \+ \- \+ \- \+ 1. Wst\2e\1p \- \+ \- \+ Poni\2x\1szy kr\2o\1tki opis Running Systemu dla \ nowego \ Loglanu \ opiera \- \+ si\2e \ \1w \ du\2x\1ym \ stopniu \ na \ poprzednich \ dokumentacjach. \ \ Przede \- \+ wszystkim na opisie Running \ Systemu \ Loglanu-82 \ oraz \ na \ dw\2o\1ch \- \+ pracach opublikowanych, \ tj. \ G.Cioni, \ "Programmed \ deallocation \- \+ without \ dangling \ reference" \ IPL \ 18(1984) \ pp.179-187, \ \ oraz \- \+ M.Krause, \ A.Kreczmar, \ H.Langmaack, \ A.Salwicki, \ M.Warpechowski \- \+ "Algebraic approach to ...." w Lecture Notes in Computer \ Science \- \+ Springer 208, pp.134-156. W pierwszej z tych prac \ opisano \ system \- \+ adresowania \ po\2s\1redniego \ dla \ Loglanu, \ \ a \ \ w \ \ drugiej \ \ dosy\2c \- \+ \1skomplikowane \ algorytmy \ poprawiania \ \ tablicy \ \ Display \ \ oraz \- \+ adresowania nielokalnego dla j\2e\1zyk\2o\1w z metodami dziedziczenia \ na \- \+ r\2ox\1nych poziomach. Bez znajomo\2s\1ci \ tych \ dw\2o\1ch \ prac \ zrozumienie \- \+ poni\2x\1szego kr\2o\1tkiego raportu jest niezwykle trudne. Radzimy \ wi\2e\1c \- \+ przed przyst\2a\1pienie do czytania niniejszego tekstu zapozna\2c \ \1si\2e \- \+ \1z tymi dwiema pracami, \ jak \ r\2o\1wnie\2x \ \1z \ dokumentacj\2a \ \1w \ dw\2o\1ch \- \+ poprzednich jej postaciach (dla Loglanu-82 w \ pe\2l\1ni \ uruchominego \- \+ i dla Loglanu-84 w pr\2o\1bnej wersji loglanowej). \, \- \+ \, \- \+ Nowy RS system dla nowego Loglanu \ zosta\2l \ \1napisany \ najpierw \ w \- \+ Loglanie-82, \ a \ nast\2e\1pnie \ w \ j\2e\1zyku \ C. \ Wyb\2o\1r \ j\2e\1zyka \ C \ by\2l \- \+ \1nieprzypadkowy. Ot\2ox \1w j\2e\1zyku tym mo\2x\1na wyrazi\2c \ \1wiele \ w\2l\1asno\2s\1ci \- \+ niskopoziomowych, a posiada \ on \ tak\2x\1e \ wszystkie \ zalety \ j\2e\1zyka \- \+ wysokopoziomowego. Przet\2l\1umaczenie wersji loglanowej na j\2e\1zyk C \- \+ nie \ przedstawia\2l\1o \ wi\2e\1kszych \ trudno\2s\1ci, \ umo\2x\1liwi\2l\1o \ natomiast \- \+ stworzenie bardzo efektywnego systemu \2l\1atwego do przenoszenia. \, \-\/ \+ RS system napisany \ w \ C \ daje \ mo\2x\1liwo\2sc \ \1wykonywania \ programu \- \+ loglanowego przet\2l\1umaczonego na j\2e\1zyk C. Taki \ spos\2o\1b \ realizacji \- \+ Loglanu \ wydaje \ mi \ si\2e \ \1najprostszy. \ Napisanie \ kompilatora \ z \- \+ Loglanu na C jest \ znacznie \ \2l\1atwiejsze \ ni\2x \ \1napisanie \ pe\2l\1nego \- \+ kompilatora \ na \ docelow\2a \ \1maszyn\2e\1. \ Problem \ przenoszenia \ jest \- \+ rozwi\2a\1zany w spos\2o\1b natychmiastowy. Ponadto kompilator taki mo\2x\1e \- \+ korzysta\2c \1z bogactwa konstrukcji j\2e\1zyka C. Nie b\2e\1dzie problemu ze \- \+ sta\2l\1ymi, \ \ instrukcjami \ \ \ steruj\2a\1cymi \ \ \ w \ \ \ obr\2e\1bie \ \ \ modu\2l\1u, \- \+ wej\2s\1ciem-wyj\2s\1ciem, \2l\1a\2n\1cuchami itp. \ Niezwykle \ upro\2s\1ci \ si\2e \ \1sam \- \+ proces translacji. Wyra\2x\1enia mog\2a \1pozosta\2c \1w prawie niezmienionej \- \+ postaci - jedynie dost\2e\1p do zmiennych loglanowych b\2e\1dzie wymaga\2l \- \+ \1wywo\2l\1ywania specjalnych makro - ale proces \2l\1adowania \ rejestr\2o\1w, \- \+ optymalizacji lokalnej itd. przerzucony zostanie na system \ C. \- \+ A \ przecie\2x \ \1jest \ to \ system \ niezwykle \ \ efektywny. \ \ Wi\2e\1kszo\2sc \- \+ \1kompilator\2o\1w C daje kod \ dobrze \ zoptymalizowany. \ W \ ten \ prosty \- \+ spos\2o\1b mo\2x\1emy wykorzysta\2c \1si\2le \1tego j\2e\1zyka \ zostawiaj\2a\1c \ troski \- \+ techniczne \ \ \ (rejestry, \ \ \ arytmetyka \ \ \ maszyny, \ \ \ \ etykiety, \- \+ optymalizacja) systemowi C. \, \- \+ \, \- \+ Opisany poni\2x\1ej system sk\2l\1ada si\2e \1z dwu \ plik\2o\1w \ : \ Rs.c \ oraz \- \+ Rsdata.h. Plik Rsdata.h jest \ tzw. \ plikiem \ nag\2lo\1wkowym \ (header \- \+ file). W nim wyra\2x\1ono wszystkie wsp\2o\1lne struktury \ danych \ oraz \- \+ podstawowe zmienne. Na pliku Rs.c znajduje \ si\2e \ \1natomiast \ pe\2l\1na \- \+ biblioteka \ \ Running \ \ Systemu. \ \ Tekst \ \ programu \ \ \ loglanowego \- \+ przet\2l\1umaczony na C musi w\2la\1cza\2c \1za pomoc\2a \1instrukcji \ include \- \+ plik Rsdata.h. W taki sam spos\2o\1b w\2la\1czany \ jest \ ten \ plik \ przez \- \+ Rs.c. \, \- \+ \, \- \+ \+ Edmonton, Maj 1988 \- \+ \+ Warszawa, Sierpie\2n \11988\, \- \+ \, \- \+ \, \- \+ \, \- \+ 2. Opis struktur danych na pliku Rsdata.h \- \+ \- \+ Na pliku \ tym \ znajduj\2a \ \1si\2e \ \1deklaracje \ struktury \ prototyp\2o\1w \ i \- \+ offset\2o\1w. Zajmiemy \ si\2e \ \1najpierw \ struktur\2a \ \ \1prototypu. \ \ Ma \ \ on \- \+ nast\2e\1puj\2a\1c\2a \1posta\2c\1: \, \- \+ \, \- \+ \4struct \3Prototype \- \+ \1{ \- \+ \ \4int \3kind\1; \- \+ \ \4int \3num\1; \- \+ \ \4int \3lspan\1, \3rspan\1; \- \+ \ \4int \3references\1; \- \+ \ \4int \3decl\1, \3level\1; \- \+ \ \4int \3lastwill\1; \- \+ \ \4int \3permadd\1; \- \+ \ \4int \3Sloffset\1, \3Dloffset\1; \- \+ \ \4int \3Statoffset\1, \3Lscoffset\1; \- \+ \ \4int \3handlist\1; \- \+ \ \4int \3pref\1, \3pslength\1; \- \+ }; \- \+ \- \+ Atrybut \3kind \1definiuje rodzaj \ prototypu. \ Mamy \ nast\2e\1puj\2a\1ce \ ich \- \+ rodzaje: CLASS, SUBROUTINE, PROCESS, COROUTINE, HANDLER, \ RECORD, \- \+ PRIMITARRAY, REFARRAY, SUBARRAY, STRUCTARRAY, POINTARRAY. \ Pi\2ec \- \+ \1pierwszych nie wymaga wyja\2s\1nie\2n\1. RECORD jest klas\2a \1bez kodu i bez \- \+ innych modu\2lo\1w zadeklarowanych \ wewn\2a\1trz. \ Ten \ rodzaj \ prototypu \- \+ istnia\2l \1ju\2x \1w poprzedniej wersji Running Systemu. Ostanich pi\2ec \- \+ \1rodzaj\2o\1w dotyczy tablic. PRIMITARRAY jest tablic\2a \ \1o \ elementach \- \+ typu pierwotnego, \ REFARRAY \ jest \ tablic\2a \ \1typu \ referencyjnego, \- \+ SUBARRAY jest tablic\2a\1, kt\2o\1rej elementami s\2a \1domkni\2e\1cia \ procedur, \- \+ STRUCTARRAY jest tablic\2a \1o elementach typu z\2l\1o\2x\1onego \ i \ wreszcie \- \+ POINTARRAY \ jest \ tablic\2a \ \1typu \ \ referencyjnego, \ \ jednak\2x\1e \ \ o \- \+ elementach daj\2a\1cych adresy po\2s\1rednie bez licznik\2o\1w. \ Taki \ typ \- \+ dodatkowy wprowadzili\2s\1my w nowej wersji \ RS \ w \ celu \ osi\2a\1gni\2e\1cia \- \+ wi\2e\1kszej efektywno\2s\1ci kodu. Zamiast \ pe\2l\1nego \ adresu \ wirtualnego \- \+ [adres po\2s\1redni, licznik] niekt\2o\1re referencje s\2a \ \1postaci \ [adres \- \+ po\2s\1redni]. \ Nie \ daj\2a \ \1one \ oczywi\2s\1cie \ gwarancji \ \ poprawno\2s\1ci \- \+ adresowania \ (mo\2x\1e \ wyst\2a\1pi\2c \ \1tzw. \ nieokre\2s\1lona \ \ referencja), \-\/ \+ nimniej, \ je\2s\1li \ u\2x\1ytkownik \ jest \ pewny \ \ poprawno\2s\1ci \ \ swoich \- \+ adresowa\2n\1, mo\2x\1e cz\2esc \1lub \ wszystkie \ referencje \ zaznaczy\2c \ \1jako \- \+ proste. Poniewa\2x \1typy \ tablicowe \ s\2a \ \1rozr\2ox\1niane \ przez \ atrybut \- \+ \3kind, \1w\2s\1r\2o\1d rodzaj\2o\1w typ\2o\1w pojawi\2l \1si\2e \1tak\2x\1e typ POINTERARRAY. \, \- \+ \, \- \+ Drugim atrybutem prototypu jest \3num\1. Wskazuje on \ pozycj\2e \ \1danego \- \+ prototypu w tablicy PROT [] definiuj\2a\1cej wszystkie prototypy. \, \- \+ \- \+ Atrybuty \3lspan \1i \3rspan \1definiuj\2a \ \1rozmiar \ obiektu \ danego \ typu. \- \+ Wszystkie obiekty alokowane \ s\2a \ \1w \ tablicy \ M[ \ ]. \ Maj\2a\1c \ adres \- \+ obiektu \3am \1na lewo mamy rozmiar \ \3lspan\1, \ na \ prawo \ \3rspan\1, \ czyli \- \+ obiekt \ zajmuje \ elementy \ tablicy \ M[\3am-lspan\1..\3am\1+\3rspan\1]. \ Adres \- \+ prototypu usytuowany jest zawsze w s\2l\1owie M[\3am\1], tzn. maj\2a\1c adres \- \+ obiektu na zmiennej \3am\1, w\2l\1a\2s\1nie M[\3am\1] = \ \3num \ \1, \ gdzie \ \3num \ \1jest \- \+ adresem prototypu tego \ obiektu \ w \ tablicy \ PROT. \ Tablice \ maj\2a \- \+ \1rozmiar definiowany dynamicznie. W s\2l\1owie \ M[\3am\1] \ jest \ zapisany \- \+ stosowny \ numer \ prototypu, \ natomiast \ \ dwa \ \ kolejne \ \ s\2l\1owa \- \+ definiuj\2a \1doln\2a \ \1i \ g\2o\1rn\2a \ \1granice \ wska\2z\1nika. \ Rozmiar \ elementu \- \+ tablicy w przypadku PRIMITARRAY podawany jest za pomoc\2a \ \1atrybutu \- \+ \3lspan\1. \, \- \+ \- \+ Pozosta\2l\1e atrybuty nie s\2a \1konieczne w przypadku tablic. \- \+ \- \+ Atrubut \3references \1definiuje struktur\2e \1referencji prototypu. \ Jest \- \+ to po prostu indeks w tablicy OFF[], kt\2o\1ra \ definiuje \ wszystkie \- \+ rodzaje struktur referencji (patrz definicja OFF poni\2x\1ej). \, \- \+ \, \- \+ Atrybuty \3decl \1i \ \3level \ \1odnosz\2a \ \1si\2e \ \1do \ struktury \ zagnie\2x\1d\2x\1e\2n \- \+ \1programu. Mianowicie \3decl \1jest indeksem w PROT \ ojca \ statycznego \- \+ danego modu\2l\1u, natomiast \3level \1jest g\2le\1boko\2s\1ci\2a \1zagnie\2x\1d\2x\1enia. \, \- \+ \- \+ Atrybut \3lastwill \1okre\2s\1la miejsce w module, od kt\2o\1rego rozpoczynaj\2a \- \+ \1si\2e \1instrukcje lastwill. \ W \ jaki \ spos\2o\1b \ modeluje \ si\2e \ \1kontrol\2e \- \+ \1sterowania podamy w punktach 4 i 10. \, \- \+ \, \- \+ Nast\2e\1pny atrybut \3permadd \1jest wsp\2o\1lnym adresem dla \ permutacji \ i \- \+ inwersji permutacji numer\2o\1w displaya. Mianowicie plik \ loglanowy \- \+ definiuje dwie tablice \3perm\1[] i \3perminv\1[], kt\2o\1re \ musz\2a \ \1zawiera\2c \- \+ \1te permutacji. \ Przyk\2l\1adowo, \ dla \ \3perm\1[] \ = \ {0,1,2,0,2,1} \ oraz \-\/ \+ \3perminv\1[] = {0,1,2,0,2,1}, indeks \3permadd\1=0 dla warto\2s\1ci \ \3level\1=2 \- \+ okre\2s\1la permutacj\2e \1{0,1,2} \ (i \ te \ sam\2a \ \1odwrotn\2a\1), \ natomiast \- \+ \3permadd\1=2 dla \3level \1te\2x \1r\2o\1wnym 2 daje perm={0,2,1} \ (i \ podobnie \- \+ te sam\2a \1odwrotn\2a\1}. \, \- \+ \, \- \+ Cztery \ kolejne \ atrybuty \ \ (\3Sloffset\1, \ \ \3Dloffset\1, \ \ \3Statoffset\1, \- \+ \3Lscoffset\1) definiuj\2a \1adresy wzgl\2e\1dne (offsety) czterech zmiennych \- \+ systemowych Sl, Dl, Statsl i Lsc. Ka\2x\1dy \ modu\2l \ \1posiadaj\2a\1cy \ kod \- \+ musi \ mie\2c \ \1okre\2s\1lon\2a \ \1pozycj\2e \ \1Sl \ ojca, \ Dl \ \ ojca, \ \ lokalnego \- \+ sterowania Lsc i licznika Sl syn\2o\1w (Statsl). \ O \ tych \ zmiennych \- \+ systemowych b\2e\1dziemy m\2o\1wi\2c \1za chwil\2e\1. Tutaj natomiast \ chcieli\2s\1my \- \+ zwr\2o\1ci\2c \1uwag\2e \1na to, \2x\1e w poprzedniej \ wersji \ RS \ offsety \ tych \- \+ zmiennych by\2l\1y podawane w prototypie (ich pozycja \ by\2l\1a \ ustalona \- \+ na ko\2n\1cu obiektu). Wprowadzenie offset\2o\1w zmiennych systemowych do \- \+ prototyp\2o\1w skomplikuje kompilacj\2e\1, ale przyspieszy i ujednorodni \- \+ RS. Dost\2e\1p do tych zmiennych \ b\2e\1dzie \ bowiem \ taki \ sam \ jak \ do \- \+ innych \ zmiennych \ wprowadzonych \ przez \ \ u\2x\1ytkownika \ \ czy \ \ te\2x \- \+ \1kompilator. \, \- \+ \- \+ Atrybut \3handlist \1definiuje list\2e \1handler\2o\1w zadeklarowanych w danym \- \+ module. Jest to indeks w \ tablicy \ HL[], \ gdzie \ zdefiniowane \ s\2a \- \+ \1wszystkie takie listy. \ Tablica \ HL \ jest \ typu \ Hlstelem \ postaci \- \+ nast\2e\1puj\2a\1cej: \, \- \+ \- \+ \4struct \3Hlstelem \- \+ \1{ \- \+ \ \4int \3hand\1; \- \+ \ \4int \3signlist\1; \- \+ \ \4int \3next\1; \- \+ }; \- \+ \- \+ \- \+ Atrybut \3hand \1jest indeksem w tablicy \ PROT \ w\2l\1a\2s\1ciwego \ handlera. \- \+ Natomiast atrybut \3signlist \ \1jest \ indeksem \ w \ tablicy \ SL[] \ typu \- \+ \3Sgelem\1, \ gdzie \ okre\2s\1lone \ s\2a \ \1numery \ sygna\2lo\1w \ zwi\2a\1zane \ z \ \ tym \- \+ handlerem. Typ \3Sgelem \1ma posta\2c \1nast\2e\1puj\2a\1c\2a\1: \, \- \+ \, \- \+ \4struct \3Sgelem \- \+ \1{ \- \+ \ \4int \3signalnum\1; \- \+ \ \4int \3next \- \+ \1}; \- \+ \- \+ \- \+ W ka\2x\1dym elemencie tablicy \ SL[] \ mamy \ numer \ sygna\2l\1u \ \3signalnum\1, \- \+ kt\2o\1ry jest warto\2s\1ci\2a \1absolutn\2a \1budowan\2a \1przez kompilator. \ Atrybut \- \+ \3next \1pokazuje na kolejny element takiej \ listy \ w \ SL[]. \ Podobnie \- \+ zreszt\2a \1atrybut \3next \1w HL[] wskazuje na nast\2e\1pny handler \ zwi\2a\1zany \- \+ z danym modu\2l\1em. Koniec ka\2x\1dej takiej listy \ (w \ obu \ przypadkach) \- \+ okre\2s\1la warto\2sc \3next\1=-1 (tak wybrano z uwagi na \ adresowanie \ w \ C \- \+ tablic od 0). \, \- \+ \- \+ Atrybut \3handlist \1wyst\2e\1puje tak\2x\1e w prototypie handlera. \ Okre\2s\1la \- \+ on jedynie, \ czy \ handler \ ten \ odpowiada \ na \ wszystkie \ sygna\2l\1y \- \+ (others), \ czy \ \ te\2x \ \ \1jest \ \ deklarowany \ \ jako \ \ handler \ \ dla \- \+ wyspecyfikowanych \ numer\2o\1w \ sygna\2lo\1w. \ W \ \ pierwszym \ \ przypadku \- \+ warto\2sc \ \1tego \ atrybutu \ jest \ 1 \ (hanlder \ dla \ \ others), \ \ w \- \+ pozosta\2l\1ych przypadkach warto\2sc \1tego atrybutu jest 0. \, \- \+ \- \+ \- \+ Dwa ostatnie atrybuty w prototypie ( \ \3pref\1, \ \3pslength\1) \ okre\2s\1laj\2a \- \+ \1struktur\2e \1prefiksowania. Nie musz\2a \1one \ wyst\2e\1powa\2c \ \1w \ przypadku \- \+ prototyp\2o\1w dla handler\2o\1w, gdy\2x \1handler nie mo\2x\1e by\2c \1prefiksowany. \- \+ Atrybut \3pref \1jest indeksem w tablicy PROT modu\2l\1u \ prefiksuj\2a\1cego \- \+ (-1 gdy nie istnieje), \ atrybut \ \3pslength \ \1jest \ d\2l\1ugo\2s\1ci\2a \ \1ci\2a\1gu \- \+ prefiksuj\2a\1cego. \, \- \+ \- \+ Pozosta\2l\1a do \ om\2o\1wienia \ struktura \ referencji. \ Ot\2ox \ \1z \ powodu \- \+ wprowadzenia bogactwa typ\2o\1w z\2l\1o\2x\1onych w nowym Loglanie, struktura \- \+ referencji \ w \ obiektach \ jest \ stosunkowo \ skomplikowana. \ Takie \- \+ struktury opisuje tablica OFF[] typu \3Offsets\1. \, \- \+ \- \+ \4struct \3Offsets \- \+ \1{ \- \+ \ \4int \3kind\1; \- \+ \ \4int \3size\1, \3num\1; \- \+ \ \4int \3length\1, \3finish\1; \- \+ \ \4int \3head\1; \- \+ \ \4int \3references\1; \- \+ }; \- \+ \, \- \+ \- \+ Atrybut \3kind \1jest nast\2e\1puj\2a\1cych \ rodzaj\2o\1w: \ SIMPLELIST, \ SEGMENT, \- \+ REPEATED \ oraz \ COMBINEDLIST. \ SIMPLELIST \ jest \ list\2a \ \ \1zwyk\2l\1ych \- \+ offset\2o\1w \ zmiennych \ referencyjnych \ w \ obiekcie. \ SEGMENT \ jest \- \+ szczeg\2o\1ln\2a \1postaci\2a \ \1takiej \ listy, \ gdy \ te \ offsety \ zajmuj\2a \- \+ \1kolejne miejsca w pami\2e\1ci (ten typ wprowadzili\2s\1my \ ze \ wzgl\2e\1du \- \+ na tablice referencyjne, jakkolwiek jest \ on \ sprowadzalny \ do \- \+ przypadku poprzedniego). REPEATED jest \ n-krotn\2a \ \1iteracj\2a \ \1danej \- \+ struktury referencyjnej. COMBINEDLIST jest list\2a \1by\2c \1mo\2x\1e r\2ox\1nych \- \+ struktur referencji. \, \- \+ \, \- \+ Atrybut \3size \1okre\2s\1la ca\2l\1kowit\2a \1d\2l\1ugo\2sc \1opisywanej \ struktury \ Dla \- \+ SIMPLELIST musi to \ by\2c \ \1d\2l\1ugo\2sc \ \1ca\2l\1ego \ obiektu, \ dla \ SEGMENT \- \+ r\2o\1wnie\2x \1d\2l\1ugo\2sc \1ca\2l\1ego obiektu, dla REPEATED musi to by\2c \ \1d\2l\1ugo\2sc \- \+ \1powtarzanej struktury, i ostatecznie dla COMBINEDLIST ma to \ by\2c \- \+ \1d\2l\1ugo\2sc \ \1struktury \ wewn\2a\1trz \ kt\2o\1rej \ podawane \ s\2a \ \1wska\2z\1niki \ \ do \- \+ podstruktur. \, \- \+ \, \- \+ Kolejny \ atrybut \ \3num \ \1definiuje \ indeks \ w \ tablicy \ \ OFF \ \ danej \- \+ struktury.\, \- \+ \, \- \+ Znaczenie atrybutu \3length \1jest \ wieloznaczne. \ Dla \ SIMPLELIST \- \+ \3length \1jest d\2l\1ugo\2s\1ci\2a \1listy offset\2o\1w. Dla SEGMENT \ \3length \ \1jest \- \+ pozycj\2a \1pierwszego,a \3finish \1ostatniego elementu \ segmentu. \ Dla \- \+ REPEATED \3length \1jest \ krotno\2s\1ci\2a \ \1powt\2o\1rzenia \ podstruktury. \ Dla \- \+ COMBINEDLIST \3length \1jest d\2l\1ugo\2s\1ci\2a \1listy. \, \- \+ \, \- \+ Atrybut \3head \1jest indeksem w tablicy EL[], gdzie \ zakodowane \ s\2a \- \+ \1listy struktur referencji. Typem tej tablicy jest \3Elem\1: \, \- \+ \, \-\/ \+ \4struct \3Elem \- \+ \1{ \- \+ \ \4int \3offset\1; \- \+ \ \4int \3next\1; \- \+ \ \4int \3references\1; \- \+ }; \- \+ \- \+ W tablicy tej atrybut \3offset \1definiuje odpowiedni offset a \ \3next \- \+ \1jest jak zwykle wska\2z\1nikiem do \ nast\2e\1pnego \ elementu \ listy. \ Dla \- \+ typu SIMPLELIST ka\2x\1dy taki \ offset \ mo\2x\1e \ by\2c \ \1offsetem \ zmiennej \- \+ referencyjnej pe\2l\1nej lub tylko adresem po\2s\1rednim, ale tak\2x\1e \ mo\2x\1e \- \+ by\2c \1offsetem domkni\2e\1cia procedury (czyli pary ). \- \+ Gdy atrybut \3references \1jest 0, mamy referencje pe\2l\1n\2a\1, gdy jest \ 1 \- \+ jest to adres po\2s\1redni, wreszcie gdy jest 2 \ jest \ to \ domkni\2e\1cie \- \+ procedury. \, \- \+ \, \- \+ Dla typu COMBINEDLIST atrybut \3references \1okre\2s\1la indeks w tablicy \- \+ OFF wskazywanej podstruktury referencji. \, \- \+ \, \- \+ \, \- \+ W przypadku typu SEGMENT atrybut \ \3head \ \1mo\2x\1e \ jeszcze \ okre\2s\1la\2c \- \+ \1rodzaj referencji. Gdy \3head \1= 0, mamy segment pe\2l\1nych referencji, \- \+ gdy jest 1 jest to segment adres\2o\1w po\2s\1rednich, gdy jest 2 jest to \- \+ segment domkni\2ec \1procedur.\, \- \+ \, \- \+ \, \- \+ Dla ostatniego atrybutu \3references \1w \ typie \ \3Offsets \ \1mamy \ jedno \- \+ zadanie. Powinien on okre\2s\1la\2c \1dla typu REPEATED indeks w \ tablicy \- \+ OFF powtarzanej struktury. \, \- \+ \- \+ Powy\2x\1szy system wprowadzania \ struktury \ prototyp\2o\1w \ jest \ dosy\2c \- \+ \1niezr\2e\1czny, je\2s\1li musi by\2c \1wykonany r\2e\1cznie. Troch\2e \1w \ tym \ wina \- \+ j\2e\1zyka C. Mo\2x\1na by\2l\1o \ wprowadzi\2c \ \1typ \ union, \ kt\2o\1ry \ przypomina \- \+ rekordy z \ wariantami, \ ale \ w\2o\1wczas \ nie \ mo\2x\1naby \ podawa\2c \ \1tych \- \+ struktur przez definicje w deklaracji (odp. DATA \ w \ Fortranie). \- \+ Zatem przyj\2al\1em \ takie \ rozwi\2a\1zanie \ przez \ zwyk\2la \ \1struktur\2e\1. \ Z \- \+ drugiej strony translator z Loglanu na C mo\2x\1e bez k\2l\1opotu budowa\2c \- \+ \1tak\2a \1struktur\2e\1. \, \- \+ \, \- \+ \, \- \+ 3. Struktury Dl i Sl \- \+ \- \+ Struktura Dl zachowana jest taka \ jak \ w \ Simuli \ i \ Loglanie-82. \- \+ Aktywny wsp\2ol\1program jest \2l\1a\2n\1cuchem Dl, zawieszony jest \ cyklem \- \+ Dl. \ Nowy \ Loglan \ usun\2al \ \ \1Detach, \ \ gdy\2x \ \ \1wprowadzi\2l \ \ \1zmienn\2a \- \+ \1LAST_ATTACH - \ wskazuj\2a\1c\2a \ \1na \ ostatni \ wsp\2ol\1program \ wykonuj\2a\1cy \- \+ Attach(X). Zako\2n\1czenie wsp\2ol\1programu \ jest \ sygnalizowane \ b\2le\1dem \- \+ (propozycja \ \ \ \ Marka \ \ \ \ Warpechowskiego). \ \ \ \ Wykonuje \ \ \ \ \ si\2e \- \+ \1Attach(LAST_ATTACH) with Cor_Term (coroutine terminated), \ o \ ile \- \+ LAST_ATTACH \ =/= \ \4none\1, \ w \ \ przeciwnym \ \ razie \ \ wykonuje \ \ si\2e \- \+ \1Attach(My_Process) \ \ with \ \ Cor_Term. \ \ To \ \ \ rozwi\2a\1zanie \ \ \ jest \- \+ metodologicznie uzasadnione i najprostsze. \, \- \+ \, \- \+ Dla \ wsp\2ol\1programu \ aktywnego \ warto\2sc \ \1Dl \ jest \ \ \4none\1. \ \ Pr\2o\1ba \- \+ reaktywacji wsp\2ol\1programu aktywnego \ powoduje \ wys\2l\1anie \ sygna\2l\1u \- \+ alarmowego. \ Wsp\2ol\1program \ \ zako\2n\1czony \ \ ma \ \ ustawion\2a \ \ \1warto\2sc \- \+ \1lokalnego sterowania Lsc na 0. \ Pr\2o\1ba \ reaktywacji \ zako\2n\1czonego \- \+ wsp\2ol\1programu powoduje wys\2l\1anie sygna\2l\1u. Zauwa\2x\1my na \ zako\2n\1czenie \- \+ omawiania struktury Dl, \ \2x\1e \ Dl-link \ mo\2x\1e \ by\2c \ \1w \ tym \ systemie \- \+ referencj\2a \1niepe\2l\1n\2a \1(tzn. tylko adresem po\2s\1rednim). \ Zyskujemy \- \+ w ten spos\2o\1b na pami\2e\1ci i na czasie wykonania programu. \, \- \+ \, \- \+ Struktura Sl link\2o\1w \ tworzy \ drzewo. Problemem s\2a \ \1tylko \ usuwane \- \+ obiekty procedur, \ funkcji \ i \ blok\2o\1w, \ po \ ich \ terminacji. \ W \- \+ poprzedniej \ wersji \ przyj\2e\1li\2s\1my \ \ strategi\2e \ \ \1usuwania \ \ takich \- \+ obiekt\2o\1w bez wzgl\2e\1du na konsekwencje. Mog\2l\1o si\2e \ \1zdarzy\2c\1, \ \2x\1e \ po \- \+ pewnym \ czasie \ wznawiany \ dobrze \ \ okre\2s\1lony \ \ obiekt \ \ nie \ \ ma \- \+ okre\2s\1lonego otoczenia statycznego (Sl link przeci\2e\1ty). \ Umieli\2s\1my \- \+ wykry\2c \1takie przypadki, ale nie by\2l\1o to \ rozwi\2a\1zanie \ eleganckie. \- \+ Marek Lao \ zauwa\2x\1y\2l\1, \ \2x\1e \ lepiej \ by\2l\1oby \ u\2x\1y\2c \ \1zwyk\2l\1ej \ techniki \- \+ licznik\2o\1w referencji tylko \ dla \ tego \ przypadku. \ Mamy \ przecie\2x \- \+ \1licznik Statsl (poprzednio inaczej okre\2s\1lony), nale\2x\1y zastosowa\2c \- \+ \1go w spos\2o\1b nast\2e\1puj\2a\1cy. \, \- \+ \, \- \+ Ka\2x\1de otwarcie nowego obiektu zwi\2e\1ksza o 1 \ licznik \ Statsl \ jego \- \+ statycznego ojca. Ka\2x\1de zako\2n\1czenie obiektu \ procedury \ (funkcji, \- \+ bloku) sprawdza, czy jego Statsl jest 0. Je\2s\1li tak, obiekt \ mo\2x\1na \- \+ usun\2ac\1, zmniejszy\2c \1Statsl o \ 1 \ dla \ jego \ ojca \ i \ powt\2o\1rzy\2c \ \1te \-\/ \+ operacje dla takiego \ ojca \ (o \ ile \ jest \ to \ obiekt \ procedury, \- \+ funkcji lub bloku). Dla usuwanego za pomoc\2a \1kill \ obiektu \ klasy, \- \+ sprawdzamy \ najpierw \ jego \ Statsl, \ \ i \ \ post\2e\1pujemy \ \ podobnie. \- \+ Pozostaje rozwi\2a\1za\2c \1poprawnie problem usuwania wsp\2ol\1program\2o\1w. \, \- \+ \, \- \+ Zabicie zawieszonego wsp\2ol\1programu polega na \ zabiciu \ stosownego \- \+ cyklu Dl. Najpierw przegl\2a\1damy taki cykl i sprawdzamy, \ czy \ jego \- \+ wszystkie obiekty maj\2a \1Statsl \ r\2o\1wny \ 0. \ Je\2s\1li \ nie, \ wywo\2l\1ujemy \- \+ sygna\2l \1alarmowy. Je\2s\1li natomiast wszystkie \ s\2a \ \1usuwalne, \ mo\2x\1emy \- \+ przyst\2a\1pi\2c \1do kolejnego ich usuwania. Aby \ to \ zrobi\2c \ \1poprawnie, \- \+ nale\2x\1a\2l\1oby stosowa\2c \1operacj\2e \1przej\2s\1cia po Sl-\2l\1a\2n\1cuchu dla ka\2x\1dego \- \+ obiektu usuni\2e\1tego (tak jak \ dla \ obiektu \ klasy). \ Ale \ przecie\2x \- \+ \1mogliby\2s\1my usun\2ac \1jaki\2s \1obiekt jeszcze \ nieusuni\2e\1ty \ z \ usuwanego \- \+ w\2l\1a\2s\1nie cyklu wsp\2ol\1programu. Aby unikn\2ac \1tej sytuacji, \ odwracamy \- \+ najpierw \ cykl \ wsp\2ol\1programu. \ Zabijaj\2a\1c \ obiekty \ w \ kolejno\2s\1ci \- \+ odwrotnej (od g\2l\1owy wsp\2ol\1programu, nast\2e\1pnie syn dynamiczny itd), \- \+ mamy pewno\2sc\1, \ \2x\1e \ nie \ usuniemy \ przy \ czyszczeniu \ kolejnych \- \+ \2l\1a\2n\1cuch\2o\1w Sl \2x\1adnego pozosta\2l\1ego elementu \ cyklu. \ Wynika \ to \ z \- \+ w\2l\1asno\2s\1ci Sl \ i \ Dl \ \2l\1a\2n\1cuch\2o\1w \ - \ nie \ mog\2a \ \1i\2sc \ \1w \ przeciwnych \- \+ kierunkach, tzn. je\2s\1li jest Dl droga od A do B to nie ma Sl drogi \- \+ od B do A. \ W \ drugiej \ fazie \ usuwania \ wsp\2ol\1programu \ zmieniamy \- \+ orientacj\2e \1cyklu. resach \ odpowiednio \ (2,3) \ i \ (1,4),