Warren absztrakt gép - Warren Abstract Machine
1983-ban David HD Warren egy absztrakt gépet tervezett a Prolog végrehajtására, amely memória- architektúrát és utasításkészletet tartalmaz . Ez a terv a Warren Abstract Machine (WAM) néven vált ismertté, és a Prolog fordítóinak tényleges standard célpontjává vált .
tartalom
Célja
A Prolog-kódnak az alacsonyabb szintű WAM-kódhoz történő fordításának célja a Prolog-program későbbi értelmezésének hatékonyabbá tétele. A Prolog kódot meglehetősen könnyű lefordítani a WAM utasításokra, amelyek hatékonyabban értelmezhetők. Ezenkívül a későbbi kódjavításokat és a natív kódokká történő összeállítást gyakran könnyebb elvégezni az alacsonyabb szintű ábrázolásnál.
A hatékony Prolog programok írása érdekében előnyös lehet a WAM működésének alapvető ismerete. A WAM-fogalmak néhány fontos eleme az első argumentumindexálás és a választási pontokhoz való kapcsolódása, a farokhívás optimalizálása és a memória helyreállítása hiba esetén.
Memóriaterületek
A WAM a következő memóriaterületekkel rendelkezik:
- Az összetett kifejezések tárolására használt globális verem vagy halom
- A helyi verem környezetvédelmi keretek és választási pontok
- A visszatekintéskor le kell vonni azt a nyomkövetést , amely rögzíti a kötődő változókat
Példa
Itt van egy darab Prolog-kód:
girl(sally).
girl(jane).
boy(B) :- \+ girl(B).
A WAM-alapú Prolog fordító ezt összeállítja a következő WAM utasításokba:
predicate(girl/1):
switch_on_term(2,1,fail,fail,fail),
label(1): switch_on_atom([(sally,3),(jane,5)])
label(2): try_me_else(4)
label(3): get_atom(sally,0)
proceed
label(4): trust_me_else_fail
label(5): get_atom(jane,0)
proceed
predicate(boy/1):
get_variable(x(1),0)
put_structure(girl/1,0)
unify_local_value(x(1))
execute((\+)/1)])
Ennek a kódnak a fontos jellemzője, hogy képes megbirkózni a predikációk előidézésének különböző módjaival: Bármely érv lehet változó, földi kifejezés vagy részben aktualizált kifejezés. A "kapcsoló" utasítások kezelik a különféle eseteket.