Rust хочет избавиться от Pin: неподвижные типы и гарантированные деструкторы

· Linux и open source
Команда Rust приняла проектную цель на 2026–2027 годы: ввести трейты Move и Forget, позволяющие типам отказаться от перемещения и «забывания». Это должно упростить работу с самоссылающимися типами и в перспективе полностью вытеснить механизм Pin.

cover.svg

Проект Rust утвердил цель на 2026–2027 годы, автором которой выступает разработчик под ником @lcnr. Речь идёт о фундаментальном допущении, встроенном в язык с самого начала: любое значение можно переместить в памяти (relocate) и «забыть» через mem::forget, не запуская деструктор. Оба предположения зашиты в семантику — присваивание перемещает значения, а mem::forget считается безопасной операцией. Однако некоторым типам эти способности только мешают.

Зачем это нужно

Первый случай — неподвижные типы. Многие асинхронные футуры по своей природе самоссылающиеся, а такие структуры нельзя безопасно перемещать. Сегодня проблему решает Pin, который кодирует неподвижность как свойство места, а не типа. Авторы прямо называют это источником избыточной сложности, особенно болезненной в ядре Linux.

Второй случай — гарантированные деструкторы. Тип Transaction может требовать вызова commit() или rollback() перед уничтожением, а хендл ограниченной по времени задачи обязан дождаться её завершения. Но поскольку mem::forget безопасен, язык не может гарантировать выполнение деструктора.

Что предлагается

Вместо заплаток вводятся новые авто-трейты, описывающие возможности типа. Формулировка нарочно позитивная — трейт означает наличие способности:

  • Move — тип можно перемещать в памяти;
  • Destruct — деструктор запускается при выходе из области видимости;
  • Forget — тип можно забыть без запуска деструктора.

Этот подход повторяет логику работы над иерархией Sized, которая ослабила правило «размер всех типов известен на этапе компиляции». Типы, помеченные !Move, обязаны сохранять стабильный адрес на всё время жизни — это проще, чем Pin, потому что неподвижность становится свойством самого типа. А !Forget открывает дорогу к безопасному scoped spawn: деструктор хендла гарантированно дожидается задачи, поэтому она не сможет пережить область видимости и обратиться к висячим ссылкам.

Планы и границы

За год команда намерена реализовать MVP в компиляторе, написать RFC и проверить жизнеспособность идеи на реальном коде ядра Linux, где самоссылающихся структур особенно много. Тестирование берёт на себя @BennoLossin.

Далёкая цель авторов — полностью отказаться от Pin. Логика такова: раз Rust обещает вечную обратную совместимость, делать pin языковой конструкцией наравне с & и mut значит поддерживать её бесконечно. Поэтому Move подаётся не как дополнение к экспериментам по эргономике Pin, а как их прямая альтернатива.

За рамки года сознательно вынесено всё, что касается трейта Future — единственного стабильного трейта, зависящего от Pin. Его переработку решено вести отдельным проектом, поскольку зависимость от Pin — далеко не единственная его проблема.


Источник: Hacker News

Комментарии

Войдите, чтобы комментировать.

  • Пока нет комментариев.