Warren Abstract Machine - Warren Abstract Machine
W 1983 roku David HD Warren zaprojektował abstrakcyjne maszynę za wykonanie Prolog składającej się z pamięci architektury oraz zestaw instrukcji . Ten projekt stał się znany jako Warren Streszczenie Maszynie (WAM) i stał się de facto standardem celem prologowych kompilatorów .
Zawartość
Cel, powód
Celem kompilacji kodu Prolog do bardziej niskopoziomowego kodu WAM jest, aby późniejsza interpretacja programu Prolog bardziej wydajne. Kod Prolog jest stosunkowo łatwy do przetłumaczenia instrukcji WAM, które mogą być bardziej efektywnie interpretowane. Również późniejsze ulepszenia kodu i kompilacji do kodu są często łatwiejsze do wykonania na więcej reprezentacji niskiego poziomu.
Aby pisać wydajne programy prolog, podstawowe zrozumienie, w jaki sposób działa WAM może być korzystne. Niektóre z najważniejszych pojęć WAM są indeksowanie pierwszy argument i jego relacji do wyboru punktów, optymalizacja połączenia ogon i rekultywacji pamięci na niepowodzenie.
obszary pamięci
WAM ma następujące obszary pamięci:
- Globalny stos lub sterty , używane do przechowywania nazw złożonych
- Lokalny stos dla ram środowiskowych i wybór punktów
- Szlak do rekordu, które zmienne Wiązania powinny być cofnięte na backtracking
Przykład
Oto fragment kodu Prolog:
girl(sally).
girl(jane).
boy(B) :- \+ girl(B).
WAM oparte Prolog kompilator skompiluje to w instrukcji WAM podobnych do następujących:
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)])
Ważną cechą tego kodu jest jego zdolność do radzenia sobie z różnymi trybami, w którym predykaty mogą być wywołane: dowolny argumentem może być zmienna, termin grunt lub częściowo wystąpienia termin. „Przełącznik” instrukcje obsługi różnych przypadków.