A Cool programozási nyelv

Működési szemantika

Működési szemantika

A következőkben meghatározzuk, hogy a Cool-ban az egyes kifejezések milyen értéket kell, hogy felvegyenek egy adott szövegkörnyezetben. A szövegkörnyezet három komponensből áll: egy környezetből, egy készletből, és egy self objektumból. Ezeknek a leírása a következő részben történik.

Környezet és készlet

Mielőtt a Cool-hoz szemantikát tudnánk rendelni, szükség van néhány fogalomra és jelölésre. Egy környezet egy leképezése a változó azonosítóknak címekre. Azaz, egy környezet megmondja egy adott azonosítóról a memória címét, ahol annak az értéke tárolva van. A környezetnek egy adott kifejezés minden azonosítójához hozzá kell rendelnie a címét, amire a kifejezés hivatkozhat. Például az a + b esetén szükség van egy környezetre, ami a-t is és b-t is egy-egy címre képezi le. A következő szintaxist fogjuk használni a környezetek leírására, ami nagyon hasonló a típusnál használthoz:

                                                               E = [a : l1, b : l2]

Ez a környezet a-t l1, b-t l2 címre képezi le.

A szövegkörnyezet második komponense a kifejezés kiértékeléséhez használt készlet. A készlet címeket képez le értékekre, ahol az értékek a Cool-ban csak objektumok. Azaz, egy készlet megmondja, hogy milyen érték van egy adott memóriacímen tárolva. Egy pillanatra tegyük fel, hogy minden érték integer. Ekkor egy készlet hasonló a környezethez:

                                                          S = [l1 à 55, l2 à 77]

Ez a készlet az l1 címhez 55-öt, l2-höz 77-et rendel.

Ha adva van egy környezet és egy készlet, akkor egy azonosító értéke úgy határozható meg, hogy először megkeressük a környezetben azt a címet, amire az azonosító hivatkozik, azután a készletben megkeressük a címet.

                                                                     E(a) = l1

                                                                    S(l1) = 55

Együtt a környezet és a készlet definiálja a végrehajtás állapotát egy Cool kifejezés kiértékelésének bizonyos pontján. A kétszeres indirekció az azonosítóktól a címekig és onnan az értékekig lehetővé teszi, hogy változókat modellezzünk. Nézzük meg, hogy mi történik, ha a 99-es értéket rendeljük hozzá a fenti környezetben és készletben definiált a változóhoz. Egy értékadás azt jelenti, hogy megváltoztatjuk a változó értékét, amire az hivatkozik, de nem a címét. Az értékadás végrehajtásához először megkeressük az E környezetben az a címét, azután megváltoztatjuk a kapott címhez tartozó leképezést az új értékre, amivel egy új S’ készletet kapunk.

                                                                     E(a) = l1

                                                                 S’ = S[99/l1]

Az S[v/l] szintaxis egy új készletet jelöl, ami identikus az S készlettel, kivéve, hogy S’-ben az l címhez a v érték tartozik. Minden egyéb l’ címre, amire l’ ≠ l, továbbra is igaz S’(l’) = S(l’).

A készlet modellezi a memória tartalmát a program végrehajtása közben. Egy értékadás tehát megváltoztatja a készletet.

Persze vannak olyan szituációk is, amikor a környezet változik. Vegyük a következő Cool programrészletet:

let c : Int <- 33 in

  c

end

Ennek a kifejezésnek a kiértékelése közben be kell vezetnünk egy új c azonosítót a környezetbe, mielőtt kiértékelnénk a let törzsét. Ha a pillanatnyi környezet és készlet E és S, akkor létrehozunk egy új E’ környezetet és egy új S’ készletet:

                                                                lc = newloc(S)

                                                                   E’ = E[lc/c]

                                                                  S’ = S[33/lc]

Az első lépés, hogy lefoglaljunk címet az új c változónak. A címnek újnak kell lennie, ami azt jelenti, hogy a pillanatnyi készlet nem tartalmaz rá vonatkozó leképezést. A newloc() függvény egy készletre meghívva visszaad egy használatlan címet abban a készletben. Ezután létrehozunk egy új E’ környezetet, ami c-t leképezi lc-re, de tartalmaz minden más leképezést is E-ből. Jegyezzük meg, hogy ha c már egy létező leképezés E-ben, akkor E’ elrejti a régi leképezést. Frissítenünk kell még a készletet is, hogy az új címhez rendeljen egy értéket. Ebben az esetben lc a 33-as értékre képez le.

Ez a példa kissé túl egyszerűsíti a Cool-ban használt környezetet és készletet, mert az egyszerű integer-ek nem Cool értékek. A Cool-ban még az integer-ek is teljes értékű objektumok.