Rust без C ABI перестал быть чистой мечтой из обсуждений на форумах компиляторщиков: разработчик Valen Эван Овадия показал эксперимент, где новый язык может напрямую работать с generic-кодом Rust. По данным The Register, идея в том, чтобы использовать Rust не только как язык, но и как библиотечную базу для других языков программирования. Для русскоязычных разработчиков это важный сигнал: привычная модель «хотите совместимость — идите через C» начинает скрипеть всё громче.
Овадия, бывший инженер Google и участник работы над Mojo, строит язык Valen — ответвление более раннего проекта Vale. Его цель звучит знакомо для всех, кто любит Rust, но иногда устаёт от его строгости: сделать язык быстрым, безопасным и более дружелюбным к разработчику. Проблема возникла сразу и вполне практическая. Если писать новый язык с нуля, хочется использовать уже существующие библиотеки Rust, например графическую wgpu. Но между «хочется» и «линкуется» обычно стоит C ABI.
C ABI десятилетиями работает как универсальный переходник между языками. Rust-библиотека может открыть функции как extern C, привести структуры к представлению repr(C), а другой язык вызовет это через FFI. Такой подход удобен, пока речь идёт о простых типах и функциях. Но он плохо подходит для богатых возможностей современных языков: generic-типов, шаблонных функций, сложных моделей владения и абстракций, которые компилятор раскрывает уже в процессе сборки.
Именно generics стали центральной задачей эксперимента. C не знает generic-типов в том виде, в каком их использует Rust, а значит C ABI не умеет передавать такие конструкции между компиляторами без потери смысла. Овадия хотел, чтобы Valen мог вызвать generic-функцию Rust, а Rust, в свою очередь, мог обратиться обратно к коду Valen за нужными типами и значениями. Это уже не обычный FFI-мост, а попытка заставить два компилятора работать как коллег, а не как закрытые ведомства с факсом в коридоре.
Решение получилось двухчастным. Во-первых, Овадия запустил компилятор Rust как библиотеку через rustc_driver, то есть встроил rustc прямо в процесс компилятора Valen. Во-вторых, он пропатчил Rust так, чтобы при встрече с типами Valen компилятор передавал управление Valen-компилятору, ждал результат и продолжал сборку. По словам самого автора, это был самый рискованный участок работы: патч занимает около 100 строк, завязан на генерацию машинного кода через LLVM и не годится для отправки в основной Rust.
В этом и сила, и слабость эксперимента. С одной стороны, Rust без C ABI здесь не выглядит производственным решением, которое можно завтра положить в CI и забыть. С другой — демонстрация показывает направление: вместо обрезания библиотек до примитивов C можно попытаться переносить между языками более сложные абстракции. Для экосистемы Rust это особенно интересно, потому что вокруг неё уже накопилось много библиотек, которые новые языки хотели бы использовать без переписывания с нуля.
Реакция разработчиков получилась ожидаемо нервной, но заинтересованной. Автор канала Let’s Get Rusty назвал работу одной из самых технически увлекательных за последние месяцы и описал её как некий «Rust++». На Reddit и Lobste.rs участники обсуждений хвалили Овадию за попытку заменить C в роли универсального языка для FFI, но спорили о цене такого подхода. Один из скептических аргументов: Rust сам по себе не идеален как фундаментальная платформа совместимости, потому что его система типов тоже имеет ограничения.
Для бизнеса вывод пока простой: покупать билеты на поезд Valen ещё рано, но смотреть на рельсы стоит. Если подобные идеи дозреют до устойчивых инструментов, команды смогут быстрее запускать новые языки поверх зрелой экосистемы Rust, не теряя доступ к библиотекам для графики, системного программирования, сетевого кода и инфраструктуры. Это может снизить стоимость экспериментов с языками внутри компаний, где сейчас любое отклонение от стандартного стека упирается в интеграции, поддержку и вопросы безопасности.
Главный вопрос теперь не в том, можно ли построить Rust без C ABI в лаборатории, а в том, кто захочет превратить такой трюк в поддерживаемую инфраструктуру. Патч на 100 строк — красивый «золотой костыль», но настоящая проверка начнётся там, где появятся стабильные интерфейсы между компиляторами, понятная модель типов и шанс попасть не только в блог разработчика, но и в рабочие сборки больших проектов.