컴파일 타임 함수 실행

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

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

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

C++의 메타코드 확장 (Vandevoorde 2003)은 컴파일 타임 함수 평가(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)으로 알려졌다. C++14는 constexpr에 대한 제한을 풀어줬다 – 로컬 정의 그리고 조건문과 순환문의 사용을 허용하였다(모든 데이터가 실행을 위해 요구되는 일반적인 제한은 컴파일 타임에도 유효하다).

각주

외부 링크 
 Rosettacode examples of compile-time function evaluation in various languages

컴파일러 구성
컴파일러 최적화