4.2. 메타프로그래밍

매크로를 확장시켜 주는 외부필터를 사용하는 대신 사용할 수 있는 또다른 방법이 있는데, 그것은 여러분의 프로그램의 일부 혹은 전체를 만들어주는 프로그램을 짜는 것이다.

무슨 말인고 하니, 예를 들어 설명해 보면, 여러분은 소스 코드를 출력해주는 프로그램을 사용할 수도 있다. 그러한 프로그램의 예를 들자면,

그러한 프로그램들을 한번 고려해 보라!

4.2.1. 컴파일러의 백엔드로 제공되는 어셈블러의 이용

GCC, SML/NJ, Objective CALM, MIT-Scheme, CMUCL 등과 같은 컴파일러들은 고유의 어셈블러 백엔드를 갖추고 있다. 여러분은 이러한 백엔드를 이용해서 어셈블리 코드를 얻을 수 있다. 여러분이 사용하는 언어를 이용해서 만든 프로그램을 앞서 언급한 컴파일러로 컴파일해서 훌륭한 어셈블리 코드를 얻을 수 있고, 그 코드를 여러분이 더 낫게 수정해서 마음에 드는 어셈블리 코드를 얻을 수 있다.

4.2.2. 뉴저지 머신-코드 툴킷

프로그래밍 언어라는 아이콘을 사용해서 기계어를 다루는 툴킷의 개발과 관련된 프로젝트가 있다(실험적인 ML 버젼도 제공한다) http://www.eecs.harvard.edu/~nr/toolkit/을 한번 둘러보라

4.2.3. TUNES 프로젝트

Free Reflective Computing System 을 위한 TUNES Project(http://www.tunes.org) 에서도 자체적인 어셈블러를 Scheme 언어의 확장으로 개발하고 있다. 아직 제대로 실행되는 것은 아니지만 말이다.

tunes 프로젝트에서 개발중인 어셈블러는 abstract syntax 트리를 다루는데, 그렇게 하여, 디스어셈블러로도, 어셈블러 문법 번역기로도, 컴파일러나 어셈블러들의 공통적인 백엔드로도 사용할 수 있도록 하고 있다. 또한, Scheme 이라는 언어의 강력함은 매크로 프로세싱이나 메타 프로그래밍처럼 도전할 만한 분야이다.(?)

The assembler manipulates abstract syntax trees, so it could equally serve as the basis for a assembly syntax translator, a disassembler, a common assembler/compiler back-end, etc. Also, the full power of a real language, Scheme, make it unchallenged as for macroprocessing/metaprogramming.