Выпуск Rust 1.89. Около 8% в Debian Sid завязаны на Rust

Опубликован релиз языка программирования Rust 1.89, основанного проектом Mozilla, но ныне развиваемого под покровительством независимой некоммерческой организации Rust Foundation. Язык сфокусирован на безопасной работе с памятью и предоставляет средства для достижения высокого параллелизма выполнения заданий, при этом обходясь без использования сборщика мусора и runtime (runtime сводится к базовой инициализации и сопровождению стандартной библиотеки).

Методы работы с памятью в Rust избавляют разработчика от ошибок при манипулировании указателями и защищают от проблем, возникающих из-за низкоуровневой работы с памятью, таких как обращение к области памяти после её освобождения, разыменование нулевых указателей, выход за границы буфера и т.п. Для распространения библиотек, обеспечения сборки и управления зависимостями проектом развивается пакетный менеджер Cargo. Для размещения библиотек поддерживается репозиторий crates.io.

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

Основные новшества:

  • Предоставлена возможность использования символа “_” в качестве аргумента обобщённых параметров с признаком “const” для выведения значений этих параметров на основе окружающего контекста. pub fn all_false() -> [bool; LEN] { [false; _] }
  • Добавлено новое lint-предупреждение “mismatched_lifetime_syntaxes”
    для решение проблемы неочевидного определения времени жизни в сигнатурах функций при использовании механизма “lifetime elision” (автоматически определяет время жизни ссылок, позволяя обойтись без его ручного указания). Предупреждение выполняет проверку того, что входные и выходные параметры функции принадлежат к одной и той же группе типов. Группы формируются на основе поддержки явного задания времени жизни и возможности автоматического вывода времени жизни компилятором (например, в типах “&’a T” и “ContainsLifetime<‘a>” может явно присутствовать время жизни, но компилятор не может автоматически определить время жизни, в а типах “&T”, “&’_ T” и “ContainsLifetime<‘_>” допускается как явное задание, так и автоматическое определение).
  • В атрибуте “target_feature” для систем x86 реализована возможность проверки поддержки расширенных наборов инструкций sha512, sm3, sm4, kl и widekl, а также отдельных функций avx512. #[target_feature(enable = “avx512bw”)] pub fn cool_simd_code(/* .. */) -> /* … */ { /* … */ }
  • Обеспечен запуск doctest (тесты, встроенные в документацию) не только для текущей целевой платформы, но и для других платформ, указанных при запуске пакетного менеджера “cargo” (“cargo test –doc –target other_target”).
  • Для функций ‘extern “C”‘ при сборке для целевой платформы “wasm32-unknown-unknown” реализован стандартный C ABI для WebAssembly.
  • С некоторыми оговорками, касающимися совместимости типов, разрешено использование типов i128 и u128 во внешних Си-функциях (extern “C”), для которых ранее показывалось lint-предупреждение “improper_ctypes_definitions”.
  • В разряд стабильных переведена новая порция API, в том числе стабилизированы методы и реализации типажей:

    Признак “const” применён в функциях:

    • <[T; N]>::as_mut_slice
    • <[u8]>::eq_ignore_ascii_case
    • str::eq_ignore_ascii_case
  • Начался процесс перевода целевой платформы “x86_64-apple-darwin” с первого уровня поддержки на второй (Apple планирует прекратить поддержку архитектуры x86_64). Первый уровень поддержки подразумевает формирование бинарных сборок, проведение досконального тестирования и предоставление наивысшей гарантии поддержки платформы – каждое изменение в компиляторе проверяется выполнением полного тестового набора. Второй уровень поддержки подразумевает гарантию сборки, но отсутствие гарантий при прохождении тестового набора.
  • Реализован третий уровень поддержки платформ “loongarch32-unknown-none” и “loongarch32-unknown-none-softfloat”. Третий уровень подразумевает базовую поддержку, но без автоматизированного тестирования, публикации официальных сборок и проверки возможности сборки кода.

Дополнительно можно отметить связанные с Rust события и проекты:

  • Опубликован отчёт о состоянии пакетов на языке Rust в Debian. Отмечается, что в ветке Debian Unstable (Sid) около 8% src-пакетов в репозитории main связаны сборочными зависимостями как минимум с одним пакетом “librust-*”. В Debian 12 подобных пакетов было 4.5%. Также отмечено, что более 3 тысяч пакетов включают код на языке Rust, вынесенный в пакеты librust-..-dev, а 150 src-пакетов поставляют скомпилированные исполняемые файлы или библиотеки Rust.
  • Представлен проект tmux-rs, развивающий клон мультиплексора терминала tmux (консольный оконный менеджер), переписанный с Си на Rust.
  • Разработчик драйвера Tyr из компании Сollabora, опубликовал статью об устройстве работающих на уровне ядра драйверов для GPU и принципах разработки таких драйверов на языке Rust.
  • Демонстрация универсального приложения на языке Rust, способного выполнять как на CPU, так и на различных платформах GPU: CUDA для NVIDIA, SPIR-V для GPU с поддержкой Vulkan, Metal для Apple, DirectX 12 для Windows, WebGPU для браузеров.

Release. Ссылка here.