[ << ] | [ < ] | [ 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
[option…] [macro-definitions…] [input-file…]
모든 옵션은 ‘-’로 시작하거나 긴 옵션이름을 ‘--’ 다음에 사용할
수 있다. 긴 옵션이름은 완전하게 쓸 필요는 없다. 명확한 접두어로
충분하다. 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 on February 24, 2015 using texi2html 5.0.