
const fn в 2026: ваш компилятор втихаря исполняет Rust
morett1m 25 минут назад const fn в 2026: ваш компилятор втихаря исполняет Rust Простой 10 мин 998 Блог компании Beget Rust * Программирование * Обзор Привет, Хабр!Когда вы пишете вот такую строчку:const N: u64 =...
<5 — 2026'da uzaya kaç SpaceX Starship fırlatması ulaşacak?
Вот важная новость с фронта ИИ: morett1m 25 минут назад const fn в 2026: ваш компилятор втихаря исполняет Rust Простой 10 мин 998 Блог компании Beget Rust * Программирование * Обзор Привет, Хабр! Когда вы пишете вот такую строчку:const N: u64 = fib(50);внутри компилятора происходит странное. rustc не генерирует машинный код для fib, не зовёт процессор и не подставляет ответ откуда-то сбоку.
Он берёт вашу функцию, разворачивает её в промежуточное представление и исполняет шаг за шагом прямо у себя внутри, на маленькой виртуальной машине. И вот вопрос, на который мало кто может ответить с ходу: а кто конкретно это исполняет? Где живёт тот интерпретатор?
Технические детали
Почему 255 + 1 в const падает с ошибкой компиляции, а в рантайме просто паникует? Почему можно посчитать таблицу из тысячи элементов циклом, но нельзя написать if a < b для дженерика? 0 в const официально разрешили вести себя недетерминированно?
Сначала про контекст, иначе всё развалитсяПоловина путаницы вокруг const fn растёт из непонимания, что такое const-контекст. В Rust есть места, где значение обязано быть известно компилятору. Их немного, и вот они все:const SIZE: usize = 4 * 8; let buf = ; // длина массива enum // дискриминант варианта enum struct Matrix; // аргумент const-дженерика static TABLE: = build(); // инициализатор const и static let x = ; // инлайн const-блок, с 1.
79Это и есть const-контекст. Внутри него разрешены не любые выражения, а только те, что компилятор гарантированно посчитает сам. Пометка const на функции ничего не меняет для обычных вызовов:const fn square(x: u64) -> const NINE: u64 = square(3); // посчитано на этапе компиляции fn main() { let n = read_number(); // рантайм-значение println!
Отраслевые последствия
("{}", square(n)); // та же функция, обычный рантайм-вызов }Одна и та же square. В первом случае её исполняет компилятор, во втором она компилируется в машинный код и работает как все остальные функции. const это не «функция работает на этапе компиляции», а «функцию можно позвать из const-контекста, и за это она соглашается на ограничения».
Кто это исполняет: Miri, вшитый в компиляторВнутри rustc живёт интерпретатор. Не оптимизатор, не генератор кода, а именно интерпретатор: виртуальная машина, которая выполняет промежуточное представление среднего уровня (MIR, Mid-level Intermediate Representation) напрямую, ничего не компилируя. Когда компилятору нужна константа, он не идёт в процессор, а скармливает MIR этой машине и ждёт результат.
Это тот же самый движок, что и Miri, инструмент для отлова неопределённого поведения (UB, undefined behavior). Народ думает, что Miri и вычисление констант это разные штуки. У них общая виртуальная машина в rustc_const_eval, а отличия в поведении вынесены в трейт Machine, который для каждого режима реализован по-своему:// сильно упрощённо, изнутри rustc pub trait Machine<'tcx> { type MemoryKind; // ...
Этот прогресс даёт важные сигналы о будущем отрасли, и технологический мир внимательно наблюдает.





