Языки программирования

Rust и C++ должны быть друзьями?

Rust и C++ должны быть друзьями?

Фонд Rust Foundation только что опубликовал заявление о совместимости Rust и C++, и Google выделила 1 доллар на то, чтобы это было сделано.

Есть песня Роджерса и Хаммерстайна под названием The Farmer And The Cowman с первыми строчками:

Фермер и корова должны быть друзьями,
О, фермер и корова должны быть друзьями.
Один любит толкать плуг, другой - гнать корову.
корову,
Но это не причина, почему они не могут быть друзьями.

И далее объясняются различия между ними до такой степени, что в конце концов вы просто должны прийти к выводу, что они должны быть смертельными врагами.

Так и с программистами на Rust и C++. Программисты Rust любят расширять границы проверки заимствований, а программисты C++ любят гоняться за ошибками. Главное, что в этих двух лагерях действительно много неприязни друг к другу. Давайте посмотрим правде в глаза, ребятам из C++ есть что терять и над чем работать, чтобы присоединиться к ребятам из Rust.

Так почему бы не работать вместе и не разграничить понятия?

В этом, вроде как, и пытается убедить нас анонс:

Инициатива признает, что и C++, и Rust играют важную роль в будущем системного программирования. Несмотря на то, что оба языка отлично работают в схожих областях, их эффективное совместное использование крайне важно для организаций, стремящихся найти баланс между безопасностью, производительностью и ремонтопригодностью. Основная проблема заключается в разработке зрелого, стандартизированного подхода к взаимодействию C++ и Rust, несмотря на историческую ориентацию Rust на совместимость с C.

План действий выглядит следующим образом:

  • Улучшить существующие инструменты и решить тактические вопросы в рамках проекта Rust, чтобы уменьшить трудности и риски совместимости в краткосрочной перспективе.
  • Достичь консенсуса вокруг долгосрочных целей, требующих изменений в самом Rust, и разработать тактические подходы, чтобы начать их достижение.
  • Взаимодействие с сообществом и комитетом C++ для улучшения качества взаимодействия обоих языков, чтобы помочь реализовать взаимные цели безопасности и производительности.

«Взаимодействовать с сообществом и комитетом C++», ну что ж, удачи вам!

На более фундаментальном уровне здесь предлагается определить интерфейс иностранных функций (Foreign Function Interface, FFI) и некоторые инструменты, которые можно использовать для создания проектов на смешанных языках. Есть несколько существующих крейтов, которые позволяют Rust вызывать C и C вызывать Rust, но у них есть свои проблемы.

Предложение состоит в том, чтобы использовать C ABI (Application Binary Interface) для определения передачи данных между двумя языками. Это вполне логично, но означает, что оба языка должны прокладывать себе путь через сужение C ABI. Кроме того, существует проблема, связанная с тем, что соединение между двумя языками может привести к появлению небезопасного кода с обеих сторон соединения.

Проблема совместимости между любыми двумя языками обычно сводится к сопоставлению типов данных между ними, которое часто называют маршалингом. Сам по себе маршалинг не сложен, и есть множество примеров его применения - Python на C, C# на C и так далее - но в данном случае мы ищем что-то простое в использовании и безопасное. Хотелось бы посмотреть, как будет решаться проблема псевдонимов в C, не говоря уже об указателях вообще!

Одно очевидно. Для достижения этой цели потребуются программисты, владеющие обоими языками на исключительном уровне.

Читайте также