템플릿 메타 프로그래밍은 C++ 컴파일러가 컴파일 하기전에 코드를 읽고 그 코드에 들어간 메타 프로그래밍을 읽어 코드를 제어하여, 새로운(은 아니지만 이해상..) 코드를 만들어내어 생산성을 극대화 시키는 언어이다.
이런 템플릿 메타 프로그래밍은 표준 STL에 그 막강함을 자랑하며, Boost 의 강력함을 한층 더해주는 초강력 무기이다. 이 초강력 무기를 사용함에 있어, 이 무기는 프로그래밍 언어이라는 개념이 있어야 한다.
표준 STL 이나 Boost 를 사용했을 언어라는 느낌보다는 "그냥 쓰니까 되네" 라는 느낌이 더 강하기 때문에 이런 초기 개념을 "언어"라고 보는게 더 속편할지도 모르겠다.
언어를 알아감에 있어, 가장 처음에 하는것이 "printf("헬로우 월드형~");" 을 쳐보는것이 이 세상의 이치겠지만, 메타프로그램은 컴파일 타임에 하는것이므로, 마땅히 우리의 헬로우 형을 부를수도 없는 마당이다.
아마도 헬로우 형을 찾다면, "컴파일 경고" 가 헬로우 형이 아닐까 싶다. : )
템플릿 메타 프로그래밍 크게 두가지 종류의 타입을 사용 한다. 이 두 종류의 타입을 이제부터 "메타자료(metadata)"라 불른다. 다시 풀어 보면, 메타자료는 두개가 있다.^^ 1
한가지 메타자료는 타입 그 자체 이다. C++ 에서 int short 등등 이 템플릿 메타 프로그래밍에 있어 타입 그 자체가 자신의 한가지 타입이다. 이런 타입이 타입이다 라고 말하니까 좀 이상하게 들린다. C++ 에서 int short char가 타입이면, 템플릿 메타 프로그래밍은 char, int, short 등이 자신의 관점에서 봤을 때, 변수로써 쓸수 있는 자신의 한가지 타입의 인자들이다.
다른 한가지 메타자료는, C++ 에서 컴파일 타임에 컴파일러에게 알릴 수 있는 모든 상수가 바로 자신의 나머지 타입이다. 이때 컴파일 타임에 알아야 하는 상수이다. 예를 들어, 매개변수로 상수로 받는다고 해서, 그것을 매개변수로 받아 들이어 사용 되는 변수는 메타자료로써 쓸수가 없다. 이 처럼 컴파일 타임에 알 수 있는 포인터와 참조, 그리고 멤버에 대한 포인터 등 가리지 않고 쓸수 있다.
이런 템플릿 메타 프로그래밍은 표준 STL에 그 막강함을 자랑하며, Boost 의 강력함을 한층 더해주는 초강력 무기이다. 이 초강력 무기를 사용함에 있어, 이 무기는 프로그래밍 언어이라는 개념이 있어야 한다.
표준 STL 이나 Boost 를 사용했을 언어라는 느낌보다는 "그냥 쓰니까 되네" 라는 느낌이 더 강하기 때문에 이런 초기 개념을 "언어"라고 보는게 더 속편할지도 모르겠다.
언어를 알아감에 있어, 가장 처음에 하는것이 "printf("헬로우 월드형~");" 을 쳐보는것이 이 세상의 이치겠지만, 메타프로그램은 컴파일 타임에 하는것이므로, 마땅히 우리의 헬로우 형을 부를수도 없는 마당이다.
아마도 헬로우 형을 찾다면, "컴파일 경고" 가 헬로우 형이 아닐까 싶다. : )
왜 언어로 봐야 하는가?
언어학자가 아니므로, 언어로 봐야 하는 이론은 모르겠으나, 타입(형식)이 있고, 문법이 있어, 그 문법으로 표현 할 수 있다면, 그것은 "언어" 라고 개인적으로 생각 하기 때문이다. ; ) 사실 언어 맞다.언어로 봤을 때의 장점은 무엇인가?
속이 일단 편하다. 새로운 언어를 아는 것이구나 라고 생각하면, 어떠한 새로운게 나온다 하더라도, "이 언어는 이런거군" 하고 쉽게 받아 들일 수 있기 때문이다. Boost 를 처음 봤을 때 typename ~::type 이라는 문법을 보았을 때, 감으로 "~:: 가 안쪽것을 끄집어 내는건데 이게 모지?" 라고 이해하며, 막막함을 맛보게 된 사람이 어디 나 하나 뿐이겠는가?언어를 공부함에 있어 제일 처음에 무엇을 해야 하겠는가?
그 언어에서 사용하는 기본 타입(형식)부터 알아야 하지 않을까 개인적으로 생각한다. 세상의 관습이 모두 이런 타입부터 알아야 한다고 강요 아닌 강요를 받으며 자라온 나로써는 당연하다 느낀다. 다름사람은 어떨지 모르겠다; )템플릿 메타 프로그래밍 크게 두가지 종류의 타입을 사용 한다. 이 두 종류의 타입을 이제부터 "메타자료(metadata)"라 불른다. 다시 풀어 보면, 메타자료는 두개가 있다.^^ 1
한가지 메타자료는 타입 그 자체 이다. C++ 에서 int short 등등 이 템플릿 메타 프로그래밍에 있어 타입 그 자체가 자신의 한가지 타입이다. 이런 타입이 타입이다 라고 말하니까 좀 이상하게 들린다. C++ 에서 int short char가 타입이면, 템플릿 메타 프로그래밍은 char, int, short 등이 자신의 관점에서 봤을 때, 변수로써 쓸수 있는 자신의 한가지 타입의 인자들이다.
다른 한가지 메타자료는, C++ 에서 컴파일 타임에 컴파일러에게 알릴 수 있는 모든 상수가 바로 자신의 나머지 타입이다. 이때 컴파일 타임에 알아야 하는 상수이다. 예를 들어, 매개변수로 상수로 받는다고 해서, 그것을 매개변수로 받아 들이어 사용 되는 변수는 메타자료로써 쓸수가 없다. 이 처럼 컴파일 타임에 알 수 있는 포인터와 참조, 그리고 멤버에 대한 포인터 등 가리지 않고 쓸수 있다.
에제코드 : 헬로우 월드
생각해 보니 이렇게 쓸수도 있겠다 싶다.^^ 지금은 어떻게 이렇게 되는지 생각해도 되지만, 이런 형태이구나 라고 알기만 하면 된다.
에제코드 : 쓸수 없는 상수 메타자료
파트 1은 여기까지 하고 파트 2에서 기본 문법 몇가지를 정리하고, 메타프로그래밍의 함수(?)가 무엇인지 정리해 보는 시간을 갖어야 할 것 같다.
총평
음.. 하나씩 정리해 나가니까 무엇인가 잡혀 나가는것 같은 느낌이 든다.
- 읽고 있는 기반이 되는 책이 "메타자료" metadata 라고 부르고 있어 그것을 따라가는게 편하지 않을까 한다. 유들있게 변할 수도 있으니 영문도 같이 표기해 주는 센스 [본문으로]
'책 정리 > C++ Template Metaprogramming' 카테고리의 다른 글
CPPTM : 2 장 실습과제 : (Chapter 2 : Answers ) (2) | 2008.12.21 |
---|---|
CPPTM : 메타 프로그래밍에서 쓰이는 기초 용어 모두 정리 (0) | 2008.12.21 |
CPPTM : Boost Type Traits 이란 무엇인가? (0) | 2008.12.21 |
C++ Template Metaprogramming : CPPTM - cd backup (0) | 2008.12.21 |
CPTM을 하기 위해 필요한 것 : Type Traits (0) | 2008.12.20 |
C++ Template Metaprogramming : 메타 프로그래밍의 강력함에 맛들다. (0) | 2008.12.04 |
최근댓글