Roundhouse превращает Rails-приложение в Rust, Go или Swift без единой строчки нового кода

01 окт 2026
308
15
9
1 неделя

Представьте, что вы берёте обычное Rails-приложение, ничего в нём не меняете и запускаете компилятор. На выходе получаете standalone-проект на Rust, Go, TypeScript или ещё десятке языков. Звучит как фантастика, но именно этим занимается Roundhouse — проект, который я нашёл на GitHub и который заставил меня перечитать README дважды.

Roundhouse logo

Что это вообще такое

Формулировка из README звучит так: "Rails as a specification; deployment is a build flag". То есть Rails здесь выступает спецификацией, а целевая платформа становится флагом сборки. Хотите бинарник на Rust? Пожалуйста. TypeScript-бандл для браузера? Тоже вариант. Elixir OTP-приложение, Kotlin/JVM, C#/.NET, Crystal, Python — всё это список целей.

Название отсылает к железнодорожной терминологии. Roundhouse — это поворотный круг в депо, где локомотивы разворачиваются и разъезжаются по разным путям. Метафора точная: один Ruby-исходник в центре, анализ, а дальше — раздача по N направлениям.

Кому это нужно? Скорее всего, тем, кто упёрся в ограничения CRuby. Не всем подряд, а тем, у кого есть причины искать другую среду исполнения. Автор честно выносит мотивацию в отдельный файл WHY.md, а не размазывает её по всему описанию.

Реклама

Три вещи, которые делает один бинарник

Анализ без аннотаций

Самое интересное для меня здесь. Roundhouse не требует никаких type annotations. Логика такая: Rails уже типизирован. has_many :comments — это объявление типа, просто оно никогда не записывалось в формате системы типов. Конвенции фреймворка несут информацию, которую никто не фиксировал формально.

Roundhouse восстанавливает эти типы через whole-program inference прямо из немодифицированного исходника, без запуска приложения и без подключения к базе. Прогон по Mastodon (1173 файла, все 337 контроллеров, включая HAML-вьюхи) занимает около полутора секунд.

И это отдельный продукт сам по себе. Есть roundhouse check для терминала или CI-гейта, LSP-сервер для редактора, MCP-сервер для агента и даже in-browser IDE, который анализирует папку на диске без загрузки куда-либо.

Забавное позиционирование вырисовывается: ruby-lsp статичен, но останавливается на именах; ruby-lsp-rails и Tidewave глубоки, но требуют работающего приложения; Sorbet и Steep статичны и глубоки, но платить приходится аннотациями. Roundhouse пытается занять пустующую клетку. Кстати, если у вас уже есть sig-и, проект читает их как seeds.

Транспиляция в десяток языков

Тот же анализ скармливается эмиттерам. На выходе — standalone-проект со своими тестами и без Rails в рантайме.

Как проверить, что вывод корректный? Через conformance oracle. Один и тот же URL запрашивается у Rails и у каждой цели, ответы должны совпадать: DOM-узел к DOM-узлу, значение JSON к значению JSON, плюс браузерные e2e-тесты для того, что статический диф не достаёт. И каждая цель из списка проходит это на каждом пуше. Методология подробно разобрана в блог-постах автора.

Компиляция в нативный бинарник

Здесь в игру вступает Spinel — AOT-компилятор Ruby от Маца (matz). Ruby-форма компилируется заранее в один нативный бинарник, без интерпретатора, рядом по умолчанию SQLite-файл. База данных тоже флаг сборки.

Среди компилируемых целей у Spinel-варианта поведение ближе всего к Rails, и, по словам автора, останется таким в обозримом будущем — потому что он исполняет сам рантайм фреймворка, а не его перевод. Campfire из Basecamp работает именно так, и каждую страницу и каждый cable-фрейм сравнивают с живым Rails на каждом пуше.

Почему это быстро

Rails операционально является интерпретатором вашего приложения: маршруты, ассоциации, валидации и шаблоны — это данные, к которым он обращается на каждом запросе. Roundhouse принимает все решения, которые не могут отличаться между запросами, один раз на этапе транспиляции.

На тестовом блоге-serving по HTML-индексу на фиксированном Linux x86 (замер июля 2026) картина такая:

| конфигурация | req/sec | |---|--:| | Rails на CRuby+YJIT | 326 | | Rails на JRuby | 1066 | | Roundhouse emit на CRuby+YJIT | 3292 | | Roundhouse emit на JRuby | 24172 |

Убирание интерпретирующих слоёв даёт примерно 10× на том же интерпретаторе. Оставшийся статический, мономорфный Ruby — это именно тот вход, под который строили JVM JIT, и это ещё плюс ~7×. Компилируемые цели идут дальше.

Сам автор оговаривается: это отношения из CPU-bound микробенчмарка на маленьком фикстуре, а не абсолютные истины. Живые цифры с параметрами окружения лежат на bench-странице. Такая честность подкупает.

Это вообще реально попробовать

Установка в одну строку:

curl --proto '=https' --tlsv1.2 -LsSf \
  https://github.com/rubys/roundhouse/releases/latest/download/roundhouse-installer.sh | sh
roundhouse --version
roundhouse check --continue /path/to/your/rails/app

Релизы — датированные снапшоты с бинарниками для macOS на Apple Silicon и Linux x86-64 (плюс непротестированные сборки для macOS-Intel и Windows). Есть и сборка из исходников через cargo install.

Потыкать без установки тоже можно. In-browser IDE предзагружен примерами: Rails Guides store, блог, Lobsters, Campfire и Mastodon. Есть страница Browse с тем, что каждый эмиттер производит из блог-фикстуры, страница Bench с замерами и Demo с фикстурой и тремя слоями тестов.

Что мне показалось слабым местом

Проект нельзя назвать обкатанным. 308 звёзд, 15 форков, 93 открытых issues на момент, когда я смотрел. Это не мейнстрим-инструмент, и думать о нём как о готовой замене продакшн-стека вряд ли стоит.

Документация разложена по множеству файлов (DEVELOPMENT.md, AGENTS.md, BETS.md, WHY.md, RELEASES.md), и поначалу в этом легко потеряться. Предшественник проекта, railcar на Crystal, упоминается как источник выученных уроков, а не как что-то, что стоит запускать.

Транспиляция Rails-приложения целиком — задача, которая звучит слишком хорошо, чтобы быть правдой. И автор сам это понимает, поэтому и построил conformance oracle вместо того, чтобы просто заявить о корректности. Что из всего этого выйдет для реальных больших приложений — вопрос открытый.

Стоит ли смотреть

Если вы держите Rails-приложение и подумываете о смене платформы ради производительности, но не хотите переписывать код — Roundhouse заслуживает изучения хотя бы как эксперимент. Начните с in-browser IDE: она ничего не устанавливает и работает на примерах вроде Mastodon.

Если вам нужен annotation-free статический анализ Rails для редактора или CI, попробуйте roundhouse check на своём приложении прямо сейчас. Полтора секунды на Mastodon делают эту пробу дешёвой.

Авторам Rails-приложений, которые уже смирились с мыслью, что выбор языка развёртывания жёстко привязан к Ruby, есть смысл посмотреть на таблицу замеров и методологию. Даже если вы не станете транспилировать ничего в прод, идея "деплой как флаг сборки" может поменять то, как вы думаете о границе между спецификацией и рантаймом.

Проект открыт для PR, и, как обещает README, разговор перед пул-реквестом не нужен: CI прогонит весь матрикс — юнит-тесты, тулчейны каждой цели, DOM-сравнение с живым Rails, Spinel-линии. Лицензия двойная, MIT или Apache 2.0 на выбор.

🍪 Мы используем файлы cookie и сервис аналитики Яндекс.Метрика, чтобы сайт работал лучше. Продолжая пользоваться devtrends.ru, вы соглашаетесь с обработкой данных согласно Политике конфиденциальности.