Вернуться к статьям

Долой компиляторы на запросах? Инженерный манифест против модной архитектуры

9 мая 2026
2 мин чтения
Долой компиляторы на запросах? Инженерный манифест против модной архитектуры

Разработчик языка Rust предлагает отказаться от query-based компиляторов — и у него есть веские аргументы.

Помните, как в школе учитель говорил: «Не пиши условие, если можно обойтись без него»? Вот и Алексей Кладов, известный по работе над компилятором Rust, решил напомнить сообществу, что query-based компиляторы — это не серебряная пуля, а скорее швейцарский нож с кучей лезвий, которые вы никогда не используете.

В своей заметке «Against Query Based Compilers» он разбирает модную тенденцию строить компиляторы на системе запросов (как в rust-analyzer или Salsa). Идея красивая: каждый кусочек информации — это запрос, который кешируется и пересчитывается только при изменении зависимостей. Но на практике, по мнению автора, это превращается в адскую машину состояний, где отладка напоминает попытку разобраться в коде, написанном в 4 утра под Red Bull.

Кладов утверждает, что query-based подход добавляет сложности там, где её можно избежать. Он сравнивает это с попыткой использовать ORM для запроса к двум таблицам — вроде бы удобно, но когда база разрастается, вы проклинаете всё на свете. Вместо этого он предлагает вернуться к более прямолинейным подходам: явные проходы по AST, ручное управление инкрементальностью и меньше магии.

Конечно, это вызовет споры. Многие разработчики инструментов уже вложили душу в query-based архитектуру. Но, как говорится, если вы не можете объяснить свой компилятор бабушке, возможно, он слишком сложный. А если бабушка — программист на Haskell, то тем более.

Комментарий студии METABYTE: Мы тоже любим эксперименты с архитектурой, но когда проект начинает напоминать сборку IKEA без инструкции, пора вспомнить KISS. Если вам нужен компилятор или тулинг, который не сломает мозг — мы знаем, как сделать его простым и эффективным.

Против query-based компиляторов: аргументы разработчика Rust | METABYTE — METABYTE