워렌 추상 기계
Warren Abstract Machine1983년 David H. D. Warren은 메모리 아키텍처와 명령어 [1][2][3]세트로 구성된 프롤로그 실행을 위한 추상 기계를 설계했습니다.이 설계는 WAM(Warren Abstract Machine)으로 알려지게 되었고 Prolog 컴파일러의 사실상의 표준 타깃이 되었습니다.
목적
Prolog 코드를 보다 낮은 수준의 WAM 코드로 컴파일하는 목적은 Prolog 프로그램을 보다 효율적으로 해석하는 것입니다.프롤로그 코드는 WAM 명령어로 쉽게 변환할 수 있으므로 보다 효율적으로 해석할 수 있습니다.또한 후속 코드 개선 및 네이티브 코드의 컴파일은 낮은 수준의 표현에서 수행하기가 더 쉽습니다.
효율적인 프롤로그 프로그램을 작성하려면 WAM의 구조를 기본적으로 이해하는 것이 좋습니다.WAM의 가장 중요한 개념으로는 첫 번째 인수 인덱싱과 선택 포인트, 테일콜 최적화 및 장애 시 메모리 재확보와의 관련성이 있습니다.
메모리 영역
WAM에는 다음 메모리 영역이 있습니다.
- 복합 용어를 저장하는 데 사용되는 전역 스택 또는 힙
- 환경 프레임 및 선택 포인트의 로컬 스택
- 역추적 시 해제해야 하는 변수 바인딩을 기록하는 추적
예
다음은 프롤로그 코드입니다.
소녀.(샐리). 소녀.(제인.). 소년(B) :- \+ 소녀.(B).
WAM 기반의 Prolog 컴파일러는 이를 다음과 같은 WAM 명령으로 컴파일합니다.
술어(소녀./1): switch_on_term(2,1,실패하다,실패하다,실패하다), 라벨.(1): switch_on_atom([(샐리,3),(제인.,5)]) 라벨.(2): try_me_me_module(실행)(4) 라벨.(3): get_atom(샐리,0) 진행하다 라벨.(4): trust_me_fail 라벨.(5): get_atom(제인.,0) 진행하다 술어(소년/1): get_filength(가져오기)(x(1),0) put_internals(풋)_internals(스위치(소녀./1,0) unified_local_value(x(1)) 실행하다((\+)/1)])
이 코드의 중요한 특징은 술어가 발생할 수 있는 다양한 모드(변수, 기본항 또는 부분적으로 인스턴스화된 항)에 대응하는 능력입니다.「스위치」지시는, 다양한 케이스를 취급합니다.
레퍼런스
- ^ David H. D. Warren (October 1983). An abstract Prolog instruction set (PDF). Menlo Park, CA, USA: Artificial Intelligence Center at SRI International. Archived (PDF) from the original on 2022-06-19.
- ^ Hassan Aït-Kaci (February 18, 1999). Warren's Abstract Machine: A Tutorial Reconstruction (PDF). Archived from the original on 2003-02-13.
{{cite book}}
: CS1 유지보수: 부적합한 URL(링크) - ^ Hassan Aït-Kaci. "Warren's Abstract Machine: A Tutorial Reconstruction; the book, errata and slides". Retrieved 7 March 2011.