[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
첫장에서는 GNU m4
가 무엇이고 어디서부터 유래가 되었는지와 이
문서의 활용법, m4
프로그램의 호출법, 및 버그 보고 방법에 대해서
설명한다. 아울러 매뉴얼의 나머지 부분을 읽는 방법에 대한 팁을
제공하면서 마무리한다.
이후의 장들은 m4
언어의 모든 자세한 특징들을 기술할 것이다.
1.1 m4 의 개요 | ||
1.2 역사적인 참고사항들 | ||
1.3 m4 를 부르기 | ||
1.4 문제점과 버그 | ||
1.5 이 매뉴얼의 사용 |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
m4
의 개요m4
는 표준입력에서 읽어서 표준출력으로 매크로를 확장하는 매크로
처리기이다. 매크로는 내장되어 있거나 사용자가 정의를 할 수 있다. 또한
넘겨주는 인자의 수에도 제한이 없다. m4
는 매크로 확장만을 하는
것이 아니라 파일을 삽입하 거나 UNIX 명령을 실행한다던지, 정수 계산,
문서를 처리하는 것을 재귀적인 방법 등 여러가지 방법으로 할 수 있는 내장
함수를 가지고 있다. m4
는 컴파일러의 사전준비 작업에 사용되거나
하나의 독립적인 매크로 처리기로 사용될 수 있을 것이다.
매크로 처리기 m4
는 모든 UNIX에서 폭넓게 사용이 가능하다. 보통,
소수의 사용자만이 m4
의 존재를 알고 있다. 그러나 m4에 한 번 맛을
들이면 헤어나올 수 가 없을 것이다. GNU Autoconf의 인기가 높아질수록
‘configure’ 스크립트를 만드는 데 미리 요구되는 GNU
m4
는 m4
를 설치하도록 하는 자극제로 되고 있다. 그러한
사람들은 보통 m4로 프로그래밍 하는 데는 익숙치 않을 것이다. GNU m4는
대부분 System V, 릴리즈 3 버전과 몇가지 사소한 것만 빼고는 대부분
호환된다. 더 자세한 내용은 See section m4
의 다른 버전들과의 호환성.
몇몇 사람들은 m4
에서 중독성을 발견한다. 처음에 사람들은
m4
를 간단한 문제 해결에 사용한다. 그러다가 점점 더 큰 문제에
도전을 하면서 복합 m4
매크로 세트를 사용하는 방법에 대해서
배운다. 정말 한 번 중독되어 버리면 간단한 문제도 매우 복잡하게
m4
어플리케이션을 작성하는 경우가 많다. 그럴땐 정말 만드느 라
작업한 시간보다 디버깅에 바치는 시간이 더 많아 지기도 한다. m4
는
프로그래머의 건강에 치명적인 해악을 미친다는 것을 명심해 두자.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
m4의 역사에 관련된 내용은 여기에 온전하게 싣지 않았고, 믿을만한 내용이 없다. 혹시 이에 대한 내용을 알고 있는 분은 이 부분을 쓸 수 있도록 도움을 주기 바란다.
m4
의 중요한 조상은 GPM
이다. C. Stratche의 “A General
Purpose Macro generator”, Computer Journal 8,3 (1965), 255쪽을 보기
바란다.
David Cries 는 GPM
을 "디지털 컴퓨터의 컴파일러 생성자(Compiler
Construction for Digital Computers)"라고 일컫었다.
GPM
이 순수했다면, m4
는 실제에서 부딪히는 복잡한
많은 문제들을 다루는 것이였다. 매크로는 이전의 주석을 인식하고,
공백문자나 라인의 끝(end-of-line)을 쉽게 건너뛸 수 있었으며, 많은
생성자들을 내장하고 있었다.
원래는 m4
가 cpp
와 동등한 ratfor
인, 포트란
전처리기의 엔진이였다.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
m4
를 부르기m4
의 명령 포맷은 다음과 같다.
|
모든 옵션은 ‘-’로 시작하거나 긴 옵션이름을 ‘--’ 다음에 사용할
수 있다. 긴 옵션이름은 완전하게 쓸 필요는 없다. 명확한 접두어로
충분하다. m4
는 다음의 옵션을 사용할 수 있다.
--version
프로그램의 버전 번호를 출력한다.
--help
자세한 도움말을 출력한다.
-G
--traditional
System V 와 비교하여 확장된 모든 기능을 억제한다. 이 기능들의 목록을
보려면 See section m4
의 다른 버전들과의 호환성.
-E
--fatal-warnings
경고가 한번이라도 나오면 치명적인 것으로 간주하고, 즉각 실행을 멈추고 종료한다.
-dflags
-debug=flags
디버깅 수준 플래그를 flags
로 세팅한다. 디버깅 수준은 디버깅 기능에
의해 제공되는 정보의 양과 형식을 제어한다. flags의 형식과 뜻에
대해서 See section 디버깅 출력을 제어하기.
-lnum
--arglength=num
매크로 추적에 의해 생성되는 출력의 크기를 제한한다. See section 디버깅 출력을 제어하기.
-ofile
--error-output=file
디버깅과 추적시의 출력을 파일로 하도록 한다. 에러메시지는 그대로 표준에러출력에 찍힌다. See section 디버깅 출력을 저장하기.
-Idir
--include=dir
현재의 작업 디렉토리에서 삽입할 파일이 보이지 않을 경우에 검색할 경로를 dir로 지정한다.
-e
--interactive
m4
를 대화식으로 호출한다. 이 의미는 모든 출력은 버퍼링되지 않고,
인터럽트는 무시된다는 것이다.
-s
--synclines
동시성(synchronisation) 라인을 생성한다. 이것은 C 전처리기나 다른
비슷한 툴에 의해 사용된다. 이것은 m4
가 컴파일러의 착수준비용
(front-end)으로 사용될 때 곧 잘 쓰인다. 소스파일이름과 라인 번호 정보는
‘#line linenum "filename"’ 형식으로 지시자에 의해
전달된다. 이것은 필요하다면 입력의 중간에 끼워넣어진다. 그러한
지시자는 다음의 라인에 서 시작된다는 것을 알린다거나 입력 파일
filename 의 라인 linenum의 속 내용으로 확장된다는 것을
의미한다. ‘"filename"’ 부분은 이전의 지 시자로부터
파일이름이 바뀌지 않았을 때 생략되기도 한다.
동시성(Synchronisation) 지시자는 지시자 각각 마다 완전한 라인으로 주어진다. 동시성의 불일치가 입력라인의 중간에서 발생한다면 연합된(associated) 동시성 지시자는 다음의 라인 생성이 시작될 때까지 지연된다.
-P
--prefix-builtins
내부적으로 모든 내장매크로의 명칭을 앞에 ‘m4_’로 시작하도록 변경한다. 예를 들면, 이 옵션을 사용한다면, ‘define’ 대신 ‘m4_define’ 으로 사 용해야 한다. 그리고 ‘__file__’ 대신 ‘m4__file__’로 사용해야 한다.
-WREGEXP
--word-regexp=REGEXP
매크로 이름에서 문법을 변경한다. 이 시험적인 옵션은 모든 GNU m4
에서 다 지원하는 것은 아니다. (see section 단어의 어휘 구조 바꾸기).
-Hn
--hashsize=n
내부적으로 심볼을 찾기위한 해쉬(hash) 테이블의 개수를 n개 entry 크기로 만든다. 이 숫자가 첫 번째로 유효하다. 기본값은 509 엔트리이다. 이 정도면 여러 분들이 과도한 숫자의 매크로를 정의하지 않는다면 충분한 크기이다.
-Ln
--nesting-limit=n
내장된(nesting) 매크로 호출을 n 레벨로 인위적으로 제한한다. 만일 이 제한이 넘어갔을 시에는 프로그램 실행을 중지한다. 특별히 명시되지 않으면 제한된 nesting 은 250 레벨이다.
이 옵션의 정확한 영향은 동적인 재귀보다는 문자그대로의 nesting 과 좀 더 결합될 것이다. 이것은 기계적인 의미에 의해 생성된 어떤 복합적인 m4 입력이 있을 때 유용할 것이다. 대부분의 사용자에게는 별 의미없는 옵션이 될 것이다. 눈에 거슬리게 느껴 진다면 (아직 실험적인) 이 옵션은 없어질 지도 모른다.
이 옵션은 많은 메모리나 스택을 소비하지 않지만 루프를 끊임없이 회전하면서
지 모르는 것을 멈추게 할 수 있는 능력은 없다.
영리하게 재검색하는 반복을 사용해서, 어떤 이는 복잡하고, 시간이 걸리는
계산을 m4
에게 시켜서 유용한 결과를 얻어낼 수 있다. 이런 면에서
한계를 두는 것은 m4
의 능력을 막는 일이다. 이런 경우는 많이 있는
데 ‘define(`a', `a')a’는 간단한 예이다 (그러나 see section m4
의 다른 버전들과의 호환성).
GNU m4
가 이러한 무한 루프를 감지하기를 바라는 것은 하나의
컴파일러 시스템이 무한루프를 감지하고 치 료하기를 바라는 것과 다를바
없다.
이것은 불가능하지는 않더라도, 일반적으로 매우 어려운 문제이다.
-Q
--quiet
--silent
매크로 호출에서 여러 가지 실수에 의한 경고를 출력하지 않는다.
-B
-S
-T
이들 옵션은 System V m4
와의 호환성을 위해서 제공한다. 그러나 이것은
아무일도 하지 않는다.
-Nn
--diversions=n
이들 옵션은 이전의 GNU m4 버전과의 호환성을 위해서 제공할 뿐이다. 그리고 이것은 가능한 전환 개수를 제어한다. 이 옵션들은 결과적으로 아무런 일도 하지 않는다. 이미 어떤 정해진 제한이 없기 때문이다.
매크로 정의와 삭제는 명령행 라인에서 행할 수 있다. ‘-D’ 옵션과 ‘-U’ 옵션이 그것이다. 이것들은 다음과 같은 형식을 가지고 있다.
-Dname
-Dname=value
--define=name
--define=name=value
어떠한 입력 파일이 읽히기도 전에 심볼 테이블로 name을 집어넣 는다. ‘=value’가 빠졌다면 그 값은 빈문자열로 된다. 그리고 입력의 내부에서 이것이 정의된다면 value 는 어떠한 문자열이다도 될 수 있으 며, 매크로는 인자를 가지도록 정의될 수 있다.
-Uname
--undefine=name
이미 정의된 name을 삭제한다. 이미 정의된 매크로만 이방법으로 없앨 수 있다.
-tname
--trace=name
name을 심볼테이블에 집어넣는다. 이 매크로가 정의되기 시작한 지점부터 추적하기 시작한다.
-Ffile
--freeze-state=file
한 번의 실행이 끝났을 때, 명시된 file 에 frozen 상태를 쓴다. (see section Frozen 상태로 빠른 속도로 로딩하기).
-Rfile
--reload-state=file
실행을 개시하기 전에, 명시된 frozen file
로 부터 내부 상태를
가져온다. (see section Frozen 상태로 빠른 속도로 로딩하기).
이제 명령행 라인에서 남은 인자는 입력 파일의 이름이다. 이름이 지정되지 않 는다면, 표준입력이 대신 읽힌다. 파일 이름 ‘-’은 표준입력을 뜻한다.
입력 파일은 연속적으로 읽혀진다. 표준입력은 단지 한 번씩 읽혀질 수 있다. 따라서 파일이름 ‘-’는 명령행 라인에서 한 번만 나타나야 한다.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
GNU m4
를 사용하면서 어떤 문제점이 있거나 버그를 발견한 점이
있다면, 보 고해주기 바란다. 버그보고서를 작성하기 전에, 그게 진짜
버근지 확인해보기 바 란다. 이 문서를 다시 주의깊게 읽어보고 여러분들이
처리할 수 있는 것인가를 알아보라. 여러분들이 그것을 처리할 수 있는
능력이 있던 없던 그것도 보고해달 라. 문서안에도 버그가 있을 수 있다.
버그보고서를 작성하거나 여러분 스스로 고쳐보기 전에, 문제점을 만드는
가능 한 작은 입력파일로 고립시켜보라. 그리고 나서 입력파일과 당신에게
나타나는 m4
의 결과를 보내달라. 또한 여러분들이 바라는 것은 어떤
것인지도 말해달라. 이것은 우리가 문서에서의 버그인지 아닌지를 결정하는
데 도움이 될 것이다.
정확한 문제점을 발견했다면 e-mail(인터넷)을
‘bug-gnu-utils@prep.ai.mit.edu’나 (UUCP)
‘mit-eddie!prep.ai.mit.edu!bug-gnu-utils’로 보내달라. 여러분들이
사용하고 있는 m4
의 버전 정보도 같이 포함시키면 좋을 것이다. 버전
정보는 ‘m4 --version’으로 얻을 수 있다.
버그가 아닌 제안도 항상 환영한다. 질문할 것이나 이 문서에서 깨끗하지 못한 점이나 명확한 특징도 보내주면 좋다.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
이 매뉴얼은 m4
에서의 입력과 출력의 예제를 사용하고 있다. 그리고
입력과 출력, 에러출력에 간단한 규칙을 적용하고 있다. 예제는 일반적인
텍스트(고정크기의 폰트)로 표시한다. 다음과 같이..
This is an example of an example! |
출력과 입력을 구별하기 위해서 모든 m4
의 출력은
‘⇒’이 앞에 붙는다. 그리고 에러메시지나 에러출력으로
나오는 것은 ‘error-->’로 표시한다. 따라서,
Example of input line ⇒Output line from m4 error-->and an error message |
m4
에서 이미 정의된 것으로, 매크로의 원형호출, 인자들은 다음과
같은 폰트 로 적는다.
regexp(string, regexp, opt replacement) |
m4
에서 모든 인자는 문자열이다. 그러나 어떤 것은 특별하게
해석한다. 숫자나, 파일이름, 정규표현식 등등..
위에서 세 번째 인자의 opt
는 선택사항이라는 것을 가리킨다.
(생략된다면, 빈문자열이 될 것이다.) 인자 목록 중 생략부호(‘...’)는
어떠한 개수의 인자도 올 수 있음을 가르키는 것이다.
이 문서는 일관되게 builtin(내장 매크로)을 하이픈 없이 쓰고
사용한다. 이것은 m4
내에서 builtin
primitive 의 뜻으로
쓰인다.
[ << ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This document was generated by Autobuild on July 5, 2010 using texi2html 1.82.