Maszyna abstrakcyjna Warrena
W 1983 roku David HD Warren zaprojektował abstrakcyjną maszynę do wykonywania Prologu , składającą się z architektury pamięci i zestawu instrukcji . Ten projekt stał się znany jako Warren Abstract Machine (WAM) i stał się de facto standardowym celem dla kompilatorów Prologu .
Zamiar
Celem kompilacji kodu Prologu do kodu WAM niższego poziomu jest zwiększenie wydajności późniejszej interpretacji programu Prologu. Kod Prologu jest stosunkowo łatwy do przetłumaczenia na instrukcje WAM, które mogą być wydajniej interpretowane. Ponadto późniejsze ulepszenia kodu i kompilacje kodu natywnego są często łatwiejsze do wykonania na reprezentacji niższego poziomu.
Aby pisać wydajne programy Prologu, podstawowa wiedza o tym, jak działa WAM, może być korzystna. Niektóre z najważniejszych koncepcji WAM to indeksowanie pierwszego argumentu i jego związek z punktami wyboru, optymalizacja wywołania ogona i odzyskiwanie pamięci w przypadku awarii.
Obszary pamięci
WAM ma następujące obszary pamięci:
- Globalny stos lub sterta używany do przechowywania terminów złożonych
- Stos lokalny dla ramek środowiskowych i punktów wyboru
- Ścieżka do rejestrowania, które powiązania zmiennych powinny zostać cofnięte podczas cofania
Przykład
Oto fragment kodu Prologu:
dziewczyna ( Sally ). dziewczyna ( jan ). chłopiec ( B ) :- \+ dziewczyna ( B ).
Kompilator Prologu oparty na WAM skompiluje to w instrukcje WAM podobne do poniższych:
predykat ( dziewczyna / 1 ) : switch_on_term ( 2 , 1 , fail , fail , fail ), label ( 1 ) : switch_on_atom ([( sally , 3 ), ( jane , 5 )]) label ( 2 ) : try_me_else ( 4 ) etykieta ( 3 ) 0
0
0
0 : get_atom ( sally , ) kontynuuj etykietę ( 4 ) : trust_me_else_fail label ( 5 ) : get_atom ( jane , ) kontynuuj predykat ( chłopiec / 1 ) : get_variable ( x ( 1 ), ) put_structure ( dziewczyna / 1 , )
unify_local_value ( x ( 1 )) wykonaj (( \+ ) / 1 )])
Ważną cechą tego kodu jest jego zdolność do radzenia sobie z różnymi trybami, w których można wywołać predykaty: dowolny argument może być zmienną, terminem podstawowym lub terminem częściowo utworzonym. Instrukcje „przełączenia” obsługują różne przypadki.