Prolog 데이터 크기 조정

Prolog 데이터 크기 조정

GNU Prolog는 Prolog 프로그램을 실행할 때 여러 스택을 사용해요. 각 스택은 정적 크기를 가지며 실행 중에 동적으로 늘릴 수 없어요.

출처: GNU Prolog Manual - Adjusting the size of Prolog data

본문

GNU Prolog는 Prolog 프로그램을 실행할 때 여러 스택을 사용해요. 각 스택은 정적 크기를 가지며 실행 중에 동적으로 늘릴 수 없어요. 각 스택마다 기본 크기가 있지만, 사용자는 환경 변수를 설정해 새 크기를 정의할 수 있어요. GNU Prolog 프로그램이 실행되면 먼저 이 변수들을 조사하고, 정의되어 있지 않으면 기본 크기를 사용해요.

다음 표는 각 GNU Prolog 스택의 기본 크기와 관련 환경 변수 이름을 보여줘요. 버전 1.4.2부터 원자 테이블(모든 원자를 기록하는 테이블)의 크기도 스택과 유사하게 관리돼요. 그래서 다음 표에 함께 들어 있어요(실제로는 스택이 아니라 해시 테이블이지만). 이 표에서 관련 이름은 statistics(8.24.1절)에서 키로 쓰는 atoms예요. 환경 변수 이름은 해당 Prolog 플래그 max_atom에서 파생돼요(8.22.1절).

스택 이름 기본 크기(Kb) 환경 변수 설명
local 16384 LOCALSZ 제어 스택(환경과 선택점 choice-point)
global 32768 GLOBALSZ 힙(복합 항)
trail 16384 TRAILSZ 조건부 바인딩(백트래킹에서 되돌릴 바인딩)
cstr 16384 CSTRSZ 유한 도메인 제약 스택(FD 변수와 제약)
atoms 32768 MAX_ATOM 원자 테이블

추가로 Windows에서는(버전 1.4.0부터) 레지스트리 키를 참조해요(키 이름은 환경 변수 이름과 같아요). 키는 HKEY_CURRENT_USER\Software\GnuProlog\에 저장돼요.

스택의 크기가 너무 작으면 실행 중에 오버플로(overflow)가 발생해요. 이 경우 GNU Prolog는 멈추기 전에 다음 오류 메시지를 출력해요:

S stack overflow (size: N Kb, environment variable used: E)

여기서 S는 스택 이름, N은 현재 스택 크기(Kb), E는 관련 환경 변수 이름이에요. 이런 메시지가 나오면 변수 E를 새 크기로 (재)정의할 수 있어요. 예를 들어 Unix 셸에서 local 스택에 32768 Kb를 할당하려면:

LOCALSZ=32768; export LOCALSZ   (sh 또는 bash에서)
setenv LOCALSZ 32768            (csh 또는 tcsh에서)

이 방법으로 사용자는 Prolog 스택의 크기를 조정할 수 있어요. 그러나 어떤 경우에는 사용자가 이 크기를 수정하지 못하게 하는 것이 더 좋을 때가 있어요. 예를 들어 실행 환경과 무관하게 동작해야 하는 스탠드얼론 실행 파일을 만들 때예요. 이 경우 프로그램은 환경 변수를 조사하면 안 되고, 프로그래머가 새 기본 스택 크기를 정의할 수 있어야 해요. GNU Prolog 컴파일러는 --local-size--fixed-sizes 같은 여러 명령행 옵션을 통해 이런 기능을 제공해요(4.4.3절).

마지막으로 GNU Prolog 스택은 가상으로 할당된다는 점(즉 가상 메모리를 사용)을 기억하세요. 즉 물리 메모리 페이지는 필요할 때(읽기/쓰기 시도가 있을 때)에만 할당돼요. 따라서 매우 큰 스택을 정의하는 것이 가능해요. 실행 시에는 필요한 양만큼만 물리적으로 할당돼요.

더 알아보기