[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

14. Frozen 상태로 빠른 속도로 로딩하기

가끔 비교적 큰 m4 응용 프로그램들은 수천개의 기본적인 정의와 다른 값비싼 초기화를 필요로 할 때가 있다.

큰 프로그램에서의 공통되는 기본적인 것들을 읽을 때 매번 같은 것을 반복한 다면 그것은 시간의 낭비다. GNU m4는 하나의 응용프로그램의 시작부분에서 공통적이고 기본적인 것들을 사용하여 속도의 향상을 꾀하는 장치를 제공한다. 사용자가 반복적으로 사용한다고 가정해보자.

 
m4 base.m4 input.m4

`base.m4'에는 고정적인 내용을 담고, `input.m4'에는 가변적인 내용을 담으면 좋다.

 
m4 -F base.m4f base.m4

처음에 한번 위와 같이 실행시키고, 이후에는

 
m4 -R base.m4f input.m4

이렇게 가변적인 내용으로 실행시킨다. 처음 호출에서 -F 옵션은 `base.m4'를 읽어서 실행시켜서, 다양한 응용 프로그램에서의 매크로를 정의하거나 다른 초기 화를 계산한다. 단지 한 번만 `base.m4'는 완전하게 처리된다. GNU m4`base.m4f'frozen 파일을 생성하는데, 이것은 m4의 내부상태를 담은 스탭샷의 한종류를 포함하고 있다.

나중의 호출은 -R 옵션을 포함함으로써 m4의 메모리 내부 상태를 `base.m4f'로 부터 다시 로드할 수 있다. 다른 파일도 물론 읽어들일 수 있다. 이 말은 m4 의 초기버젼과는 달리 이전에 실행된 효과를 재발견한 후에 m4는 입력을 읽어 들일 것이다. 우리의 예에서는, 그 효과는 `base.m4'와 동일하다. 그러나 frozen 파일은 이것보다 훨씬 효과가 빠르기 미친다.

m4를 실행할 때 한 번에 하나만의 frozen 파일을 만들거나 읽어들일 수 있다. 두 개의 frozen 파일을 한꺼번에 처리하는 것은 불가능하다. 그러나 frozen 파일 이 갱신되어서 증가하였다면 -R-F 옵션을 이용하여 동시에 사용할 수 있다. 예를 든다면, 조심스럽게 다음의 명령을 내린다고 가정하자.

 
m4 file1.m4 file2.m4 file3.m4 file4.m4

이것은 다음과 같이 쪼개진 명령으로 되는 것과 같으며, 출력도 동일하다.

 
m4 -F file1.m4f file1.m4
m4 -R file1.m4f -F file2.m4f file2.m4
m4 -R file2.m4f -F file3.m4f file3.m4
m4 -R file3.m4f file4.m4

이 한 번의 명령으로 그동안 만들어 둔 것이 수포로 돌아갈 수도 있으므로 조 금의 주의가 필요하다. 특수하게 추적(trace) 속성 매크로는 현재 changeword가 세팅되어 있지 않다면 취급할 수 없다. 한 번의 호출에서 이러한 옵션의 상호작 용은 아직 충분히 분석되지 않을 것이다. 그러나 pushdef된 스택에 있는 정의는 바르게 핸들할 수 있다. 그래서 undefine되거나 내장매크로로 이름이 바뀐 것은 인용문자나 주석 문자열을 변경한다.

m4가 frozen 을 실행할 때, 실행의 끝에서 작동하는 자동적인 전환되돌려 놓 기(undiversion)는 억제된다. 대신에, 명확하게 번호가 붙여진 모든 전환들은 frozen 파일로 저장된다. 활성화된 전환번호도 전송된다.

다시 로드할 frozen 파일은 꼭 현재 작업디렉토리에 있어야 할 필요는 없다. 파 일을 include 할 때와 똑같은 방법으로 경로를 검색한다 (see section 삽입할 파일 검색하기).

frozen 파일은 아키텍쳐를 건너뛰어서 공유가 가능하다. 하나의 머쉰에서 frozen 파일을 알아볼 수 있도록 쓰고, 다른 머쉰에서 같은 m4를 사용하거나, GNU m4의 새로운 버전을 사용한다면 그것을 읽어서 처리하는 것이 가능하다. frozen 파일은 편집이 가능한 텍스트 파일이며, 여러개의 지시자로 구성되어 있 다. 각각의 시작은 대문자로 되어 있으며 뉴라인(NL)으로 끝난다. 지시자가 있어 야 할 어느곳이나 # 문자는 주석을 만든다. 빈줄은 또한 무시된다. 아래의 설명에 서, length는 대응하는 string의 길이이다. 숫자는 10진수로 표시한다. 지시자들은 다음과 같다.

V number NL

파일의 포맷을 확인한다. number 은 1이어야 한다.

C length1 , length2 NL string1 string2 NL

string1string2를 각각 주석의 시작과 끝 문자열로 사용한다.

Q length1 , length2 NL string1 string2 NL

string1string2를 인용구의 시작과 끝문자열로 사용한다.

F length1 , length2 NL string1 string2 NL

string1을 내장 명칭인 string2 함수로 pushdef를 사용하여 정의하며 확장한다.

T length1 , length2 NL string1 string2 NL

string1을 텍스트 string2pushdef를 사용하여 정의하며 확장한다.

D number, length NL string NL

현재의 전환의 전환번호를 선택한다. 그리고 현재의 전환으로 string을 복사한다. 존재하지 않는 전환에는 number이 음수가 될 것이다. 단순하게 활성화 번호만 선택한다면, 빈 string을 사용한다. 전환번호가 0 이면 그 문자열은 재로드 될 때 표준출력으로 보내진다. 그러나 이것은 m4 내부에서는 보내지지 못한다.


[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

This document was generated by Autobuild on March, 29 2007 using texi2html 1.76.