A Theta programozási nyelv

Objektumok

A Theta programok az objektumok univerzumában futnak. Minden objektum ebben az univerzumban rendelkezik egyedi azonosítóval, egy beágyazott állapottal, és metódusok egy halmazával, melyeket meghívhatunk. Az objektumnak mindig van egy típusa, mely definiálja az objektum metódusainak nevét és szignatúráját.

A Theta sok beépített típussal rendelkezik, de a felhasználónak is lehetősége van új, absztrakt típusok definiálására. A felhasználók szintén tudnak új rutinokat definiálni. A metódusok és rutinok eljárások vagy iterátorok lehetnek, melyek a hívásuk után terminálhatnak normálisan, vagy kiválthatnak kivételt. A típusok és rutinok is paraméterezhetők egy vagy több típussal.

Az objektumok egy bizonyos metódus vagy rutin meghívásával jönnek létre, melyek képesek új objektumok létrehozására. Az objektumok által lefoglalt terület automatikusan felszabadításra kerül a szemétgyűjtő által, ha nincs több hivatkozás az objektumra.

A Theta típusrendszere

A Theta típusai hierarchiába szervezettek, ahol minden típusnak van valahány szupertípusa (őstípusa). A hierarchia csúcsán egy beépített típus, az "any" áll; az "any" minden típusnak szupertípusa. Mikor egy új típust definiálunk, meg kell adnunk a szupertípusait. Minden altípus rendelkezik a szupertípusai metódusaival, és ezeknek a metódusoknak kompatibilis szignatúrával kell rendelkezniük. Az "any" típusnak nincsenek metódusai, így nem tesz megkötést az altípusaira. A szupertípusok metódusai átnevezhetők, így az új nevek azok lehetnek, amikre az altípusban szükség van.

A Theta erős, statikus típus-ellenőrzést biztosít. Minden változónak van egy deklarált típusa, ami meghatározza, hogy milyen objektumra hivatkozhat. A változó csak olyan objektumra hivatkozhat, melynek aktuális típusa altípusa a változó típusának. Minden rutin és metódus rendelkezik egy deklarált szignatúrával, mely meghatározza az argumentumok és a visszatérési értékek típusát. A fordító biztosítja, minden rutinhívás és értékadás megfelel a deklarációknak. Az alkalmazott szabály biztosítja, hogy minden hívásnál a változó típusa megfelel a változó által hivatkozott aktuális objektumnak. A változó által mutatott objektum szigorú típusa nem ismert fordítási időben, de a szigorú típus meghatározható a typecase utasítás használatával, mely az objektum típusát futási időben ellenőrzi.

A típus hierarchia biztosítja az altípusok polimorfizmusát, és engedélyezi általános rutinok és adatstruktúrák definiálását, azaz a rutinok paraméterei és visszatérési értékei, valamint az adatstruktúrák elemei esetében az aktuális objektumok lehetnek a deklarált típus altípusai.

Specifikációk

Az új típusokat és rutinokat egy specifikációs részben kell definiálni. A specifikáció definiálja az interfész információit, de nem tartalmaz információkat az új típus implementációjáról. Ezt különálló részben kell megadni, és egy típusnak vagy rutinnak több implementációja is lehet.

A típus specifikációja megadja a típus szupertípusait, a nevét és metódusainak szignatúráját. Egy típusnak több szupertípusa is lehet, és a szupertípus metódusai átnevezhetőek az altípusban.

A típus specifikáció csak a típusobjektumok metódusait definiálja, nem biztosít módot arra, hogy új objektumokat hozzunk létre a "semmiből" (, azaz nincsenek konstrukciós műveletek). A létrehozásra olyan rutinok használhatók, melyek nem részei a típusnak. A konstrukciós műveletek különválasztása a típustól azt jelenti, hogy az altípus létrehozó műveletének nem kell kapcsolatban állnia a szupertípussal, és ez megengedi a típus különböző implementációinak, hogy különböző módon hozzanak létre új objektumot. Például a map hash-táblán alapuló implementációjánál a létrehozó műveletnek paraméterül át kell adni egy hashelő függvényt, míg a tömbön alapuló implementáció lehet paraméter nélküli.

Osztályok és öröklődés

A típus egy vagy több osztályban (class) kerül implementálásra. Az osztály tartalmazhat példányváltozókat, amik a típus objektumainak állapotát tárolják, és rutinokat, amik az objektum metódusait implementálják. Az osztály tartalmazhatja privát (private) metódusok implementációját is, amik külső kódból nem elérhetők, viszont az osztály objektumai használhatják.

Egy osztály öröklődhet egy ősosztályból. Az alosztály objektumai tartalmazzák az ősosztály változóit és metódusait. Az ősosztály metódusait át lehet nevezni az alosztályban. Az alosztály kódjából nem érhetjük el az ősosztálytól örökölt változókat közvetlenül, ehelyett az ősosztály metódusait kell használni.

Az osztály definíciója megmondja, hogy melyik alosztályok engedélyezettek, és ha igen, melyik metódusok és rutinok használhatók. Egy speciális operátor (_maker_) exportálható, így az alosztályok inicializálni tudják az örökölt változókat. A privát metódusokon kívül minden metódus exportálható, és a publikus metódusok elrejthetők. Ez a mechanizmus megengedi a felhasználónak gazdag interfész létrehozását az alosztályhoz, anélkül, hogy az ősosztály objektuma sérüljön.

Modulok

Az osztály és rutin implementációkat modulokban helyezhetjük el. Minden modul egy vagy több specifikációt implementál. Például egy szokásos modul egy osztályt tartalmaz, ami egy típust implementál, és olyan rutinok implementációit, melyek az adott típushoz tartozó objektumot hoznak létre.

A modul beágyazza a tartalmazott kódot; a tartalmazott osztály részletei csak a modulbeli kódok számára látható. Azonban ezek a részletek a modulon belül teljesen védtelenek. Ezáltal egy modulbeli rutin implementációjában teljesen hozzáférünk egy ezen modulbeli osztály belső részleteihez. Hasonlóan a modulbeli osztályok is hasznot húzhatnak abból, hogy hozzáférnek ugyanazon modulbeli más osztály minden részletéhez.

Paraméter polimorfizmus

Az altípus polimorfizmuson felül a Theta támogatja a paraméter polimorfizmust is, azaz minden rutin, típus vagy osztály definíció paraméterezhető egy vagy több típussal. A paraméter polimorfizmus megengedi, hogy az aktuális típus paramétert a felhasználó adja meg, mikor a típust vagy rutint példányosítja. Például az "array" (tömb) egy paraméterezhető típus, példányosításai: "array[int]", "array[char]", stb.

A paraméterekre megszorításokat tehetünk, azaz megadhatjuk, hogy a példányosító típusnak milyen metódussal, és ennek milyen szignatúrával kell rendelkeznie. Ezek a megszorítások lehetővé teszik, hogy a kódot anélkül fordítsuk, hogy ismernénk az aktuális példányosító típust. Az általános kódot csak egyszer kell fordítani.

Az altípus polimorfizmus előnye, hogy könnyen definiálhatjuk összefüggő típusok általános tulajdonságait, míg a paraméter polimorfizmus segítségével általános viselkedéseket fogalmazhatunk meg, a típushierarchiától függetlenül.

Programok

A Theta programok programegységek (program unit) csoportjaiból állnak. A programegység egy specifikáció, egy értékadás (equate) vagy egy modul. A specifikációk absztrakt típusokat és rutinokat specifikálnak, a modulok ezek implementációit tartalmazzák. Az értékadások lehetővé teszik a konstansok rövidítését, például "pi" jelentheti a 3.1416 értéket.

A programegységben külső neveket (external names) használunk, hogy hivatkozzunk egy specifikációra vagy értékadásra. A külső neveket lokálisan választhatjuk, megfelelően az őt használó unit-oknak, ez biztosítja, hogy különböző unit-ok definiálhatnak elemeket ugyanazon a néven, anélkül, hogy globális konfliktust okoznának a nevek terén. Például két különböző specifikáció definiálhat egy-egy típust "int_set" néven.