상수 평가
상수 평가는 컴파일 타임에 값을 계산하는 과정입니다. 특정 항목(상수/정적 변수/배열 길이)의 경우, 이 과정은 해당 항목의 MIR이 빌림 검사와 최적화를 거친 후에 일어납니다. 많은 경우 항목을 상수 평가하려고 시도하면 그 항목의 MIR 계산이 처음으로 촉발됩니다.
대표적인 예는 다음과 같습니다.
static의 초기화 식- 배열 길이
- 스택 또는 힙 공간을 확보하려면 알아야 합니다.
- 열거형 배리언트의 판별값
- 두 배리언트가 같은 판별값을 갖지 않도록 하려면 알아야 합니다.
- 패턴
- 겹치는 패턴을 검사하려면 알아야 합니다.
또한 상수 평가는 복잡한 연산을 컴파일 타임에 미리 계산하고 그 결과만 저장함으로써 런타임의 작업량이나 바이너리 크기를 줄이는 데에도 사용할 수 있습니다.
상수 평가의 모든 사용처는 “타입 시스템에 영향을 주는 것”(배열 길이, 열거형 배리언트 판별값, 상수 제네릭 매개변수)과 런타임에 사용할 표현식을 미리 계산하기 위해서만 수행되는 것 중 하나로 분류할 수 있습니다.
상수 평가는 TyCtxt의 const_eval_* 함수를 호출하여 수행할 수 있습니다. 이 함수들은 const_eval 쿼리의 래퍼입니다.
const_eval_global_id_for_typeck는 상수를 valtree로 평가하므로, 컴파일러가 결과 값을 추가로 검사할 수 있습니다.const_eval_global_id는 상수를 최종 값이 담긴 “불투명한 블롭(opaque blob)“으로 평가합니다. 이는 코드 생성 백엔드와 CTFE 평가 엔진 자체에만 유용합니다.eval_static_initializer는 특별히 정적 변수의 초기값을 계산합니다. 정적 변수는 특별합니다. 다른 모든 함수는 정적 변수를 올바르게 표현하지 못하므로, 정적 변수에 사용하지 못하게 막는 단언문(assertion)을 두고 있습니다.
const_eval_* 함수는 상수가 평가되는 환경(예: 상수가 사용되는 함수)을 나타내는 ParamEnv와 GlobalId를 사용합니다. GlobalId는 상수나 정적 변수를 가리키는 Instance, 또는 함수의 Instance와 그 함수의 Promoted 테이블에 대한 인덱스로 구성됩니다.
상수 평가는 타입 시스템 상수에 대해서는 EvalToValTreeResult를, 그 밖에는 EvalToConstValueResult를 반환하며, 이 결과에는 오류 또는 평가된 상수의 표현이 담기는데, 그 표현은 각각 valtree와 MIR 상수 값입니다.