Máquina abstracta de Warren - Warren Abstract Machine

En 1983, David HD Warren diseñó una máquina abstracta para la ejecución de Prolog que constaba de una arquitectura de memoria y un conjunto de instrucciones . Este diseño se conoció como Warren Abstract Machine (WAM) y se ha convertido en el objetivo estándar de facto para los compiladores de Prolog .

Propósito

El propósito de compilar el código de Prolog en el código WAM de nivel más bajo es hacer que la interpretación posterior del programa Prolog sea más eficiente. El código de Prolog es razonablemente fácil de traducir a instrucciones WAM, que se pueden interpretar de manera más eficiente. Además, las mejoras de código posteriores y las compilaciones de código nativo suelen ser más fáciles de realizar en la representación de nivel más bajo.

Para escribir programas Prolog eficientes, una comprensión básica de cómo funciona el WAM puede resultar ventajoso. Algunos de los conceptos de WAM más importantes son la indexación del primer argumento y su relación con los puntos de elección, la optimización de la llamada de cola y la recuperación de memoria en caso de falla.

Áreas de memoria

El WAM tiene las siguientes áreas de memoria:

  • La pila o montón global , que se utiliza para almacenar términos compuestos.
  • La pila local para marcos de entorno y puntos de elección
  • El camino para registrar qué vinculaciones de variables deben deshacerse al retroceder

Ejemplo

Aquí hay un fragmento de código de Prolog:

 girl(sally).
 girl(jane).
 
 boy(B) :- \+ girl(B).

Un compilador de Prolog basado en WAM lo compilará en instrucciones WAM similares a las siguientes:

 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)])

Una característica importante de este código es su capacidad para hacer frente a los diversos modos en los que se pueden evocar los predicados: cualquier argumento puede ser una variable, un término básico o un término parcialmente instanciado. Las instrucciones de "cambio" manejan los diferentes casos.

Referencias