← На главную

Catlang компилирует программы в один большой SQL-запрос

04.11.2026 03:11 · hackernews

Автор создал экспериментальный язык Catlang, компилятор которого превращает всю программу в один большой SELECT для PostgreSQL. Это не ещё один язык запросов: результат выполнения SQL в базе является результатом программы. Такой необычный целевой формат выбран, чтобы проверить главную идею проекта — промежуточное представление на основе теории категорий.

Для демонстрации написана функция count, которая с помощью аналога цикла while увеличивает входное число, пока оно не достигнет 100. Исходный синтаксис напоминает arrow notation в Haskell, но после раскрытия конструкций остаётся компактный набор операторов с формальной алгебраической семантикой. Компилятор затем переводит их в другую предметную область, в данном случае SQL.

Получившийся запрос намеренно громоздкий: он содержит множество вложенных SELECT, UNION и рекурсивный CTE. Тем не менее PostgreSQL 17 действительно возвращает одну строку со значением 100, выполняя итерации от исходного числа. Если убрать финальный LIMIT 1, можно увидеть отдельную строку для каждого шага. Автор признаёт возможности оптимизации, но не считает их интересной частью эксперимента.

В промежуточном языке типы соединяются стрелками, похожими на функции, однако применения функции к аргументу там нет — доступна только композиция. Оператор id ничего не меняет, а последовательная композиция передаёт результат одной стрелки следующей. Для произведений типов есть проекции prj₁ и prj₂, извлекающие элементы пары. Операция fork, обозначаемая треугольником, объединяет два независимых вычисления в пару; отсутствие зависимости между ними явно показывает возможность параллельного выполнения.

Обращение направления стрелок приводит к копроизведениям, представленным как Either: значение принадлежит одному из двух типов. Инъекции inl и inr выбирают вариант, а операция join реализует ветвление между ними. Уже этого небольшого набора достаточно для выражения зависимостей данных, условий и параллелизма. В промежуточном коде отсутствуют имена переменных, а структура вычислений целиком задаётся композицией стрелок.

Читать оригинал →