[Rust] 상수 표현과 컴파일 타임 연산

Rust는 상수에 기반한 컴파일 타임 연산 기능을 제공한다. 이를 통해 특정 연산을 컴파일한 시점에 코드에 빌트인시켜서 런타임 성능을 최적화할 수 있다.

비교적 근래에 정착된 기능 중 하나다.

C++에서는 템플릿 메타 프로그래밍(TMP)을 통해서 이러한 기능을 구현할 수 있는데, 그에 비하면 사용법이 꽤 단순하고 쉬운 편이라 할 수 있겠다.




상수 (const)

컴파일타임에 대한 이야기를 하려면 상수에 대한 이야기를 빼놓을 수가 없다.

C/C++과 다르게, Rust의 const는 엄격한 의미로서의 진짜 "상수"라고 할 수 있다. (C++의 constexpr와 동치)

그래서 이에 대한 값 변경은 절대 불가능하다.

상수는 또한, "상수 표현식"에 의한 값이면 다 받을 수가 있다.
아래 코드는 상수와 리터럴을 연산해서 또다른 상수 FOO를 산출하는 간단한 코드다.

위처럼 리터럴이나 다른 상수들만으로만 이루어진 값이면 컴파일타임에 평가를 끝낼 수 있는 "상수 표현식"임을 보증할 수 있는 것이다.




상수 함수 (const fn)

Rust는 단순 상수 할당에만 그치지 않고 그 영역을 함수까지 넓혔다.

상수 함수는 함수의 실행이 컴파일타임에 완료될 수 있다는 것이 보장되는 함수다.
따라서 const fn의 파라미터도 전부 상수 표현식이어야 하며, 그 리턴값도 상수 표현식으로 평가된다.

아래는 const fn을 이용해 팩토리얼 함수를 구현한 예다.

일반적인 함수와 마찬가지로 변수를 둘 수 있고, 루프나 조건문도 다 사용할 수가 있다.
대신 저 안에서는 다른 non-const 함수 같은건 호출할 수가 없다.

그럼 아래와 같은 식으로 호출해 사용할 수 있다.

const fn는 non-const 값을 파라미터로 받을 수 없다고 했다.
그래서 아래와 같은 코드는 오류를 발생시킨다.

const fn은 재귀도 된다.
아래 코드는 팩토리얼 함수를 재귀 버전으로 재구현한 것이다.

잘 동작한다.



참조
https://doc.rust-lang.org/reference/const_eval.html