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