컴파일 타임 함수 실행

컴파일 타임 함수 실행(Compile-time function execution) 또는 컴파일 타임 함수 평가는 일반적으로 함수를 기계어로 컴파일하고 런타임 시에 실행시키는 컴파일러가 컴파일 타임에 함수를 실행시키는 것이다. 이것은 함수의 인자들이 컴파일 타임에 알려지고 함수가 전역 상태(순수 함수)를 수정하려는 시도를 하지 않을 때 가능하다.

단지 몇몇 인자들만 알게 되더라도 어느 정도의 컴파일 타임 함수 실행을 할 수 있으며, 아무 인자들도 알려지지 않았을 때보다는 더 최적화된 코드를 만들 수 있다.

예시 편집

리스프 매크로 시스템은 사용자 정의된 함수들의 컴파일 타임 평가를 사용하는 초기의 예시이다.

C++의 메타코드 확장 (Vandevoorde 2003)[1]은 컴파일 타임 함수 평가(CTFE)과 C++ 템플릿 메타프로그래밍을 위한 개선된 문법으로서 코드 인젝션을 허용하는 실험적인 초기의 시스템이었다.

초기 버전의 C++에서, 템플릿 메타프로그래밍은 종종 다음과 같이 컴파일 타임에 값들을 계산하기 위해 사용되었다.

template <int N> struct Factorial {
    enum {
        value = N * Factorial<N - 1>::value
    };
};

template <> struct Factorial<0> {
    enum { value = 1 };
};

// Factorial<4>::value == 24
// Factorial<0>::value == 1
void foo() {
    int x = Factorial<0>::value; // == 1
    int y = Factorial<4>::value; // == 24
}

컴파일 타임 함수 평가를 사용함으로써, 계승(factorial)을 계산하는데 사용되는 코드는 C++11 constexpr을 사용하는 런타임 평가를 위해 쓰는 것과 비슷할 것이다.

#include <stdio.h>

constexpr int factorial(int n) {
    return n ? (n * factorial(n - 1)) : 1;
}

constexpr int f10 = factorial(10);

int main() {
    printf("%d\n", f10);
    return 0;
}

C++11에서, 이 기법은 일반화된 상수 표현(constexpr)으로 알려졌다.[2] C++14는 constexpr에 대한 제한을 풀어줬다 – 로컬 정의 그리고 조건문과 순환문의 사용을 허용하였다(모든 데이터가 실행을 위해 요구되는 일반적인 제한은 컴파일 타임에도 유효하다).

각주 편집

  1. Daveed Vandevoorde, Edison Design Group (2003년 4월 18일). “Reflective Metaprogramming in C++” (PDF). 2015년 7월 19일에 확인함. 
  2. Gabriel Dos Reis and Bjarne Stroustrup (March 2010). “General Constant Expressions for System Programming Languages. SAC-2010. The 25th ACM Symposium On Applied Computing.” (PDF). 

외부 링크 편집