Создатель языка Valen научил дженерики Rust работать с другими языками

Создатель языка Valen научил дженерики Rust работать с другими языками

Эван Овадия, бывший инженер Google, один из ключевых разработчиков языка Mojo, а также автор собственного языка программирования Valen (развитие более раннего проекта Vale, задуманного как более быстрый и удобный аналог Rust). Разрабатывая Valen, он столкнулся с проблемой: он хотел использовать в новом языке существующие библиотеки Rust (в частности, графическую библиотеку wgpu), но стандартный способ связывать код на разных языках, через C ABI (интерфейс двоичной совместимости) и Foreign Function Interface (FFI), не поддерживает дженерики (обобщённые типы и функции с параметрами-заполнителями), потому что сам язык C такой концепции не знает. У Rust есть собственный ABI, но он не даёт гарантий стабильности.

Овадия описал решение в блоге и назвал его "Golden Spike" ("золотой костыль"), по аналогии с последним, символическим костылём, которым в США завершили строительство первой трансконтинентальной железной дороги: вместо того чтобы "разбирать" богатые возможности библиотек до примитивов ради грубого C ABI, компиляторы двух языков соединяются напрямую.

Решение состоит из двух частей. Во-первых, Овадия использует штатную возможность компилятора Rust, rustc_driver, которая позволяет запускать сам rustc как библиотеку и встраивать его в память процесса Valen. Во-вторых, он написал патч к компилятору Rust: когда тот встречает "чужой" тип из Valen, он передаёт управление компилятору Valen и дожидается результата. Патч занимает около 100 строк кода, но, по словам самого Овадии, это была "самая рискованная часть всей затеи" и, по сути, "ядерный вариант" (nuclear option): патч хакерский, рассчитан на то, что Rust использует LLVM для генерации машинного кода (что верно не всегда), и, как признаёт сам автор, "работает, но точно не подходит для включения в официальный проект" (not upstreamable).

Ведущий YouTube-канала Let's Get Rusty назвал работу Овадии "самой увлекательной технической вещью, которую я читал за многие месяцы", и охарактеризовал подход как "Rust++". На форумах Reddit и Lobste.rs программисты в целом высоко оценили саму попытку решить сложную задачу, но высказывали сомнения: один из комментаторов отметил, что идея заменить C как "универсальный язык FFI", "очень смелый выбор, который потребует немало усилий", а другой читатель предположил, что из-за особенностей собственной системы типов Rust может быть не лучшим кандидатом на роль языка для межъязыковой совместимости, и предложил представить, что подобные привязки можно было бы построить поверх языка Ada.

Автор статьи отмечает, что работа Овадии, реальный шаг вперёд в межъязыковой совместимости компиляторов и в перспективе открывает возможность использовать Rust как основу ("библиотеку"), из которой можно было бы "выращивать" другие новые языки; при определённых доработках самого Rust зависимость от устаревающего C ABI однажды может остаться в прошлом.

Ключевые факты

  • Эван Овадия, участник разработки языка Mojo и бывший инженер Google, создал технику "Golden Spike" для передачи обобщённых типов (дженериков) между Rust и его новым языком Valen, то, чего не поддерживает C ABI.
  • Проблема в том, что C ABI (и сам язык C) не понимает концепцию дженериков, поэтому обычный способ связи кода на разных языках через FFI для генериков не работает.
  • Решение состоит из двух шагов: запуск компилятора Rust как библиотеки через штатный механизм rustc_driver и патч компилятора Rust объёмом около 100 строк кода, который передаёт управление компилятору Valen при встрече с его типами.
  • Сам Овадия называет патч "ядерным вариантом" и признаёт, что он хакерский, завязан на LLVM и не годится для включения в официальный проект Rust.
  • Ведущий YouTube-канала Let's Get Rusty назвал работу "самой увлекательной технической вещью за месяцы", а сообщество на Reddit и Lobste.rs отреагировало с интересом, но и с оговорками насчёт пригодности Rust для этой роли.

Почему это важно

Стандартный способ связывать код на разных языках программирования, через C ABI и FFI, не умеет передавать обобщённые типы (дженерики), потому что сам язык C такой концепции не знает. Эван Овадия, разрабатывая собственный язык Valen (наследник Vale, задуманный как более быстрый и удобный аналог Rust), захотел использовать в нём существующие библиотеки Rust напрямую, без потери возможностей дженериков. Его техника "Golden Spike" впервые показывает работающий способ передавать обобщённые типы и функции между компиляторами двух разных языков в обе стороны.

Кому это важно

Разработчикам новых языков программирования, которые хотят опираться на существующую экосистему библиотек Rust, не переписывая их с нуля; сообществу Rust, поскольку решение затрагивает внутренние механизмы компилятора (rustc_driver) и требует патча самого rustc; исследователям и энтузиастам темы межъязыковой совместимости компиляторов в целом.

Как это применить

Метод состоит из двух частей: во-первых, компилятор Rust запускается как библиотека через встроенную возможность rustc_driver и встраивается прямо в память процесса Valen; во-вторых, в компилятор Rust внесён патч примерно на 100 строк кода, который при встрече с типами Valen передаёт управление компилятору Valen и ждёт результата. По признанию самого автора, это решение сработало, но остаётся хакерским, привязано к использованию LLVM для генерации машинного кода и не подходит для включения в официальный проект Rust.

Можно ли доверять

Материал The Register пересказывает технический блог-пост самого Эвана Овадии и реакцию сообщества на форумах Reddit и Lobste.rs, а также комментарий ведущего YouTube-канала Let's Get Rusty. В тексте не указаны дата публикации ни блог-поста, ни самой статьи, не приведены ссылки на обсуждения и не названы имена ведущего и комментаторов, это стоит учитывать при проверке деталей из первых рук.

Риски и подводные камни

Сам Овадия прямо называет патч компилятора Rust "ядерным вариантом" и самой рискованной частью всей работы: решение хакерское, рассчитано на использование LLVM (что для Rust верно не всегда) и, по его собственным словам, "точно не подходит для включения в апстрим". Официальной позиции или поддержки со стороны проекта Rust в источнике не упоминается. Комментаторы на форумах также отметили, что из-за особенностей собственной системы типов Rust может оказаться не идеальным кандидатом на роль универсального языка для межъязыковой совместимости.

«Так центральный вопрос, главная загадка, которую нужно решить: как нам сделать кросс-языковые дженерики?»

— Эван Овадия