Az Emerald programozási nyelv

Objektumok

Az Emeraldban az objektum az adat és a típus absztrakciója. Minden, a legkisebb entitásoktól(Boolean vagy Integer) a legnagyobbakig( mint például az egész fájlrendszer) egy objektum. Az Emerald objektum privát adatokból, privát operációkból és publikus operációkból áll. Egy objektum teljes mértékben felelős a saját viselkedéséért és mindent tartalmaznia kell ahhoz, hogy támogassa ezt a viselkedést. Ezt a tulajdonságot autonómiának nevezzük. Az objektum-autonómia, melyet az osztott környezetbeli mobilitás-autonómia motivált, a moduláris megközelítésű programtervezést is támogatja. Egy objektumot csak a publikus operációin keresztül érhetünk el, ezt Emeraldban az invokáció segítségével tehetjük meg. Egy Emerald objektum hívhat(invokálhat) egy másik objektumban definiált operációt, megadhatja annak argumentumait és megkaphatja annak eredményét. Az invokációk a tradicionális nyelvekbeli eljárásoknak, illetve a Smalltalk-beli üzeneteknek felelnek meg.

Objektumok létrehozása

A legtöbb objektum-alapú nyelvben egy objektum létrehozása egy osztály objektumának egy operációjának meghívásával történik. A Smalltalk és az Eiffel erre példa. Az osztály objektumnak több függvénye van: definiál egy struktúrát, interfészt és viselkedést mely minden példányára vonatkozik. Ezáltal meghatározza a példányok helyét az osztályok gráfjában. A prototípus alapú nyelvekben, mint amilyen a Self, az objektumok klónozódnak létező objektumokból. Az Emeraldban az objektumok létrejötte az objektum konstruktoron keresztül történik. Egy Emerald kifejezés, amikor kiértékelődik egy új objektumot hoz létre. Ez a kifejezés határozza meg az objektum reprezentációját, publikus és privát operációit. Egy objektum addig létezik, amíg lehet rá hivatkozni.
Egy Emerald objektum a következőkből áll:
- név vagy azonosító, mely egyértelműen azonosítja az objektumot.
- reprezentáció, mely tartalmazhat más objektumokra vonatkozó referenciákat.
- operációk halmaza, mely definiálja azokat a függvényeket, eljárásokat melyet az objektum végre tud hajtani. Az exportált operációkat más objektumok hívhatják, a többiek privátok.
- egy opcionális processzus, mely az objektum létrejötte után kezdődik, és az objektum operációinak hívásával párhuzamosan fut. A processzus nélküli objektum passzív és csak más objektumok hívását hajtja végre, míg egy processzussal rendelkező objektum aktív és a többi objektumtól függetlenül is tevékenykedik.
Minden objektumnak van még két további attribútuma is. Egy objektum lokációja specifikálja azt a csomópontot, amelyen az objektum éppen elhelyezkedik.
Egy objektumot definiálhatunk immutable tulajdonságúnak is, mely azt jelenti, hogy az objektum nem változik a létezése alatt.
Minden objektumnak van egy inicializáló szekciója, mely egy paraméter nélküli operáció, mely az objektum keletkezésekor hajtódik végre, és az objektum állapotának az inicializálására való. Mikor az inicializáló operáció befejeződött, az objektum processzusa elkezdődik és az objektum kész lesz arra, hogy hívásokat fogadjon.

Invokáció

Az objektumok közötti kommunikáció egyetlen módja az Emeraldban az invokáció. Egy Emerald objektum hívhat egy másik objektumban definiált operációt, megadhatja annak argumentumait és megkaphatja annak eredményét. Tegyük fel, hogy a target egy objektum referenciát jelöl, akkor a hívás a következőképpen néz ki:

target.operationName[argumnet1, argument2] 
Az invokáció szinkronizált, azaz a hívó processzus felfüggesztődik, amíg az operáció véget ér, vagy a futásidejű rendszer megállapítja, hogy az operációt nem lehet befejezni. Minden argumentum és eredmény objektum-referencia szerint adódik át, tehát a hívó és a hívott osztozik az argumentum objektumok referenciáin.

Objektum konstruktorok

	objectConstructor ::= 	[immutable] object identifier
					{declaration}
					[monitor|initially]
					{operation}
					[process]
				end identifier
	monitor		::= 	monitor
					{declaration}
					{operation}
					[initially]
					[recovery]
				end monitor
	process		::=	process
					blockBody
				end process
	initially	::=	initially
					blockBody
				end initially
	recovery	::=	recovery
					blockBody
				end recovery

Objektumok mint típusok

	immutable type AbstractType
		function getSignature -> [Signature]
	end AbstractType