다음 이전 차례

3. META 프로그래밍/ 매크로 처리

여러분들은 이러한 작업을 위해서 적당한 툴을 사용할 수 있으며, 그것이 적당하지 않다면 어셈블리를 선택할 수 없다; C, OCAML, perl, Scheme 가 당신의 프로그래밍의 최선의 선택이 될 것이다. 그러나, 이러한 툴들이 기계상에서 충분히 쓸만한 제어기능을 주지 않는다면, 어셈블리는 유용하거나 필요할 것이다. 다른 경우에, 만일 여러분들이 안전한 프로그래밍, 편안한 수정 등등을 허락하는 인라인 확장에 의해 자동적으로 시스템의 매크로처리와 메타프로그래밍을 이해하 고자 한다면 그것은 한번 정의되는 재귀패턴을 허락할 것이며, 다중 시간을 재사용 할 것이다. "평이한" 어셈블러는 종종 작은 루틴을 C로 링크시킬 때 조차 충분히 않은때가 있다.

3.1 위에서 통합된 것이란 무엇을 뜻하는가

GCC

GCC 에서 인라인 어셈블리 코드를 사용한다면 그 속에서의 레지스터 규칙을 꼼꼼 하게 살펴보아야 한다. 최적화실행자는 항상 그것에 대해 알고 있으므로, 인라인 어셈블리 코드는 정확하지 않는 코드를 만들어 낸다. 그러면, 여러분들의 어셈블리를 CPP 매크로에 놓을 수 있으며, 모든 사람들도 그것을 C 함수/매크로로 사용할 수 있을 것이다. 인라인 함수는 매크로와 매우 많이 비슷한데, 그것은 가끔 사용을 하기 위해 깨끗하게 청소될 때가 있다. 그러한 경우에 코드가 복사가 될 수 있으니 주의해야 한다. 그래서 로컬 라벨("1:" 스타일의)에서만은 어셈블리 코드에서 정의되어 있어야 한다. 그렇다 할지라도, 매크로는 로컬이 아닌 정의라벨의 이름도 허용을 한다. 또한, 여러분들의 코드나 GCC의 조금의 버그는 레지스터 규정이 아마도 선언되 지 않았을 때, 인라인 함수를 어셈블리 코드로 사용할 때, 나타날 수 있을 것 이며 GCC를 혼동에 빠뜨린다. 마지막으로, C 언어는 그차체가 어셈블리 프로그래밍에 있어서 제법 괜찮은 추상화 라고 대우받고 있다. 어셈블링의 고충에서 많은 부분을 들 수도 있을 것이다. 그리고 함수로 인자를 레지스터를 통해 넘겨주는 몇몇 최적화는 어셈블리에서 그 함수를 부를 때 부적당 할 수도 있다. 적어도 여러분들이 어트리붓 asmlinkage 에게 그것들을 주어야 한다. 리눅스 커널 소스의 부분을 참고 할 수 있다.

GAS

GAS는 절대로 매크로 기능을 포함하고 있지 않다. 그러나, GCC 와 건네지는 .S 파일들은 그것들이 GAS에게 건네지기 전에 CPP를 통 할 수도 있다. .s 파일은 하나를 생성시키고 바로 GAS에게로 건네진다. 다시한번 말하지만, 예를 볼려면 리눅스 소스들을 보라.

GASP

보통의 거의 모든 매크로어셈블리를 GAS에게 보탠다. texinfo doc를 보라.

AS86

이것은 간단한 매크로를 제공한다. 나는 doc들을 못찾았다. 이 소스들은 아주 간결하고 깔끔하다. 여러분들이 흥미를 가진다면 그것들을 쉽게 이해할 수 있을 것이다. 초보적인 것보다 더 많이 알고 싶다면 외부필터를 이용할 수 있다. (아래의 3.2 부분을 보라.)

다른 어셈블러들

Win32FORTH: CODE 와 END-CODE는 해설모드로부터 선택할 수 없는 매크로이다. 그래서 어셈블링 동안은 FORTH 단어의 모든 것들에 접근을 할 수 있을 것이다. NASM: 아직 매크로를 제공하지 않는다. 아래의 외부 필터 부분을 보라. TUNES: 이것도 아직 제공하지는 않는다. 그러나 Scheme언어는 기분내키는 데로의 메타 프로그래밍을 허용하는 진정한 고급언어이다.

외부 필터

어셈블러에서 어떤 매크로도 제공을 하던지, 또는 여러분들이 어떤 언어를 사용한다고 하더라도(C 조차!) 그 언어는 표현하는 데 충분치 않을 것이다. 여러분들은 Makefile 규칙으로 다음과 같이 파일을 외부필터를 통해 건네줄 수 있다.

%.s:     %.S other_dependencies
         $(FILTER) $(FILTER_OPTIONS) < $< > $@

CPP

CPP 는 표현력에 있어서 좀 약하지만 쉬운 것들에는 충분하다. 그것이 표준이라면 GCC에 의해 불리워 질 것이다. CPP의 제한된 점에서 보듯이, 오브젝트를 선언 할 수 없으며, 따라서 파괴자 (destructors)는 자동적으로 선언블럭의 마지막에서 콜된다. 그리고 데이타나 코드를 처리하기 위해 그것을 공통 선언을 할 수 없다. CPP는 C 컴파일러에 따라온다. GCC는 여러분들이 가져올 수 있는 자유로운 C 컴파일러이다.

M4

M4는 매크로처리에 있어서 탁월한 능력을 보여준다. 재귀적 표현, 질서정연한 규칙등에 있어서 괜찮아 보인다. CPP가 할 수 없는 모든 것들을 그것으로 할 수 있다. macro4th/This4th 를 아래에서 보라. ftp.forth.org/pub/Forth/ in Reviewed/ ANS/ (?), 또는 Tunes 0.0.0.25 소스를 m4를 사용하는 진보한 매크로 처리의 예제로서 보는 것도 괜찮을 것이다. m4의 라이트버젼은 GNU m4 1.4 (이상)으로 구할 수 있다.

필터를 통한 매크로 처리

여러분들은 간단한 매크로 확장 필터를 쓸 수 있다. perl, awk, sed 등을 사용함으로써 가능하다. 이렇게 하는 것이 빠르며, 거의 모든 것을 제어 할 수 있을 것이다.

메타 프로그래밍

[생략]


다음 이전 차례