semantika. Failis Interpret.hs defineeritakse interpretaator ise IO-monaa-
dilise tegevusena. IO-monaadi kasutataksegi ainult siin ning Fumontrixi ST-
monaadi realiseerimiseks.
7.3
Fumontrixi semantika kirjeldamisest
7.3.1
Semantika tasemed
Fumontrixis antakse semantika kolmel erineval tasemel: liigitase, t¨u¨ubitase
ja andmetase. Neist esimesed kaks moodustavad staatilise semantika, kuna
need arvutatakse v¨alja t¨u¨ubikontrolli k¨aigus, see arvutuste k¨aik on igal prog-
rammi k¨aivitamisel sama (kui kood ei ole muutunud) ning nende arvutuste
termineerumine on garanteeritud.
Andmetaseme semantika moodustab d¨unaamilise semantika, mille arvu-
tamine ei pruugi termineeruda. Siin v˜oiks ka arvutuse k¨aik erinevatel prog-
rammi k¨aivitamistel olla erinev, kui programm saaks teha sisendi-v¨aljundi
operatsioone. Fumontrixis siiski sisendit-v¨aljundit realiseeritud ei ole (v.a
ST-monaadi viidad ja massiivid, kuid neid saab kasutada ainult muust maa-
ilmast eraldatud l˜oimedes, mille algseisund on fikseeritud, seega on arvutused
seal deterministlikud).
Failis Denot.hs antakse liigitaseme semantika funktsioonidega, mille nimi
l˜opeb sufiksiga Kem, t¨u¨ubitaseme semantika sufiksiga Zem ning andmetaseme
semantika sufiksiga Sem. N¨aiteks avaldiste semantika antakse funktsioonidega
exprKem, exprZem ja exprSem.
7.3.2
Seosed semantika tasemete vahel
Kuigi Fumontrixi semantika antakse kolmel erinevale tasemel, on need tase-
med mingil m¨a¨aral omavahel seotud. N¨aiteks t¨u¨ubi(konstruktori) rakenda-
misel universaalselt kvantifitseeritud t¨u¨upi v¨a¨artusele (pol¨umorfse v¨a¨artuse
spetsialiseerimisel operaatori $: abil) m¨a¨aratakse rakendatava t¨u¨ubikonst-
ruktori liik liigitaseme semantikaga. See liik peab ¨uhtima pol¨umorfse t¨u¨ubi
kvantoriga seotud muutuja liigiga, kuid viimane selgub alles t¨u¨ubitaseme
semantikas, kvantifitseeritud t¨u¨up ise on liiki * ja liigitasemel selle kohta
rohkem infot k¨atte ei saa. N¨aiteks
(type tf Int) $: List
kus tf on t¨u¨ubitaseme funktsioon liiki * -> @. Siis type tf Int on v¨a¨ar-
tus ning rakendatav t¨u¨up List on liiki * -> *. Liigitasemel v¨a¨artuse t¨u¨ubi
kohta mingit infot teada ei ole. T¨u¨ubitaseme funktsioon tf v˜oib tagastada
nii forall A. A kui forall M : * -> * . M Int t¨u¨upi v¨a¨artuse, olenevalt
61
argumendist. Kuna liigitasemel t¨u¨ubitaseme funktsioone ei v¨a¨artustata (se-
da tehakse t¨u¨ubitasemel), siis ei ole liigitasemel v˜oimalik neil juhtudel vahet
teha.
Seega toimub liikide ¨uhtimise kontroll antud juhul t¨u¨ubitasemel ja selleks
on vaja edastada liigitaseme semantikas v¨alja arvutatud rakendatava t¨u¨u-
bikonstruktori liik (antud juhul List : * -> *) t¨u¨ubitasemele. Alternatiiv
oleks see info t¨u¨ubitasemel uuesti v¨alja arvutada. See t¨ahendaks korduvat
sama asja uuesti v¨aljaarvutamist. N¨aiteks kui see $: rakendus asub kuskil
t¨u¨ubitaseme funktsiooni sees ning seda t¨u¨ubitaseme funktsiooni kutsutakse
korduvalt v¨alja, siis oleks (selle $: rakenduse) liigitaseme semantika igal v¨al-
jakutsel sama, kuid t¨u¨ubitaseme semantika v˜oib olla iga kord erinev, s˜oltudes
selle t¨u¨ubitaseme funktsiooni argumendist. Sellep¨arast ongi liigitase t¨u¨ubita-
semest eraldatud.
Seega on vaja edastada infot liigitasemelt t¨u¨ubitasemele ja Fumontrixi
interpretaatoris kasutatakse selleks KemInfo t¨u¨upi v¨a¨artusi. Mingile s¨untak-
tilisele objektile liigitaseme semantika arvutamisel leitakse lisaks KemInfo
v¨a¨artus, mis sisaldab t¨u¨ubitasemele edastatavat infot nii selle s¨untaktilise
objekti kui selle alamobjektide jaoks. See v˜oimaldab arvutada v¨alja liigita-
seme semantika kogu programmi jaoks ning saada kohe k¨atte t¨u¨ubitasemele
edastatav info k˜oigi selle alamobjektide jaoks. See KemInfo v¨a¨artus antakse
siis t¨u¨ubitaseme semantika arvutamisel parameetriks. S¨untaktiliste objekti-
de t¨u¨ubitaseme semantika v˜oib s˜oltuda alamobjektide semantikast, mille ar-
vutamiseks vajalik KemInfo v¨a¨artus sisaldub parameetrina k˜orgema taseme
objekti KemInfo v¨a¨artuses.
Seega info liigub lihtsalt liigitasemelt t¨u¨ubitasemele. Natuke ebamugav on
k¨ull see, et KemInfo v¨a¨artusi tuleb t¨o¨odelda ka nende s¨untaktiliste objektide
juures, mis ise seda infot ei kasuta, kuid mille alamobjektid kasutavad seda.
N¨aiteks tavalise t¨u¨ubitaseme funktsiooni rakendamise jaoks tuleb liigitasemel
funktsiooni ja argumendi KemInfo ¨uhendada (konstruktori KIList abil) ning
t¨u¨ubitasemel j¨alle eraldada ja anda alamobjekti semantikate arvutamisel pa-
rameetriks.
Lisaks liigitaseme ja t¨u¨ubitaseme seotusele on seotud ka t¨u¨ubitase ja
andmetase (n¨aiteks andmetaseme funktsiooni rakendamise korral m¨a¨aratak-
se andmetasemel rakendamiseks kasutatav monomorfne operaator t¨u¨ubitase-
mel, kuna see s˜oltub (ainult) funktsiooni ja argumendi t¨u¨upidest, andmeta-
semel on vaja ainult funktsiooni ja argumendi v¨a¨artused sellele operaatorile
argumendiks anda). Seal kasutatakse analoogilist meetodit info edastamiseks
¨uhelt tasemelt teisele. KemInfo asemel kasutatakse siin StatSemInfo t¨u¨upi
v¨a¨artusi.
62
7.3.3
Monaadid semantika esitamisel
Antav semantika vastab enam-v¨ahem denotatsioonilisele semantikale, ku-
na konstruktsioonide semantika antakse puhtalt funktsionaalsel kujul alam-
konstruktsioonide (komponentide) kaudu (kompositsiooniliselt). T¨u¨ubikont-
rolli ja liigikontrolli jaoks kasutatakse siiski (puhtalt funktsionaalselt defi-
neeritud) monaade. T¨u¨ubikontrolli monaad TC v˜oimaldab hoida kas tavalist
v¨a¨artust v˜oi erindit (t¨u¨ubiviga). Sellisel juhul ei ole vaja igas kohas, kus v˜oib
t¨u¨ubiviga tekkida, seda kontrollida — kui kuskil tekib t¨u¨ubiviga, siis on see
l˜opptulemuses n¨aha.
Liigikontrolli monaad KC v˜oimaldab lisaks erindile (liigiveale) kasutada
ka lihtsat seisundit. Seda kasutatakse unikaalsete identifikaatorite generee-
rimiseks, et nummerdada t¨u¨ubitaseme v¨a¨artuste kontekste. See on vajalik
leksilise skoopimise s¨ailitamiseks, kuna t¨u¨ubitaseme v¨a¨artust v˜oidakse kasu-
tada ka mingis muus skoobis kui see, milles see defineeriti.
7.3.4
Andmestruktuurid semantika esitamisel
Semantika andmisel kasutatakse konteksti (staatilises semantikas) ja keskkon-
da (d¨unaamilises semantikas). Kumbki neist koosneb Haskelli Map-t¨u¨upi and-
mestruktuuridest. Map on andmestruktuur, mis seab m˜onedele teatud t¨u¨upi
v¨a¨artustele (see t¨u¨up peab olema Ord-klassi esindaja) vastavusse maksimaal-
selt ¨uhe mingit teist t¨u¨upi v¨a¨artuse.
See andmestruktuur on Haskellis realiseeritud funktsionaalselt, seega ole-
masolevat andmestruktuuri ei saa muuta. Kui on vaja seal andmestruktuuris
muudatusi teha (kirjeid lisada, kustutada, muuta), siis luuakse uus andme-
struktuur, mis erineb vanast nende muudatuste v˜orra, kuid vana andmestruk-
tuur j¨a¨ab ka alles ning viidad sellele j¨a¨avad kehtima (kui ¨ukski viit enam sin-
na ei viita, siis v˜oib pr¨ugikoristus selle minema visata). Kuna vanal ja uuel
andmestruktuuril on siiski ¨usna palju ¨uhist, siis ei pea iga muudatuse jaoks
t¨aielikku koopiat tegema, vaid andmeid v˜oib jagada erinevate versioonide va-
hel. Seet˜ottu see funktsionaalne andmestruktuur ei ole v¨aga palju aeglasem
ja m¨alun˜oudlikum kui vastavad imperatiivsed andmestruktuurid.
7.4
Lihtsamate konstruktsioonide semantikast
7.4.1
Avaldised
Enamiku avaldisekonstruktsioonide semantika on ¨usna lihtne ja standardne.
Avaldise semantika m¨a¨arab selle t¨u¨ubi ja v¨a¨artuse, mis s˜oltuvad kontekstist
ja keskkonnast.
63
Dostları ilə paylaş: |