템플릿 메타 프로그래밍은 C++ 컴파일러가 컴파일 하기전에 코드를 읽고 그 코드에 들어간 메타 프로그래밍을 읽어 코드를 제어하여, 새로운(은 아니지만 이해상..) 코드를 만들어내어 생산성을 극대화 시키는 언어이다.

이런 템플릿 메타 프로그래밍은 표준 STL에 그 막강함을 자랑하며, Boost 의 강력함을 한층 더해주는 초강력 무기이다. 이 초강력 무기를 사용함에 있어, 이 무기는 프로그래밍 언어이라는 개념이 있어야 한다.

표준 STL 이나 Boost 를 사용했을 언어라는 느낌보다는 "그냥 쓰니까 되네" 라는 느낌이 더 강하기 때문에 이런 초기 개념을 "언어"라고 보는게 더 속편할지도 모르겠다.

언어를 알아감에 있어, 가장 처음에 하는것이 "printf("헬로우 월드형~");" 을 쳐보는것이 이 세상의 이치겠지만, 메타프로그램은 컴파일 타임에 하는것이므로, 마땅히 우리의 헬로우 형을 부를수도 없는 마당이다.

아마도 헬로우 형을 찾다면, "컴파일 경고" 가 헬로우 형이 아닐까 싶다. : )


왜 언어로 봐야 하는가?

언어학자가 아니므로, 언어로 봐야 하는 이론은 모르겠으나, 타입(형식)이 있고, 문법이 있어, 그 문법으로 표현 할 수 있다면, 그것은 "언어" 라고 개인적으로 생각 하기 때문이다. ; ) 사실 언어 맞다.

언어로 봤을 때의 장점은 무엇인가?

속이 일단 편하다. 새로운 언어를 아는 것이구나 라고 생각하면, 어떠한 새로운게 나온다 하더라도, "이 언어는 이런거군" 하고 쉽게 받아 들일 수 있기 때문이다. Boost 를 처음 봤을 때 typename ~::type 이라는 문법을 보았을 때, 감으로 "~:: 가 안쪽것을 끄집어 내는건데 이게 모지?" 라고 이해하며, 막막함을 맛보게 된 사람이 어디 나 하나 뿐이겠는가?

언어를 공부함에 있어 제일 처음에 무엇을 해야 하겠는가?

그 언어에서 사용하는 기본 타입(형식)부터 알아야 하지 않을까 개인적으로 생각한다. 세상의 관습이 모두 이런 타입부터 알아야 한다고 강요 아닌 강요를 받으며 자라온 나로써는 당연하다 느낀다. 다름사람은 어떨지 모르겠다; )

템플릿 메타 프로그래밍 크게 두가지 종류의 타입을 사용 한다. 이 두 종류의 타입을 이제부터 "메타자료(metadata)"[각주:1]라 불른다. 다시 풀어 보면, 메타자료는 두개가 있다.^^

한가지 메타자료는 타입 그 자체 이다. C++ 에서 int short 등등 이 템플릿 메타 프로그래밍에 있어 타입 그 자체가 자신의 한가지 타입이다. 이런 타입이 타입이다 라고 말하니까 좀 이상하게 들린다. C++ 에서 int short char가 타입이면, 템플릿 메타 프로그래밍은 char, int, short 등이 자신의 관점에서 봤을 때, 변수로써 쓸수 있는 자신의 한가지 타입의 인자들이다.

다른 한가지 메타자료는, C++ 에서 컴파일 타임에 컴파일러에게 알릴 수 있는 모든 상수가 바로 자신의 나머지 타입이다. 이때 컴파일 타임에 알아야 하는 상수이다. 예를 들어, 매개변수로 상수로 받는다고 해서, 그것을 매개변수로 받아 들이어 사용 되는 변수는 메타자료로써 쓸수가 없다. 이 처럼 컴파일 타임에 알 수 있는 포인터와 참조, 그리고 멤버에 대한 포인터 등 가리지 않고 쓸수 있다.


에제코드 : 헬로우 월드

생각해 보니 이렇게 쓸수도 있겠다 싶다.^^ 지금은 어떻게 이렇게 되는지 생각해도 되지만, 이런 형태이구나 라고 알기만 하면 된다.


에제코드 : 쓸수 없는 상수 메타자료


파트 1은 여기까지 하고 파트 2에서 기본 문법 몇가지를 정리하고, 메타프로그래밍의 함수(?)가 무엇인지 정리해 보는 시간을 갖어야 할 것 같다.


총평

음.. 하나씩 정리해 나가니까 무엇인가 잡혀 나가는것 같은 느낌이 든다.

  1. 읽고 있는 기반이 되는 책이 "메타자료" metadata 라고 부르고 있어 그것을 따라가는게 편하지 않을까 한다. 유들있게 변할 수도 있으니 영문도 같이 표기해 주는 센스 [본문으로]
신고
posted by 농사를 짓는 게임 프로그래머 최익필

댓글을 달아 주세요