Генеративная компиляция: обратная связь компилятора на лету при генерации кода ИИ
Generative Compilation: On-the-Fly Compiler Feedback as AI Generates Code
July 15, 2026
Авторы: Niels Mündler-Sasahara, Hristo Venev, Dawn Song, Martin Vechev, Jingxuan He
cs.AI
Аннотация
Языки с богатой статической семантикой, такие как Rust, обеспечивают более строгие гарантии для кода, генерируемого ИИ, однако их строгость усложняет генерацию. Готовые компиляторы могут предоставлять полезную обратную связь после генерации, но не направляют промежуточные шаги генерации, например, выполняемые в процессе авторегрессионного декодирования LLM. Ограниченное декодирование вмешивается раньше, отвергая недопустимые токены во время сэмплирования, но требует доступа к модели типа «белый ящик» и дорогостоящей перереализации для семантических ограничений. Мы представляем генеративную компиляцию — первый подход, позволяющий получать обратную связь от компилятора о частичных программах в процессе их генерации. Ключевым техническим устройством является силёр: легковесное преобразование, в основном основанное на синтаксисе, которое превращает частичные программы в полные, диагностируемые стандартными компиляторами. Оно спроектировано так, чтобы частичные программы, которые можно завершить, никогда не отвергались, при этом сохраняя достаточный контекст кода для раннего выявления реальных тупиков. Мы конструируем такой силёр для базового исчисления, подобного Rust, и доказываем, что он удовлетворяет этим свойствам, причём всё формализовано в Lean. Мы расширяем его до первого верификатора частичных программ для реального Rust. Мы оцениваем наш метод на сложных задачах написания кода на Rust на уровне репозиториев, как для фронтирных моделей типа «чёрный ящик», так и для моделей с открытым весом. Мы показываем, что генеративная компиляция сокращает количество некомпилируемых выходных данных и повышает функциональную корректность по сравнению со стандартной постгенерационной обратной связью. Это достигается за счёт обнаружения широкого спектра ошибок вблизи их источника и на ранних этапах генерации, что уменьшает каскады ошибок и обеспечивает адресную диагностику. В более широком смысле, генеративная компиляция — это шаг к превращению компиляторов в полноправных участников программирования с помощью ИИ, активных во время генерации, а не отдельной постгенерационной проверки.
English
Languages with rich static semantics, such as Rust, provide stronger guarantees for AI-generated code, but their strictness makes generation more difficult. Off-the-shelf compilers can provide useful feedback post-generation, but does not guide intermediate generation steps, such as those during autoregressive LLM decoding. Constrained decoding intervenes earlier by rejecting invalid tokens during sampling, but requires white-box model access and costly reimplementation for semantic constraints.We introduce generative compilation, the first approach to obtaining compiler feedback on partial programs during generation. The core technical device is a sealor: a lightweight, mostly syntax-guided transformation that converts partial programs into complete ones that standard compilers can diagnose. It is designed such that possible-to-complete partial programs are never rejected, while preserving enough code context to catch genuine dead ends early. We construct such a sealor on a core Rust-like calculus and prove that it satisfies these properties, all mechanized in Lean. We extend it to the first partial-program checker for real Rust. We evaluate our method on challenging repository-level Rust coding tasks, across both frontier black-box and open-weight models. We show that generative compilation reduces non-compiling outputs and improves functional correctness, relative to standard post-generation feedback. It does so by detecting a broad range of errors close to their source and early during generation, thereby reducing errors cascades and enabling focused diagnostics. More broadly, generative compilation is a step toward making compilers a first-class citizen of AI-assisted programming active during generation, rather than a separate post-generation check.