[ < ] [ > ]   [ << ] [ 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 September 28, 2013 using texi2html 1.82.