Рекомендуем
VPS на Windows и Linux — от 49 ₽ за 7 дней Быстрый запуск сервера на NVMe для сайтов, ботов и других задач.
Выбрать VPS

Rust 1.99.0 расширил FFI с C и ускорил rustdoc до 40%

Rust 1.99.0 опубликован 1 октября 2026 года и заметно расширяет возможности системного программирования на стабильной ветке языка. Разработчики получили определение C-variadic функций прямо в Rust, новые API для работы с layout через raw pointers, изменённое поведение Cargo в CI и ускорение rustdoc до 40% на отдельных реальных проектах.

Rust 1.99.0 расширил FFI с C и ускорил rustdoc
Rust 1.99.0 расширил FFI с C и ускорил rustdoc

Stable Rust теперь умеет определять C-variadic функции

Одна из самых заметных границ между Rust и C стала тоньше. До версии 1.99 стабильный Rust умел вызывать внешние функции с переменным числом аргументов, такие как printf, но определение собственных C-variadic функций оставалось за пределами стабильного языка.

Rust 1.99.0 стабилизирует такие определения для ABI extern "C" и extern "C-unwind". Речь идёт о функциях, где после фиксированной части сигнатуры передаётся переменное число аргументов через ....

Для чтения этих аргументов используется VaList, ABI-совместимый с C-типом va_list. Набор типов, которые можно извлекать из списка, ограничивается трейтом VaArgSafe. Сам механизм относится к низкоуровневой области Rust и связан с unsafe, поскольку корректность типов и количества аргументов определяется соглашением между вызывающим и вызываемым кодом.

Практический сценарий здесь довольно конкретный: библиотеки, плагины, драйверы и системные компоненты, которые должны экспортировать C-совместимый интерфейс, теперь могут описывать часть таких точек входа непосредственно на стабильном Rust. Раньше подобный код чаще требовал C-прослойки, nightly-возможностей или иной архитектуры интерфейса.

В том же релизе стабилизирована возможность определять вариативные #[unsafe(naked)] функции через inline assembly. Это ещё более специализированный сценарий, характерный для runtime-кода, низкоуровневых библиотек и участков, где разработчик полностью контролирует пролог и эпилог функции.

Официальное объявление Rust 1.99.0 отдельно выносит C-variadic функции в число ключевых изменений релиза.

Raw pointers получили стабильные API для определения размера и выравнивания

Вторая заметная группа изменений касается памяти. Rust 1.99.0 стабилизирует три функции:

  • Layout::for_value_raw;
  • mem::size_of_val_raw;
  • mem::align_of_val_raw.

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

Такие API встречаются в аллокаторах, FFI-слоях, контейнерах с ручным управлением памятью и собственных структурах хранения. Стабилизация фиксирует и требования безопасности для их использования, что особенно существенно в коде, где ошибка в расчёте layout может привести к некорректному доступу к памяти.

В стандартной библиотеке появились и связанные инструменты: Box::into_non_null, Box::from_non_null, Vec::into_parts и Vec::from_parts. Они дают более прямой доступ к внутренним частям управляемых контейнеров без самодельного разбора указателей и ёмкости.

На этом фоне изменилась документация Box::leak. Семантика языка в Rust 1.99.0 здесь осталась прежней, но команда Rust теперь предостерегает от схемы, где память сначала «утекает» через Box::leak, а затем вручную возвращается к обычному освобождению. В документации такой round-trip связывают с проблемными взаимодействиями с оптимизациями компилятора и будущей стабилизацией пользовательских аллокаторов. Для подобных случаев в стандартной библиотеке теперь отдельно выделен Box::into_non_null.

Cargo меняет поведение сборки в CI и вводит профиль debug

Cargo 1.99 получил изменение, которое может проявиться даже в проектах без нового синтаксиса Rust: incremental compilation теперь отключается по умолчанию, когда среда определяется как CI через переменную CI.

Инкрементальная компиляция хранит промежуточное состояние, чтобы повторные локальные сборки могли переиспользовать уже выполненную работу. В типичном CI задача часто запускается в новой среде, и накопленное состояние между сборками может отсутствовать. Rust 1.99 фиксирует отдельное поведение Cargo для такого режима на уровне самого инструмента.

Одновременно появился встроенный профиль debug. Сейчас он эквивалентен привычному dev, поэтому немедленной разницы в параметрах сборки между ними нет. Команда Cargo описывает новый профиль как подготовку к будущему изменению dev, где приоритет планируется сместить в сторону более быстрых циклов разработки.

Ещё одно изменение касается workspace на edition 2024 и новее. Участник workspace теперь может переопределить default-features для зависимости, унаследованной из корневой конфигурации. Запись вида serde = { workspace = true, default-features = false } действительно отключает стандартные features даже тогда, когда на уровне workspace они включены. Для более ранних editions такое значение игнорируется с предупреждением.

В самом Cargo 1.99 команда проекта также отмечает серию внутренних оптимизаций: использование FxHasher в части hash map и set, а также сокращение лишних выделений памяти при разборе manifest-файлов и registry index.

Rustdoc ускорил фильтрацию реализаций трейтов до 40%

Самая наглядная цифра релиза относится к генерации документации. В Rust 1.99 rustdoc получил более умную фильтрацию trait implementations, и разработчики Rust сообщают о среднем ускорении примерно на 20%. На отдельных реальных crates выигрыш достигает 40%.

Это изменение особенно заметно в библиотеках с большим количеством трейтов, generic-кода и автоматически генерируемых реализаций, где rustdoc приходится обрабатывать крупный граф типов перед созданием HTML-документации.

Появился и новый lint unused_footnote_definition. Он отслеживает определения сносок в документации, которые нигде не используются. Для проектов, где API-документация хранится прямо в исходниках, такая проверка помогает выявлять фрагменты Markdown, оставшиеся после редактирования.

Rust 1.99.0 одновременно повышает статус riscv64-unknown-linux-musl до Tier 2 with Host Tools. Для Rust это означает официальные сборки библиотек для target и возможность использовать саму платформу как среду разработки с нативными host tools, включая rustc и cargo. Уровень Tier 2 гарантирует сборку target, хотя полный набор тестов для таких платформ запускается не всегда.

Во внутренних компонентах toolchain релиз переходит на LLVM 23. В release notes это изменение отнесено к внутренним, поскольку публичный интерфейс Rust напрямую от версии LLVM не меняется.

Rust 1.99.0 жёстче фиксирует несколько старых пограничных случаев

Часть изменений проявится в виде новых предупреждений и ошибок при сборке существующего кода. Legacy-модули целочисленных типов окончательно помечены как deprecated: старый путь std::i32::MAX уступает современному i32::MAX.

Проверка no_mangle_generic_items теперь стала hard error. Такая конструкция опасна тем, что generic-функция может порождать несколько конкретных инстанцирований, а no_mangle предполагает фиксированное внешнее имя символа. Компилятор больше не оставляет этот случай на уровне предупреждения.

Макросы из внешних crates, которые разворачиваются в выражение с завершающей точкой с запятой, теперь могут вызывать lint semicolon_in_expressions_from_non_local_macros. Раньше подобные предупреждения для чужих макросов подавлялись, из-за чего проблема могла оставаться незаметной в интеграционных тестах.

Есть и более тонкое изменение у RangeInclusive. Оптимизация итерации по диапазонам a..=b изменила некоторые наблюдаемые значения уже исчерпанного итератора, включая возможный результат start() и end(). Команда Rust отдельно указывает, что такое состояние не имело гарантированного стабильного поведения, поэтому изменение не считается breaking change.

Полный набор языковых, библиотечных и compatibility-изменений опубликован в release notes Rust 1.99.0.

Rust 1.99.0 переносит ещё несколько низкоуровневых сценариев в stable

Rust 1.99.0 собрал в одном выпуске изменения, которые затрагивают разные уровни toolchain. FFI с C получает возможность определять вариативные функции, стандартная библиотека расширяет работу с raw pointers и внутренностями контейнеров, Cargo отдельно учитывает CI-среду, а rustdoc сокращает время генерации документации на измеримых реальных проектах.

Для большей части прикладного кода новый синтаксис C-variadic функций останется незаметным. В системных библиотеках, runtime-компонентах и FFI этот релиз сокращает число сценариев, которым раньше требовались обходные пути вокруг stable Rust.

После выхода 1.99.0 интерес представляет уже не наличие этих возможностей — они закреплены в стабильном toolchain, — а их эффект на крупные рабочие проекты: насколько изменятся времена CI-сборок при новом поведении Cargo и насколько равномерно ускорение rustdoc проявится за пределами измеренных crates.

При использовании материалов сайта необходимо указывать ссылку на TGLand.ru. Если вы копируете фрагменты текста в интернете, прямая гиперссылка, доступная для индексации поисковыми системами, должна быть размещена в начале материала.

Вам также может понравиться