Expression Template은 Todd Veldhuizen이라는 사람이 1995년에 발표한 논문입니다. 논문 본문은 아래의 링크에 있습니다.

http://osl.iu.edu/~tveldhui/papers/Expression-Templates/exprtmpl.html

Expression Template이라는 것은 참 재밌습니다.

int foo(int a);

라는 함수가 있다고 하죠. 이 함수는 정수를 입력받아 정수를 리턴합니다.

int i = 20;

이라고 i라는 변수를 정의했습니다.

foo(i * 30 + i / 2);

와 같이 호출했다면 어떤 일이 벌어질까요? 프로그램이 실행 중일 때, i가 20인 걸 알고, 실제로는 다음과 같은 호출이 일어납니다.

foo(610);

그렇죠? 이를 early evaluation이라고 합니다. 미리 계산되어 인자로 들어간다는 의미지요.
그런데, Expression template은 lazy evaluation입니다. 수식이 일단 인자로 들어가고, 함수 내부에서 계산이 이루어집니다. 진짜 내부 구현을 들여다보면 좀 다르게 구현되어 있지만, 개념 상으로는 그렇습니다. 자세한 구현은 논문을 보시면 될 테고,

template<typename T>
int bar(T a);

라는 함수가 있고,

class Ca;
Ca x;

라는 클래스와 그것의 인스턴스가 있습니다. 다소 놀라운 일이 벌어집니다.

bar(x * 30 + x / 2);

이렇게 호출 할 수 있습니다. 뭐 이렇게 얘기할 수 있겠죠.
*와 +와 /가 Ca라는 클래스에 대해 operator overloading 되어있으면 되고, bar()라는 함수는 결국 Ca 타입의 reference나 value를 입력받지 않겠느냐
네, 맞습니다. 그렇게 됩니다. (하지만, 최종으로 넘어가는 클래스가 Ca가 아니라는 거~~) 여기까지는 이상할 게 없죠? 그런데 문제는 x가 무엇이냐는 겁니다. 그냥 단순히 객체를 넘기고자 했다면, 저렇게 요상한 식을 써서 넘길 리가 없죠. 저건 누가 봐도 수식입니다. 뭔가 계산하고 싶은 것이고, x는 (객체로 구현이 되어는 있지만) 변수입니다.

여기서는 argument placeholder라고 해서, 나중에 그 값이 결정됩니다. 눈치 빠른 사람들은 뭐가 다른 것인지 아시겠죠?

네, foo()에서 i는 입력으로 들어갈 때 이미 값이 20이라고 결정되어 있지만, bar()의 x는 값이 결정되어 있지 않습니다. 그럼, 언제 그 값을 알 수 있을까요?

여기서 functor 혹은 function object라는 것이 등장합니다. 이것은 STL을 공부하신 분은 아실 것입니다. 객체를 함수처럼 사용하는 겁니다. 즉, 클래스가 operator()() 함수를 가지고 있는 것이지요. 아니면, 미리 약속된 이름의 멤버 함수가 있을 것입니다. bar() 함수에서, 파라미터로 넘어간 객체의 특정 메쏘드를 호출할 때, 그 값이 결정됩니다. 즉,

x는 'x * 20 + x / 2'가 만들어내는 functor의 parameter입니다.

여기서 또 새로운 개념, Lambda Expression이 들어갑니다. x가 바로 Lambda... 음..

그리고, *, +, / 즉, operator*(), operator+(), operator/()는 모두 higher order function  혹은 functional이라고 부릅니다. 함수를 입력받아, 함수를 리턴하니까요...

오늘 세미나 시간에 이걸 설명하려고 했습니다... 어제부터...

그런데... 역시나.. 설명이 잘 안됩니다..

저도 공부하는데 무지 오래걸리긴 했는데, 전달도 잘 안되네요.. 아직 빠삭하게 알지 못해서리.. STL도 잘 모르는데요 뭐..

왜 이런 것들을 설명하냐구요?

Boost의 Spirit이라는 라이브러리를 설명하는 중이었는데, 저것들을 알아야해요~~ -_-;


Trackbacks  0 | Comments 

풀리비’s Blog is powered by Daum & Tattertools.com