Een Warren Abstract Machine ofwel WAM is een virtuele machine gericht op de taal Prolog en bestaat uit een geheugenmodel en een instructieset. Momenteel is het een de-facto standaard voor Prolog-compilers. Omdat deze architectuur de mogelijkheid biedt Prologprogramma's naar een low-level bytecode of machinetaal te compileren helpt het de Prolog-code efficiënter uit te voeren en maakt het echte Prologcompilers mogelijk. Warren voorziet in zijn publicatie zelfs een gespecialiseerde Prolog-processor.
Een Prologterm wordt in een WAM gerepresenteerd door een tag gevolgd door een waarde. De tag wordt gebruikt om het type van de term te identificeren. Types zijn normaliter:
Structuren en lijsten worden hierbij niet gedeeld, maar in hun geheel gekopieerd.
De Warren Abstract Machine verdeelt de beschikbare geheugenruimte op in vier delen:
De huidige toestand van het Prolog-programma wordt weergegeven in een aantal registers:
Register | doel | wijst naar |
---|---|---|
P | Programmateller | Code ruimte |
CP | Voortzetting (continuation) | Code ruimte |
E | Laatste omgeving (environment) | local stack |
B | Laatste keuzepunt (backtracking) | local stack |
A | Top van de lokale stack | |
TR | Top van de trail-stack | |
H | Top van de heap | |
HB | Top van de heap voor het laatste keuzepunt | |
S | Structure Pointer | |
A1, A2 .. An | Argumenten | heap |
X1, X2 .. Xn | Lokale variabelen |
De instructieset van de WAM kan worden onderverdeeld in vijf categorieën:
Instructies bestaan uit een opcode gevolgd door 0, 1 of 2 argumenten. Een argument kan 1, 2 of 4 bytes lang zijn.