PROGRAMIRANJE Z MOOULO - 2 1.del INFORMATICA 2/87 UDK 681.3.06:519.682 MODULO-2 A. Brodnik, M. Špegel, T. Lasbaher institut »Jožef Štefan«, Ljubljana v eianku opisujemo programski Jezik modula-2. Opis je razdeljen na dva dala. V prvem obravnavamo osnovne podatkovna, ukazna (stavki) In programska (moduli, podprogrami) struktura. Tako Je podrobno opisan pojem mudula in z njim povezanega modularnega programiranja. Poleg tega opisujemo tudi osnovna na&ela sistemskega oziroma nizkonivojskega programiranja v moduli-2. Nadaljevanje filanka je namenjeno primerjavi nodule-2 s tremi drugimi sodobnimi Jeziki, in sicer s pascalon, ado in z Jezikom o. Prograaslng Uith Hodula-2 In this paper is a desoription of the Hodula-2 prograaming language. The desoription is dividad into tuoparts. In the (irst part, MS disouss the essential data, control, and progranmlng struotures of the language which separate nodula-2 from other modern languages, concluding ofise the notation of a modula and modular prograaming, and some prinoiplas of tysten or low-lavel programmlng. In the second part of this contribution, nodula-2 is compared to other three modern progranmlng languagesi Pasoal, Ada and C. V eianku Selimo v dveh dolih predstaviti nov, moderen programski Jezik. 2a celovit opis jezika pa je okvir tega eianka in njegovega nadaljevanja preozek, poleg tega pa je bralcu na voljo vrsta dobrih knjig C3, 7, 8, lA, 183. Pa& pa je namen nafiega prispevka z opisom bistvenih novosti In programlrnih možnosti vzpodbuditi bralca k poglobljenemu spoznavanju tega nedvomno zelo sposobnega in morda enega temeljnih Jezikov naslednjih let II2D. Programski jezik modula-2 je neposredni nasle­ dnik module-1, oba pa Izvirata iz pascala. Osnovnim pravilom so bili dodani predvsem neka­ teri elementi paralelnega pascala ("Concurrent Pasoal")C53 ter možnost modularnega programira­ nja. Zato osnovo jezika tvorijo že dobro poznani stavki iz pascala tb, 93, ki pa so v moduli-2 te bolj poenostavljeni. S tem je jezik postal preglednejši, programi pa bistveno bolj zgoseeni. nodula-2 ni boljša od pascala samo v pogledu strukturlranosti, ampak omogo&a z dolofieniml ukaznimi strukturami tudi zelo u&inkovito programiranje na sistemskem nivoju. Izkuieni programerji, ki sicer uporabljajo ka­ tero od bolj izpopolnjenih razlifiic pascala C15, 163, bodo dejali, da vse to, kar sicer prinata modula-2, eni lahko že precej Časa uporabljajo. To je res, vendar se moramo hkrati zavedati, da so to le dialekti pascala, medtem ko so vel deli jezika, ki Jih bomo tu opisali, že v osnovni delinicijl module-2. Opis Jezika Je osnovna tema drugega poglavja. V tretjem poglavju, bomo prikazali nekatera naCela modularnega programiranja, Četrto po­ glavje pa je namenjeno prikazu zmožnosti modu­ le-2 za sistemsko alt nizkonivojsko programira­ nje. V drugem delu tega članka bomo primerjali Jezik s pascalom, ado In jezikom c. Pri tem se bomo seznanili z nekaterimi prav zanimivimi spozna­ nji. Videli 'bomo na primer, da ima modula-2 pravzaprav skoraj vse bistvene prednosti, ki jih programerji sicer pripisujejo adi in o-ju. V drugam poglavju nadaljevanja so zbrani Se primeri nekaterih prevajalnikov za razll&ne operacijske sisteme in zanimiv primer povezave madule-2 s prologom. V dodatku sta priložena kratka primera, ki naj predofiita možnosti modularnega in sistemskega programiranja v moduli-2. 2J Opt« Jailk« •odula-2 Pri razmišljanju o uporabi kakSnega programske­ ga Jezika, moramo vzeti v pretres predvsem tri gradnike) podatkovne strukture, ukazne struktu­ re (stavke) in programske strukture. Opis jezika smo zato razdelili nekako na tri dale. Zaradi smotrne zgradbe Jezika so programi napi­ sani v modull-2 C1B3 zelo pregledni. Jezik dobro podpira strukturiranje programov, in si­ cer tako v pogledu podatkovnih kot ukaznih struktur. Razen tega modula-2 lo£i med veliki­ mi in malimi firkami v imenih spremenljivk. Preglednost programov poveSuje le zahteva, da so vse rezervirane besede napisane z velikimi erkami. Pri opisu Jezika predpostavljamo dolofeno sto­ pnjo znanja katerega od algolskih jezikov, a najbolje Je poznavanje pascala. 2.1 Podatkovna struktura Vsak programski Jezik pozna nekaj osnovnih tipov. Najbolj obiSajnl osnovni tipi so int«- gar (cela Števila), raal (realna Števila) in boolaan (loglCne spremenljivke) in Jih najdemo v veČini Jezikov od fortrana C123 pa do ade C13, 173. V veeini jezikov algolskega tipa, kamor sodi tudi modula-2, poznamo te tipe ohar (firkovna spremenljivka), sat (množica) in poin- tar (kazalec). V aadulo-2 so vgrajeni vsi zgoraj navedeni tipi, poleg njih pa pozna jezik Se nekaj tipov, ki BO uporabni predvsem pri programiranju na 79 nitjan nivoju. To ao tipi CARDINAL (nanagattv- na Stavila), WORD (baaada), AODRKSt (naalov), BITBET (anolica bitov) in PROČ (podprograa). Vlogo tah tipov ai boao ogladali v Catrtan poglavju taga prispavka, Žilil SiiiHi«Yli,1flnt tJBt Podobno kot pascal poina tudi nadula-2 laita- vljan« podatkovna tipa. To ao zapiai (RECORD), zapiai I railieioaml, polja CARRAV), nattavalni tipi in dalni tipi. Oglajaa ai oblika dafini- oij za omanjana podatkovne tipe na naalednjea primarui TYPE zapis lapial polja naataj • RECORD partl, partZt CARDINAL END« • RECORD ČASE sslakti BOOLEAN OF TRUEl oh I CHAR I FALSEi oat CARDINAL END END) " ARRAV C1..103, C1..103 OF INTE6ER1 •ogooa) I (da, na, dalni > CO..9]| 2.1.2 Pratvarlanla »ad tloi V iiioduli-2 je obravnavanje spremenljivk moAno vezano na njihov tip. Na' noramo na primer, sattavatl celega in realnega itavila kot v pascalu. Prepovedana ja celo settevanje oelega in nenagatlvnega Itevlla. Za prenostltev teh problemov obstaja cela vrsta funkcij, ki samo na 'logiCnem nivoju pretvorijo tip spremenljiv­ ke, na velikost izhodne kode pa nimajo vpliva. Imana tah funkcij so enaka Inanom tipov. Tako lahko naredimo naslednjo pretvorboi MODULE Primeril VAR C) CARDINALi It INTE6ER1 BEGIN 1 :• INTE6ER (c)( o END Primeri. I- CARDINAL (i) Seveda je pretvarjanje omejeno le med tipi z enako dolZino, Kot primer pravilne pretvorbe, si oglejmo naslednji podprogrami PROCEDURE Prepisi (izi IzTlp) VAR VI vTip) VAR preplsanoi BOOLEAN)| BE61N prepisano 1- TSIZEdzTip) - TSIZE(vTip)| IF prepisano THEN v 1- vTlp (iz) END ENO Prapislj, Klicani podprogram TSIZE je eden redkih, ki so definirani v sistemu module-2 in izraOuna veli­ kost tipa, ki je parameter podprograma, v besedah. 2.2 Ukaina atruktura Modula-2 pozna naslednje stavkei - prirejanje - klic podprograma - vrnitev iz podprograma (RETURN) - pogojni stavek (IF, ELSlF, EL8E) - izbiralni stavek (CA5E) - Izhodni stavek (EXIT) - strukturni izbirni stavek (HITH) - zanke - nedoloSna (LOOP) - pogoj na zafietku (UHILE) - pogoj na koncu (REPEAT) - nattevalna zanka (FOR) Modula-2 torej na uvaja nobenih bistveno novih stavkov, pafi pa je le njihova oblika lepla zapisana. Na primer, modula-2 ne pozna sesta­ vljenega stavka (BEGIN ... END), ampak se vsi njeni stavki razan prirejanja, vrnltvenega In izhodnega konflajo z rezervirano besedo END. V primerjavi s pasoalom lahko opazimo odve&nost besedice bagln na naslednjem prlaarui MODULE Primeri BEGIN IF pogoj THEN stavekl| Stavek2 ENO END Primer. program Primeri bagln If pogoj than bagln stavekl1 stavke2 and and> Novo je tudi loSevanje posameznih mo2nosti v izbiralnam stavku. Ta ima sedaj obllkoi CA8E izraz OF možnosti 1 Stavkil I. moznost2 1 Stavki2 ELSE Stavkl3 END) 2.3 Hodull In podprograal Osnovna programska enota v jeziku ni vefi pod­ program, tamvaO modul. Ta lahko združuje veS podprogramov in modulov. Modul in podprogram se razlikujeta tudi v svoji zasnovi, saj Je modul le logifina, programska enota, ki obstaja takorekofi samo na nivoju izvorne kode in ja njegova vloga samo povečanje preglednosti pro­ grama. Po drugI strani pa podprogram predsta­ vlja osnovno Izvajalno enoto in obstaja' tako na nivoju Izvorne kot tudi izvajane koda. Modula-2 poznam tri tipe modulcvi - programski modul - definicijski modul (DEFINITION) - delovni modul (IMPLEMENTATION) Prvi sluli kot osnovni uporabnikov program ali kot ga poznamo v pascalu program. Druga dva tipa modulov sta dodana predvsem zaradi zaokro­ žitve sistema jezika, s filmer se odpravijo različne uporabnilke knjilnlce. Madula-2 ne pozna vefi zunanjih podprogramov (axtarnal) ali vstavljanja celih kosov programa (inoluda), ampak samo navedemo modul, iz katerega telimo uporabiti dolofieno spremenljivko (ta Je lahko poljubnega tipa, tudi PROČ!). Uporabno najbolj pri kat programi filtev ne primeru opisane sklh mod podprogr meniJlvk lotijo Izdela s kako se st de ofiltn rih ranjc kater razve z de ullh ami d e In vsak voj d bodo finloljsklh a pri snova vedno sode zahteva ra Ih skupnih ja z modu finlcljskim torej snova elall, kak« podobno. svojega de elovnl modu izvajali in n ju luje zdel tofik I0-2 1 mo Ici ne b Na 1*. 1, delo veli vefi itev - s so duU opl odo to kar kat vnih med kih pro ljudi dela In premeni J spreme V def O THEN el •• skladCn^i ni~n-l END END Vzeni; PROCEDURE Prazen <)• BOOLEAN) BEGIN RETURN n - O END Prazen) PROCEDURE Poln Oi BOOLEAN | BEGIN RETURN n • ValikostSklada END Poln) BEGIN (« inloializaoija modula •> n I" O END NadzornlkSklada. Za primer, kaj bi povezovalo nek modul z zunanjostjo, si oglejmo modul, ki hrani podat­ kovno strukturo sklada. Smiselno Je oddati la podprograma Vstavivin Vzemi tar funkoijl Prazen in Poln. To v maduli-2 definirano na naslednji naCini DEFINITION nODULE NadzornlkSklada! EKPORT Vstavi, Vzemi, Prazen, Poln) PROCEDURE Vstavi (cll CARDINAL)) PROCEDURE Vzemi | a* !• KKHi (* NaNaslovulO •) ENO Priaar2. Sioar pa lahko dafinlraiao tudi oalotan, raoimo 16-biten poanilnlk kot polja na na«ladnji na- Cini CONST naxNaslov - l77777Bl VAR Poanilnik COBli ARRAY CO..naxNaslov3 OF UORDi 4.2 Prooaai in praklnltvani podprograai Za laija raiunavanja nofnoati pisanja prakini- tvanih podprograaov v aodull-Z «i najpraj o- glajao, kako Jazlk uporablja prooasa. Praoa« Ja daflntran kot osnovna livajalna ano- ta, ki ta izvaja zaporadno (sakvanCno). Savada lahko nak procai proii in uatvarja druga prooa­ sa, V iiioduli-2 Ja procas posaban tip, ki ga oddaja aodul SVSTEM. V dodatku k dafinioijan Jezika C1S3 Je ta tip sioar opulfian, vendar ga boao v nalih priaarlh zaradi preglednosti ia uporabljali. Naaosto tipa PROCESB se sedaj uporablja enostaven tip A0DRES8. Proces se izvaja zaporadno in neprekinjeno, dokler ne potene nekega drugega prooesa. To izvede s podprogranoa PROCEDURE TRANSFER (VAR od, koaui PROCESS)| ki ga oddaja zopet aodul SVSTEH. oddaja podprogran Ta aodul tudi PROCEDURE NEMPR0CES8 (pi PROC{ «1 ADORESSi ni CARDINAL) ni unnuinnuf VAR pri PROCESS)| kjer Je p podprograa, ki se bo izvajal kot samostojen prooes. Svoje spreaenlJivke (sklad) bo lael v prostoru, ki se priOne na neatu « in Je velik n besed. Vse potrebne podatke o novem prooasu shrani podprograa v paraaater pr. Naslednji korak Je povsea razualjiv in sicer definiraao podprograa, ki posluluje neko preki­ nitev kot nov prooes. Problea Ja le . PROCEDURE Skelet) 6E6IN InicializaoiJa) LOOP lOTRANSFER (program, posluzi, veotor)) Posluži Prek in itev EN D ENO Skelat) Prlaar taktnega podprograaa boao navedli v naiih priaarih, ki bodo navedeni v drugea delu eianka. PROGRAMIRAN JE Z MODULO - 2 II INFORMATICA 4/87 UDK 681.3.06 MODULA - 2 Andrej Brodnik, Marjan Spegel, Tadej Lasbaher Institut »Jozef Stefan«, Ljubljana Ta prispevek obsega primerjavo module-2 s programskimi jeziki pascal, ada in c, sploSen opis prevajalnika za roodulo-2 in opis najbolj vidnih prevajalnikav za razli6ne operacijske sisteme. Sklepni del prispevka je namenjen kratkemu opisu zanimive zdruJitve zmoinosti 1unkcionalnega in proceduralnega jezika (module-2 in prolaga). V dodatku navajamo dva prinera programav v maduli-2, ki naj bi predstavila tako osnovna nacela sistemskega programiranja, kot postopek modularnega programiranja. Ta prispevek je nadaljevanje prej objavljenega clanka in zaokrozuje kratko predstavitev jezika modula-2. Programming With Modula-2 In this paper the comparisson of Modula-2 with Pascal, Ada and C is given. Further, the general overview of compiler is presented with some specific examples for several operating systems. Finally, the very smart connection of functional and procedural language (Prolog and Modula-2) is given. The appendices contain two examples of programmes which should give a flavour of modular and system programming in Modula-2. This paper with preveously published one closes the sketching of Modula-2 programming language. 1. UVOP Ce je bil prv.i del prispevka namenjen jeziku samemu, poten poskuSamo v tern delu jezik postaviti nekam v okolje. Tako navajamo nekatere podatke, ki bodo pomagale oceniti razmerje module-2 do drugih progratnskih jezikov. Temu so namenjena prva tri poglavja. V nadaljevanju opisujemo sag princip prevajanja programov napisanih v moduli-2 in nivojski ustroj splosnega prevajalnika. V zakljucnih dveh poglavjih pa poskuSamo prikazati nekaj zelo zanimivih primerov uporabe jezika na dokaj razlicnih primerih zunaj in pri nas. V posebnem dodatku van predstavljamo dve lupini programov, ki sta napisana v maduli-2 in sicer razporejevalnik procesorskega casa in program za pogovor med dvema terminaloma. 2. PASCAL IN MODULA-2 2e v prejsnjem sestavku o moduli-2 smo opozorili na to, da je modula-2 kakovostna nadgraditev pascala. Po njem je podedovala predvseni blocno zgradbo in vse osnovne tipe stavkov, od njega pa se bistveno razlikuje predvsem v naslednjih pagledih LSI: a) gradnik "modul" omogoca - loceno prevajanje programskih in padpro- gramskih modulov - enostavnb gradnjo modulov s programskimi oradji - knjiinice, ki so podprte s sistemom jezika b) nizkonivojsko ali sistemsko programiranje - dostop do poljubnega stalnega mesta v pomnilniku - dostop do posameznih procesorskih regi- strov - pisanje prekinitvenih podprogramoy - pisanje sploSnih sorutin c) podprogram je definiran kot poseben tip d) sintakticne razlike Razlike pod tockami a, b i c so bistvene in so semantifine narave, medtem ko so razlike pod tacko d predvsem ablikovne aziroma sintakticne narave. Ker pascal ne pozna pojma modula in ker ne amagoca sistemskega programiranja, ga na teh dveh podrocjih tudi ne moremo primerjati z modul0-2. 2.1 PodprograB kot tip Podprogram kot tip je v zelo amejenem smislu sicer poznal ze pascal in sicer kot parameter podprograma Zb, Ibl, ki je moral biti brez parametrov. V moduli-2 je povsem pravilna definicija naslednjega tipai TYPE ProcType PROCEDURE (Typel, Type2>: Type3j Parametri podprogramov so prav tako lahko kakrSnegakoli tipa. 2.2 8int*ktifln« razlik* Modula-2 je podobna pascalu tudi po zunanjem videzu. Vendar vseeno abstajajo nekatere razlike med obema jezikoma in jih navajamo tukaj: a) modula-2 lofii med velikimi in malimi crkami. Na primer: «na ni ista spremen- Ijivka kot ENA b> pascal pozna dva tipa komentarjev, medtem ko je v moduli-2 dovoljen samo eden, ki pa ga lahko gnezdimo. Tako v moduli-2 < to ni komentar >, (» ampak to •), (• ki je lahko (• gnezden •) *). c) modula-2 pozna vec osnovnih tipov kot pascal. d) v moduli-2 so dovoljene razlifine okrajsa- ve za veccrkovne operatorje. Znak neenakosti <> se zapiie kot •; logicni AND je davoljeno okrajsati v &. 70 e) modula-2 ne pozna sestavljenega stavka, kajti izkaze si, da je nepotreben. Tako je besedica bagin v naslednjem primeru povsem odveftnai pascal: for i:=l to 10 do bagin stavekl; stavek2) stavekn •nd; modula-2: FOR i:=l TO 10 DO stavekl; stavsk2| stavekn END; f) modula-2 pozna brezpogojno zanko (LOOP stavek). g) stavka IF ol THEN s1 ELS1F o2 THEN s2 ELSE s3 END; pascal ne pozna. h) v moduli-2 se vsi stavki zakljufiijo z rezervirano beseda END, kar je razvidno le iz primera za sestavljene stavke. i) v moduli-2 je povsem prepovedan goto stavek. j> razlika je pri definiciji funkcijskih podprogramov. k) modula-2 ne pozna standardnih podrogramov get, put, read, readln, write, writeln za delo z vhodno izhodnimi enotami. 1) modula-2 ne pozna tipa fila. Tu nastete razlike seveda niso edine, vendar so po nasem mnenju najpomembnejse. BITSET is array CO..15) of BOOLEAN; in podatkavni tip ADDRESS, ki ga lahko v adi definiramo kot ADDRESS is lootlf WORD; Razlike med ukaznimi strukturami jezikov so bistveno manjte. Oba jezika poznata podobne osnavne stavke, vendar ina ada pri tern nekaj vefi moSnosti. Modula-2, na primer, ne pozna stavka daolara (nadomestimo ga lahko z uporabo novega modula) in dalay stavka (nadomestino ga s klicem uctreznega podprograma). Modula-2 tudi povsem prepaveduje uporabo GOTO stavka, ki. pa je v adi dovoljen. Naslednji stavek, ki ga najdemo v adi in ne v maduli-2, je null stavek. V resnici obstaja tudi v moduli-2, vendar ga tarn ne napisemo, saj je predstavljen s praznim stavkom, ki ima obliko samo podpifija ali celo nicesar. Kako v moduli-2 nadomestimo ralsa stavek iz ade, pa bomo opisali na primeru nadomescanja strukture axoaption in njene uporabe. Ada je tudi precej mocnej&a kot modula-2 pri uporabi podprogramov, vendar lahko prednasti ade dosezemo s pametnim programiranjem tudi v moduli-2. Tako adino prednost, da je rezultat funkcijskega podprograma lahko tudi strukturi- ran tip, v moduli-2 nadomestimo s tern, da izrafiunani rezultat vrnemo preko parametra, ki je bit klican po naslovu (referetici) . Pafi pa v moduli-2 ne obstaja moJnost ponovnega definira- nja osnovnih operacij, kot so na primer mnotenje, sestevanje in podobno Cinfiksne operacije) , in si moramo zato pomagati s klici ustreznih podprogramov. 3. ADA IN MODULA-2 Ada C21, 243 in modula-2 sta po letnici rojstva vrstnici, zato ni nifi cudnega, fie v obeh jezikih najdemo nekatere bistvene podobnosti, kljub bistvenim sintakticnim, zlasti pa semanticnim razlikam. Zelo pomembna razlika je 2e kar velikost jezika. Kot navaja Pomberger C203, obsega formalna definicija ade vefi sto strani, medtem ko za modulo-2 zadostuje ze dobrih 25. Temu primerna je tudi razlika v velikosti prevajalnikov in kode, ki jo naredi prevajalnik. Zato na majhnih racunalnikih popolnih prevajalnikov za ado prakticno ni, medtem ko jih za modulo-2 najdemo kar nekaj C9, 223. Podobnosti med ado in modulo-2 si oglejmo na primerjavi podatkavnih in ukaznih struktur, na primerjavi modularnosti in moZnosti locenega programiranja ter na primerjavi sposobnosti jezikov za nizkonivojsko programiranje in za vzporedno izvajanje postopkov. 3.1 Podobnomt podatkovnih in ukaznih •truktur Ada in modula-2 poznata podobne osnovne podatkovne tipe, le da ada obvlada tudi stevila v takoimenivani stalni vejici. V maduli-2 realiziramo ta stevila s sestavljenim tipoms FixedPoint » RECORD num: CARDINAL; base, delta: REAL END; Razen tega ada pozna podtipe, ki jih v moduli-2 lahko vodimo kot delne tipe, po drugi strani pa ada ne pozna tipa PROC. Ppleg tega modula-2 pozna tip mnozice, ki ga v adi realiziramo s tabelo: 3.2 Posabnosti in oanovni podprograai V adi obetajata dve strukturi, ki jih modula-2 nima: prva je axoaptions (posebnosti) in je namenjena predvsem za obravnavanje posebnih stanj (na primer napak) v izvajanju programa. Te strukture v moduli-2 v bistvu sploh ne potrebujemo; fie smo pravilno razbili naS program, moduli sami prestreiejo vse napake in jih ostali program sploh ne zazna. Druga struktura, ki jo najdemo samo v adi, izhaja iz dejstva, da je nek algaritem (recimo za vodenje sklada) povsem neodvisen od tega, kaksni element! so v skladu. V ta namen pozna ada takaimenavane osnovne podprograme (gana- rio), kar je v moduli-2 se najteije nadomestiti. Pri tern si pomagamo z splosnimi tipi (ADDRESS, WORD, BITSET, ARRAY) in predvsem z moznoatjo locenega prevajanja, kjer uporabimo za dano razlifiico dani modul. 3.3 Hodularnoat in lofiano pravajanja Nafiela modularnosti in moznosti locenega prevajanja smo si ze ogledaii v fietrtem poglavju prvega dela nasega prispevka. Na tern mestu pa si oglejmo le podobne strukture ade. Nodularno programiranje in loceno prevajanje omogofia ada enako dobro kot modula-2. Pojem modula nadomesfia v adi pojem paketa (paokaga). Kot modula-2 tudi ada lofii med dafinicijskim in delovnim modulom. Dafinicijski modul je zaznamovan z besedo paokaga, delovni pa z paokaga body. Kot v moduli-2 so tudi v adi definirane strukture za oddajo in prevzem tipov, spremenljivk in podprogramov tun, private). Bistvena razlika med obema jezikom pa Je v programskam modulu, ki je pri adi podprogram v moduli-2 pa zopet nodul. 71 V eistemu jezika modula-2 po definiciji obstaja se ena bistvena prednost pred ado. Sistem jezika modula-2 namreC v postopku prevajanja in povezovanja sam preverja, da je modul, ki prevzema neko strukturo iz drugega modula, preveden kasneje. Tega ada v osnovi ne pozna. 3.4 Nizkanivojako prograairtnja in vzporadnoat Na tern podrocju je ada v definicijah precej SibkejSa od module-2. Adino spremenljivko, na primer, ni mo5no namestiti na ieljeno mesto v pomnilniku in programer ima na voljo le se dinamicen naftin dostopa. Za programiranje vzporednih postopkov ima ada enoto taak, ki je podobna procesu v moduli-2. Prednost pred madulo-2 pri vzporednem programi- ranju pa predstavljajo adine ukazne strukture, ki omogocajo vsklajevanje vzporednih procesov; v moduli-2 mora programer te podprogram napisati sam. Kot modula-2 tudi ada omogaca posluzevanje prekinitev. Collins Cl'iD pravi, da bi bila primerjava module-2 in ade nekaj podobnega kot primerjava med pascalora in P4-/1 s kar je prepusceno v moduli—2 programerju, je v adi 5e vgrajeno v jezik. Tu lahko tudi is&emo vzrok obseznosti ade. 4. C IN HODULA-2 Modula-2 in jezik c sta zela razlicna jezika. Zato se bomo omejili le na primerjanje moznosti za programiranje na spodnjem nivoju, torej na nivoju sistemskega programiranja. Razen tega je smiselna primerjava med obema jezikoma v pogledu prenosljivosti programov, medtem ko bi bila primerjava visjih programskih struktur brezpredmetna, ker jih v c-ju ni. Zato v c-ju ne poznamo principov modularnega programiranja in lo&enega prevajanja. Tudi v podatkovnih strukturah je c dokaj reven. Jezik c je nastal hkrsti z operacijskim sistemom Unix C7, 233 ter postal osnovni jezik tega moSno razSirjenega operacijskega sistema. Zato program napisan v c-ju lahko dandanes brez vecjih sprememb pozenemo na poljubnem drugem racunalniku z operacijskim sistemom Unix. Prav prenosljivosti programov je tisti pojem, po katerem je smiselno primerjati modulo-2 in c, Kot pri jeziku c, je torej tudi pri moduli-2 zagotovljena prenoslj'ivost programov, vendar v primeru programov v moduli-2 ne samo med razli&nimi racunalniki z istim operacijskim sistemom, ampak celo med racunalniki z razlicnimi operacijskimi sistemi. Doseci t* oilj v kar se da veliki meri je naloga delovne skupine projekta OSSI C23. Tocneje, izdelati zelijo nekakSen vmesnik med modulo-2 in poljubnim operacijskim sistemom. Jeziku c obiCajno pripisujejo moc in prednost predvsem pri nizkonivojskem programiranju, vendar zlahka uvidimo, da ima vse te zmoznosti tudi modula-2, ki omogoca celo vecji nabor sistemskih operacij. Najvecja moc jezika c je v naslavljanju pomnilnika, vendar prav c ne pozna staticne definicije spremenljivke na dolocenem mestu v pomnilniku. Pac pa c lahko poljubno spremen- ljivko pretvori v kazalec na naslov (to dosezemo z uporabo posebnega znaka •), kar v moduli-2 dosezemo s klicem funkcije ADDRESS. V c-ju lahko vedno ugotovimo naslov v pomnilniku, kjer se nahaja dolocena spremenljivka, v moduli-2 pa to apravimo s funkcijo ADR. Ker c izhaja po svojih definicijah iz zbirnika, ki mu poskuSa ostati cimbolj podoben, je temu primerno bogat tudi po nacinih naslavljanja. Avtomaticno dodajanje (K++) ali odvzemanje Cx-=i) v o-ju, je v moduli izvedljivo z dodatnim klicem podprograma INC. V c-ju obstaja poseben na&in definiranja posameznih spremenljivk, ki prevajalniku pove, naj poskusa shraniti spremenljivke v procesor- ske registre Cragistar). V moduli-2 to ni potrebno, kar so registri neposredno dostopni, drugi cilj omenjene c-jeve strukture optimizacija kode, pa je v bistvu problem prevajalnika in ne jezika samega. Delo s posameznimi biti, ki je v c-ju zelo enostavno, Je v moduli—2 izvedljivo s spremenljivkami tipa BITSET in klicem podpro- gramov INCL ter EXCL. Za razliko od module-2 pa v c-ju ne moremo uporabljati procesov in tudi poslufevanje prekinitev pa definiciji ni del jezika Cl, 7, 193. Nizkonivojsko in sistemsko programiranje, za kar je c dokaj primeren, je enako dobro podprto tudi v moduli-2. Ob tem pa nan modula-2 ponuja se vse prednosti strukturiranega programiranja, lofienega prevajanja, preverjanja sovpadanja tipov in se cele vrste prednosti, ki jih zahteva sodoben, ucinkovit programski jezik, e fiimer se c ne more ravno pohvaliti. 5. Nakatarl pravJalniki za •odulo-2 V tern poglavju si bomo ogledali tri prevajalnike in en interpreter ter z njimi bomo prehodili kratko zgodavino module-2. 4.1 Pravajalnik H2H in H2RT11 Prevajalnik M2RT11 CIO, 11, 12, 15D iz ETH Zurich je bil prvi siroko uporabljani prevajalnik za modulo-2; pisan je v moduli-2 za rafiunalnik PDP-11 (LSI-ID pod operacijskim sistemom RT-11. Avtor module-2 Wirth C253 je novi jezik dokon&no oblikoval in realiziral skozi ta prevajalnik. Dokumentacija obsega pet zvezkov, ki opisujejo samo sistem jezika brez primerjave s kaksnim drugim jezikom. V njih tudi zasledino, da obstaja razlicica tega prevajalnika za opera- cijski sistem Unix. Osnovni prevajalnik (M2RT11) je petprehodovni, kakrsni so praviloma tudi vsi drugi. Prav pocasnost prevajanja, ki izvira iz Stevila prehodov, je ena najvecjih slabosti module-2. Ker so vsi novejSi prevajalniki nastali prav na podlagi tega osnovnega prevajalnika, si ga oglejrao podrobneje. Sistem jezika sloni na kosu programs, ki je napisan v zbirniku in se imenuje Run Time System. V njem so vsebovani vsi podprogrami, ki jih oddaja modul SYSTEM in se nekaj splosnih podprogramov. Klic vseh teh podprogramov je izveden preko programskih prekinitev - pasti. Vedno Dbstaja moznost preprogramiranja tega dela programa tako, da lahko potem poganjamo program brez podlage operacijskega sistema (stand alone). V sistem je vklju&en prevajalnik, ki obsega naslednjih pet prehodovt l.i preverjanje sintakticne pravilnost pre- vajane enote in branje simbalne datoteke vnesenih modulov 2.1 praverjanje pravilnosti deklaracij in izdelava refernfine datoteke 72 3.) preverjanje sovpadanja tipov v telesih podprogramov *.: gsneriranje kode za izraze 5.1 generiranje kode za posamezne stavke in izd»lava izhodne datoteke Kasneje so defininirali neko abliko vmesne kode, podobno kot p-kodo pri pascalu, in jo imenovali li-koda. Prvic je bila ta oblika kode uporabljena pri prevajalniku M2M, kjer sta A. in 5. prehod zdruzena v enega samega in sicer: 4.: generiranje vmesne, M kode V dokumentaciji je dodan tudi interpreter te kode in njen opis C13D Sicer pa se vsi prehodi izvedejo le pri prevajanju delovnih in programskih modulov, raedtem ko so za definicij- ske module dovolj ze prvi trije. Poleg prevajalnika vsebuje sistera jezika Se povezavalnik in iskalnik napak (debugger) ter vrsto uporabniSkih modulov z orodji, ki amogocajo delo z datotekami in podobno. Sistera razpolaga z vec vrstami datotek, ki jih loci po podaljSkih: - .MOD: programski ali delovni modul - .DEF: definicijski modul - .LST: izpis prevedenega programs (potrebuje ga iskalec napak) - .REF: refernSna tabela (potrebuje jo iskalec napak) - .LNK: izhodna datoteka iz prevajalnika, ki je primerna za povezovanje - .LOD: izhodna datoteka iz povezova 1 nika, ki je primerna za izvajanje v okviru sistema - M2M in M2S: sistemske datateke Vsi naslednji primeri prevajalnikav so nekaksne izpeljanke iz osnovnega M2M, 5.2 Modula-2 za Z80 pod CP/H Tudi ta prevajalnik prihaja iz Svice, je pa precej okrnjena razlicica, saj ne pozna pojma procesa in vzporednosti delovanja. Razen tega tudi ne omogoca posluzevanja prekinitev. Kot nadomestilo pa ohranja povezavo z zbirnim jezikom: uporabnik lahko pa zelji dalocene delovne module napise v zbirniku. Sistetn sestoji iz podobnih delov kot M2M in zopet je prilozena mnozica delovnih modulov, ki amogocajo delo s samim operacijskim sistemam. Dokumentacija te implementacije sistema modu- le-2 C143 podrobno opisuje razlike med pascalom in modulo-2. 5.3 Modula-2 razvajni sistaa Je interpreter za modulo-2 za rafiunalnik v tem primeru IBM-PC. Med predstav1jenimi primeri je to tudi edini interpreter. Nastal je leta 1984 pri tvrdki Modula Corporation. Ta sistem je pravzaprav celoten prevajalnik, ki pa itu rosnjka peti prehod, torej generacija kade, ki bi bila izvedljiva na ciljnem racunalniku. Implementa- cija module-2 je dokaj celovita, saj iz definicije jezika manjka samo moznost posluze- vanja prekinitev Cpodprogram SYSTEM.IOTRANS- FER) . Ta sistem je Se najbolj primeren za nadaljne razvojno delo na maduli-2, predvsem v smeri razvoja in izdelave petega prehoda, ki bi izdeloval resnifino izvedljivo kodo. Mozno pa bi bilo tudi dodati Se en prehod za optimizacijo M-kode, ki bi ga vstavili med cetrti in peti prehod. 5.* 8D8-XP Sistem SDS-XP sodi trenutno med najboljSe prevajalnike za modulo-2 za racunalnik IBM-PC in operacijski sistem PODOS. Implementacija module-2 je povsem popolna in vkljuCuje moznost nadzora nad prekinitvaroi ter vzporedno poganjanje procesov. Pa tudi sicer lahko o sistenu zapiSemo samo najboljSe, saj poleg obicajnih delov vsebuje Se poseben urejevalnik, v katerem so definirane posebne tipke, ki omogocajo enostavno pisanje ukaznih struktur (zato tudi odpade prvi prehod) ter moznost uporabe knjiznice modulov, cesar ne omogoca nobena druga od opisanih implementacij module-2. Razen tega SDS-XP odlikuje z izredno bogatimi orodji, ki so vkljufiena v sistemski knjiznioi ITCL1B. S tem smo zakljucili pregled nekaterih vidnih primerov prevajalnikav za modulo-2. Ta pregled pa ni popoln, saj nismo omenili sistemov za ve&je rafiunalnike (VAX pod VMS) in podobno. 6. Modula-2 In Prolog Zadnjih nekaj vrstic tega pregleda namenimo zelo zanimivemu paketu za povezavo module-2 in prologa. Razvit je bil v Zurichu pod vadstvon Carla Mullerja C17, 133. Povezava med obema programskima jezikama je dvosmerna, saj lahko uporabljamo v prologu podprograme napisane v moduli-2, ali pa prologova nacela logicnega iskanja pa podatkovni bazi v moduli-2. Prva moznost je zelo enastavna. Definirati moramo le obliko podprograma vsebovanega v nekem modulu. Ta podprogram nan v postopku interpretacije prologovega programa predstavlja nek prologov stavek (klavzulo). Tako lahko resnicno priSnemo razvijati nek program v prologu in postopoma stavek za stavkom prevajamo v modulo-2. Na koncu imamo celoten program v maduli-2, ga prevedemo in s tem pridobimo na hitrosti, ki je najbolj Sibka tofika prologovih interpreterjev. Obraten, manj pogost primer uporabe, sloni na klicu prologovega interpreterja, ki je samo nek podprogram. Temu podprogramu predamo kot parameter nek niz, ki je v bistvu prolagov stavek, katerega interpreter obdela na enak nacin, kot vsak drug prologov stavek. Opisani sistem je bil razvit na racunalniku Lilith, sedaj pa je na valju tudi za racunalnike IBM-PC pod MS-DOS in VAX pod VMS. Enostavna prenosljivost paketa je prav plod uporabe OSSI standarda, ki ga paket uporablja za vse posege proti operacijskemu sistenu. 7. La»tn« V Odseku za rafiunalniStvo in infarmatiko Institute Jo2ef Stefan ze nekaj casa sistema- ticna zbirama dakumentacijo in arodja za programiranje v moduli-2. Do sedaj smo v maduli-2 realizirali nekaj manjsih poskusnih projektov, od katerih jedra dveh navajamo v dadatku. Med drugim smo v moduli-2 razvili razporejevalnik sistemskega casa in s tem omogoclli pisanje resni&nih socasno tekocih procesov na enem procesorju v nasprotju z definicijo module-2, ki pozna samo sorutine. Naslednji korak pa je implementacija vecih socasno tekocih procesov na vecih procesorjih. Projekt razvijamo v okviru razvoja poskusnega okolja PS-It za programiranje vzporedno delujocih procesorjev na vodilu Q C3, 83. Dosedanji rezultati so dokaj vzpadbudni: doslej 73 smo uspeli pognati vefi vzporednih, vendar zaenkrat nesadelujaftih procesav, ki si delijo skupni pomnilnik. Poleg tega nastaja v naSih laboratorijah prva implementacija OSSI standards za operacijski sistem RT-tt in MicroVMS. 7. Z«kl.1uo«k Modula-2 se je v preteklih nekaj letih uveljavila kot jezik za sistemsko programiranje in kot jezik za pisanje velikih programskih sistemov. Obstaja ocena, da je v moduli-2 napisane fe okoli 15% novejSe sistemske programske opreme. Razlog za hitro razsirjenje jezika je brez dvoma v njegovi enostavnosti in ucinkovitosti. Pray gotovo si bo modula-2 s svojo preglednostjo in majhnostjo samega sistena, ter enostavnostjo rokovanja pridobila v prihodnje Se veliko vecjo veljavo in ie morda kar kroalu nadamestila "stari dobri pascal". Zihvtli Za -vso pomoc pri iskanju novih znanj in dragocene nasvete pri oblikovanju besedila se najlepse zahvaljujem prof .dr.BoStjanu Vilfanu. Lltaratura C 13 V.Batagelj, A.Brodnik in ostali: Procee- dings of 4th Summer School of Computer Sciences. US Report 4352, Ljubljana, 1986. C 23 E.Biagioni, K.Hinrich, G.Heiser, C.Mullers A Portable Operating System Interface and Utility Library. IEEE Software, November 1986. C 33 A.Brodnik, S.Mavrifi, R.Trobec: Q-bus Base Multiprocessor System. CompEuro, Hamburg, 1987. C 43 S.Collins, B.Marshall, N.King: Modula-2 . - A Babel Fish for Chips?. System Internati- onal, December 1986. C 53 R.Gleaves: Modula-2 for Pascal Program- mers, Springer-Verlag, 1984. C 63 K.Jensen, N.Uirth: PASCAL User Manual and Report, Springer-Verlag, 1975. C 73 B.W.Kernighan, D.M.Ritchie: The C Program- ming Language, Prentice-Hall, 1978. C 83 S.Mavric, A.Brodnik, R.Trobec, M.Spegel, P.Kolbezen: PS-11: Vecprocesorski sistem na vodilu Q. Mipro 1987, Opatija, 1987. C 91 Modula-2 Development System. Modula Corpo- ration Provo, Utah, 1984. CIO] Modula-2 Installation Instructions. ETH Institut fur Infarmatik, Zurich, 1981. C113 Modula-2 Overview of the Modula-2 Compi- ler . ETH Institut fur Informatik, Zurich, 1981 . C123 Modula-2 Overview of Modula-2 Debugger. ETH Institut fur Informatik, Zurich, 1981. C133 Modula-2 Overview of Modula-2 System M2M. ETH Institut fur Informatik, Zurich, 1982. C143 Modula-2 System for Z8Q CP/M. Hochstrasser Computing AG, Zurich, Switzerland, 1984. C153 Modula-2 User Guide. ETH Institut fur Informatik, Zurich, 1981. C163 B.Mohar, E.ZakrajSek: Uvod v programira- n.ie. DMFA, Ljubljana, 1982. . C173 C.Mullen Modula-Prolog (User Manual). ETH Institut fur Infarmatik, Zurich, Juli 1985. C183 C.Muller: Modula--Proloo: A Software Development Tool. IEEE Software, November 1986. Osnove proaramskeaa iezika C. Delovni C213 I.C.Pyle: The Ada Programming Language. Prentice-Hall, 1981. C223 SDS-XP, Extended Performance Modula-2 Software Development System. Interface Technologies, Houston, Texas, 1985. C233 R.Thomas, L.R.Rogers, J.L.Yates: Advanced Programmer's Guide to UNIX System V. McGraw-Hill, 1986. C243 P.Wegneri Programming with Ada. Prentice- Hall, 1980. C253 N.Wirthi Programming in Modula-2. Third, Corrected Edition, •Springer-Verlag, 1985. DocUtak A - Phona Program Phone omogoca pogovor med dvema terminaloma prikljucenima na racunalnik LSI-11 pod operacijskim sistemom RT-11. Ker je RT-11 enouporabniski sistem, je lahko hkrati aktiven le en terminal. Tu program poienemo in izberemo drugega. Pri obeh se na zaslonu pojavi obrazeo. Na zgornjo polovico zaslona se izpisujejo rnaki, sprejeti od drugega termina- la, na spodnjo pa zanki, ki jih terminal po€ilja drugemu. Program sestoji iz sestih modulov: - Phon«: osnovni program - rSor: modul za delo z enim zaslonom - x8or: skrbi za drugi zaslon - VTLibn: posebni ukazi za delo s terminali tipa VT100 - rPort: posluievanje prekinitev na enem vhodu - xPortt posluJevanje prekinitev na drugem vhodu Na sliki 1 je se prikazana podrobnejSa shema medsebojne odvisnosti posameznih modulov. C193 C203 zvezek Izobrazevalni center Delta, 1984. G.Pomberger: Software Engineering and slika 1 Definicijski moduli: DEFINITION MODULE rScrj (* modul za delo s prvim terminalom *) EXPORT QUALIFIED rPutCh, rPripraviEkran, rBrisi, rGetCh; PROCEDURE rPutCh •) VAR xch, rch: CHAR; OK, OK: BOOLEAN; CSR, Vect: CARDINAL; PROCEDURE BeriCSR (niz1: ARRAY OF CHAR; VAR Vect, CSR: CARDINAL); C* doloci vektorja in naslove statusnih registrov obeh terminalov *) VAR Enota: CHAR; BEGIN WriteString (niz); Read (Enota); Write (Enota); CASE Enota OF '1': Vect := 310B; CSR := 176510B I '2': Vect := 3508; CSR := 176SS0B END END BeriCSR; BEGIN SetMode (0, FALSE); (• prepove *) BeriCSR (' Od TT (st.)i ', Vect, CSR); xPripraviEkran (Vect, CSR); BeriCSR (' Proti TT (st.): ', Vect, CSR); rPripraviEkran (Vect, CSR); REPEAT (• glavna zanka za izmenjavo znakov *) xGetCh (xch, OK); IF OK THEN rPutCh (xch, TRUE); xPutCh (xch, FALSE) END; rGetCh (rch, OK); IF OK THEN xPutCh (rch, TRUE); rPutCh (rch, FALSE) END UNTIL (xch = ETX) OR (rch = ETX); xBrisi; rBrisi END Phone. IMPLEMENTATION MODULE rScr; (• delo s sprejemniro zaslonom • ) FROM rPort IMPORT rlnit, rGetByt, rClose, rPutBytj FROM VTLibx IMPORT sCursor, sErase, sWriteLine, sScroll, sNewLine, entire, PutString, DelCh, Obrazec; CONST CR = 015C; LF = 012C; DEL = 177C; BS = OlOCj REFR = 027C; ESC = 033C; VAR xni, xt, yn, yt, x, y: CARDINAL; PROCEDURE Send (cht CHAR); (• poSlje znak na zaslon *) VAR oki BOOLEAN) BEGIN REPEAT rPutByt (ch, ok) UNTIL ok END Send; PROCEDURE rPripraviEkran (VAR rVect, rCSR: CARDINAL); (* nastavi terminal in izpiSe abrazec #) BEGIN rlnit (rVect, rCSR); xm i= 1; xt := 1; ym := 11; yt := 22; x := xm; y := ym; Obrazec (Send) END rPripraviEkran; PROCEDURE rPutCh (ch: CHAR; flags BOOLEAN); (» interpretira sprejeti znak #) PROCEDURE Uredi (VAR a, b: CARDINAL); VAR i: CARDINAL; BEGIN IF ch = REFR THEN FOR i:=l TO 10 DO sNewLine (Send) END; a := 1 END; IF ch = DEL THEN DelCh (Send); a:=a-l ELS1F ch = CR THEN sNewLine (Send); a:=l ELSE Send (ch); a := a + 1 END; END Uredi; BEGIN IF (flag) THEN IF x tt xn THEN sScroll (3, 11, Send); sCursor (xm, ym, Send); x := xm END; Uredi (xm, ym) ELSE IF x # xt THEN sScroll (14, 22, Send); sCursor (xt, yt, Send); x := xt END; Uredi (xt, yt) END; END rPutCh; PROCEDURE rGetCh (VAR ch: CHAR; VAR OK: BOOLEAN); (* dobi znak s terminala *) BEGIN rGetByt (ch, OK); END rGetCh; PROCEDURE rBrisi; (• zbriSe ekran in zakljuci komunikacijo *) 75 BEGIN sErase (entire, Send); rClose END rBrisi; EWO rScr. IMPLEMENTATION MODULE xPort C73; (• podprogrami za dela z enin ad kanalav • ) FROM SYSTEM IMPORT ADR, ADDRESS, SIZE, WORD, NEWPROCESS, TRANSFER, IOTRANSFER; CONST N = 32i TYPE DLVtlJ RECORD rCSR: BITSET; rBUF: CARDINAL! xCSR: BITSET; xBUF: CARDINAL END; TypeCSR = POINTER TO DLVllJ; VAR rn, rin, rout, xn, xin, xout: CARDINAL; rbuf , xbuf: ARRAY CO..N-13 OF CHAR; rPRO, xPRO, CONs ADDRESS; rWSp, xWSp: ARRAY C0..177B3 OF WORD; pxl , px2, px3, px'.: WORD; activei BOOLEAN; Vector: ADDRESS; CSR: TypeCSR; PROCEDURE xGetByt (VAR ch: CHAR; VAR OK: BOOLEAN); C* pobere zlog iz sprejemnega vmesnika, ce lahko •) BEGIN IF rn > 0 THEN OK := TRUE; ch := rbuf Crout3;. rn : = rn - 1 ; rout := (rout+1) MOO N; ELSE OK := FALSE END END xGetByt; PROCEDURE producer; (• sprejemni prekinitveni podprogram •) BEGIN LOOP IOTRANSFER (rPRO, CON, Vector); IF rn < N THEN rbuf Crin3 := CHR (CSR~.rBUF); rin := (rin+1) MOD N; rn «= rn + t END END END producer; PROCEDURE xPutByt (VAR ch: CHAR; VAR OK: BOOLEAN); (• vstavi zlog v oddajni vmesnik, ce lahko *) BEGIN IF xn < N THEN OK ,: = TRUE; xbuf CxinD := ch; xn := xn + 1; xin := (xin+1) MOD N; IF NOT active THEN 1NCL (CSR'.xCSR, 6); active := TRUE END ELSE OK 1= FALSE; END END xPutByt; PROCEDURE consumer; (• oddajni prekinitveni podprogram ») BEGIN LOOP IOTRANSFER (xPRO, CON, ADDRESS (Vector+4)); IF xn > 0 THEN CSR-.xBUF := ORD (xbuf CxoutD); xn i= xn - 1; xout 1= (xout+1) MOD N ELSE EXCL (CSR-.xCSR, 6); active := FALSE ENO END END consumer; PROCEDURE xlnit (VAR xVect, xCSR: CARDINAL); (* inicializiramo registre, ki jih bomo potrebovali in pozenemo nov proces *) VAR a: ADDRESS; BEGIN Vector 1= xVect; CSR t= TypeCSR (xCSR); (• shranimo stare vrednosti *) a := ADDRESS (Vector); px1 := a"; INC (a, 2)5 px2 := a"; INC (a, 2); px3 := a"; INC (a, 2) ; rn := 0; rin 1 = 0; rout := 0; NEWPROCESS (producer, ADR(rUSp), SIZECrWSp), rPRO); xm=0; xini'O; xaut:=Q; active:=FALSE; NEWPROCESS (consumer, ADR(xWSp), SIZE(xUSp), xPRO); WITH CSR" DO 1NCL (rCSR, 6)5 TRANSFER (CON, rPRO); TRANSFER (CON, xPRO) END END xlnit; PROCEDURE xClose; (• pocistimo vse za seboj *) VAR a: ADDRESS; BEGIN (• obnovimo stare vrednosti •) a := ADDRESS (Vector); a* := pxl; INC (a, 2); a" := px2; INC (a, 2); a* i= px3; INC (a, 2); a* := px4- END xClose; END xPort. Na sliki 2 pa podajamo Se prikaz medsebojnih klioev modulov. Primer je tudi lep nacin razbitja na nodule in definicije njihovih sticnih tack - podprogramav. Dodatek B - Rarpor«.1«vXnik Tukaj navajamo samo primer definicijskega in delovnega modula razporejevlanika procesorskega Casa in kratek primer z dvema procesoma. DEFINITION MODULE Scheduler; EXPORT QUALIFIED ProcessGoj PROCEDURE ProcessGo (whichi PR.OC; space: CARDINAL); (* pozene nov proces, ki uporablja space velik prostor v pamnilniku •) END Scheduler. IMPLEMENTATION MODULE SchedulerC73; FROM SYSTEM IMPORT ADDRESS, PROCESS, NEWPROCESS, TRANSFER, IOTRANSFER; FROM Storage IMPORT ALLOCATE; CONST N = 10; (» najvecje stevilo procesov •> ClockVec » 1006; (» prekinitveni vektor ure •) TimerSpace •> 2008) (• prostor za prekinitveni 76 Phone t PripraviEkra n rCatCh rPutCti iBritl rScr S.nd • Cur»or_. Ob'iitc VTLlbx rlnll rGatByt rPutByl rClos* rPort rPntSyi >G«tByt coniumtr .— producer •ilk* a podprogram za uro •> TioksPerPeriod = 50 (* stevilo urinih enot, ki so dadeljeni enemu procesu *) VAR StartNewProcess; BOOLEAN; wspi ADDRESS; FirstProc, (• starting process •) TimorAdd: PROCESS;(* here is timer *) Processes! ARRAY C1..N3 OF PROCESS; n, current: CARDINAL; PROCEDURE Timer; (ft dusa razporejevlnika *) VAR NumbarOfTicks: CARDINAL; BEGIN NumberOfTicks := TicksPerPeriod; LOOP IF n > 0 THEN IF StartNewProcess THEN StartNewProcess s= FALSE; NumberOfTicks := TicksPerPeriod; currenti=n ELSIF NumberOfTicks <= 0 THEN NumberOfTicks := TicksPerPeriod; currentt=(current MOD n)+l ELSE NumberOfTicks := NumberOfTicks - 1 END; IOTRANSFER (TimerAdd, ProcessesCcurrent3, ClockVec) ELSE NumberOfTicks i= TicksPerPeriod; IOTRANSFER (TimerAdd, FirstPrac, ClockVec) END; END END Timer; PROCEDURE ProcessGo (which: PROC; space: CARDINAL); (* pozene nov proces *) VAR wspi ADDRESS; OldCur: CARDINAL; BEGIN IF n < N THEN ALLOCATE (wsp, space); (* poiscemo prostcr za novi proces *) n:»n+t; NEUPROCESS (which, wsp, space, ProcessesCn3>; StartNewProcess :•= TRUE; IF n = 1 THEN (• ali je prvi «) TRANSFER (FirstProc, TimerAdd) ELSE (• sicer ga pozene Timer *) TRANSFER (ProcessesCcurrent3, TimerAdd) END; END END ProcessGo; BEGIN n:=0; current:=»1; StartNewProcess :< ALLOCATE (wsp, TimerSpace)) NEUPROCESS (Timer, wsp, TimerSpace, TimerAdd); TRANSFER (FirstProc, TimerAdd) (ft in pozemo Timer ft) END Scheduler. MODULE TestScheduleri FROM Scheduler IMPORT ProcessGo; FROM VTLibx IMPORT sCursor; FROM TTIO IMPORT Write, Read; FALSE; CONST SpaoeNeeded VAR chj CHAR? AOOBi PROCEDURE One; (ft na zaslon izpisuje "A" ft) VAR i: CARDINAL; BEGIN ProcessGo (Two, SpaceNeeded); i:=l( LOOP sCursor (i, 4, Write); i:=(i MOD 80)+1; Write ('A') END END One; PROCEDURE Two; (ft ta pa naj izpisuje "8" ft) VAR ii CARDINAL; BEGIN LOOP sCursor (i, 5, Write); i Write CB'l END END Two; BEGIN ProcessGo (One, SpaceNeeded) END TestScheduler. MOD 80)-H;