Опубликован релиз языка программирования Rust 1.68

Основные статьи:

2023

Rust 1.68

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

Rust 1.68

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

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

Основные изменения:

  • В пакетном менеджере Cargo и репозитории crates.io стабилизирована поддержка протокола Sparse, определяющего способ работы с индексом, в котором отражены доступные версии всех существующих в репозитории пакетов. Обновленный протокол позволяет оптимизировать скорость работы с crates.io и решить проблемы с масштабированием при дальнейшем росте числа пакетов в репозитории.
  • Для сокращения задержек, возникающих из-за загрузки полного индекса, в Sparse вместо доступа к индексу с использованием Git задействована прямая загрузка по HTTPS только необходимых индексных данных, охватывающих зависимости конкретного проекта. Для отдачи индексных данных задействован сервис index.crates.io. По умолчанию протокол планируют задействовать в ветке Rust 1.70, а до этого для его включения можно установить переменную окружения "CARGO_REGISTRIES_CRATES_IO_PROTOCOL=sparse" или добавить в секцию "registries.crates-io" файла .cargo/config.toml параметр 'protocol = "sparse"'.
  • Добавлен макрос "pin!", позволяющий создать структуру Pin<&mut T> из выражения "T" с локальным закреплением его состояния (в отличие от Box::pin не выделяет память в куче, а выполняет привязку на уровне стека).
  • Предложен применяемый по умолчанию обработчик ошибок распределения памяти, применяемый при использовании штатного пакета alloc. Приложения в которых включается только alloc (без std) при сбоях выделения памяти отныне будут вызывать обработчик "panic!", который при желании может быть перехвачен при помощи "#panic_handler". Программы, использующие библиотеку std, как и раньше будут выводить информацию об ошибке в stderr и аварийно завершать выполнение.
  • В разряд стабильных переведена следующая порция API, в том числе стабилизированы методы и реализации типажей:
    • {core,std}::pin::pin!
    • impl From for {f32,f64}
    • std::path::MAIN_SEPARATOR_STR
    • impl DerefMut for PathBuf
  • Признак "const", определяющий возможность использования в любом контексте вместо констант, применён в функции VecDeque::new.
  • Для работы на платформе Android теперь требуется как минимум NDK r25 (API 19), т.е. минимальная поддерживаемая версия Android повышена до 4.4 (KitKat).
  • Реализован третий уровень поддержки для платформы Sony PlayStation Vita (armv7-sony-vita-newlibeabihf). Третий уровень подразумевает базовую поддержку, но без автоматизированного тестирования, публикации официальных сборок и проверки возможности сборки кода[1].

Rust 1.67

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

Rust 1.67. Иллюстрация: i.ytimg.com.

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

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

Основные изменения:

  • Для функций async с Future::Output реализована возможность указания аннотаций "#[must_use]", включающих вывод предупреждения в случае игнорирования возвращаемого значения, что помогает выявить ошибки, вызванные предположением, что функция изменит значения, а не вернёт новое значение.
  • Обновлена реализация FIFO-очередей std::sync::mpsc (multi-producer single-consumer), которая переведена на использование модуля crossbeam-channel с сохранением прежнего API. Данная реализация отличается решением ряда проблем, более оптимальной производительностью и оптимизацией сопровождения кода.
  • В разряд стабильных переведена порция API, в том числе стабилизированы методы и реализации типажей.
  • Признак "const", определяющий возможность использования в любом контексте вместо констант, применён в функциях:
    • char::from_u32
    • char::from_digit
    • char::to_digit
    • core::char::from_u32
    • core::char::from_digit
  • Реализован третий уровень поддержки для использования Rust в ядре Linux (linuxkernel), а также для платформ Sony PlayStation 1 (mipsel-sony-psx), PowerPC с AIX (powerpc64-ibm-aix), QNX Neutrino RTOS (aarch64-unknown-nto-qnx710, x86_64-pc-nto-qnx710). Третий уровень подразумевает базовую поддержку, но без автоматизированного тестирования, публикации официальных сборок и проверки возможности сборки кода.

Дополнительно можно отметить публикацию компанией ARM патчей, позволяющих использовать язык Rust для разработки драйверов и модулей ядра Linux, собираемых для систем на базе архитектуры AArch64[2].

2022

Rust 1.63

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

Rust 1.63. Фото: wallup.net.

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

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

Основные изменения:

  • Добавлен API std::thread::scope, позволяющий создавать потоки в привязке к области видимости (Scoped threads). В отличие от ранее доступных потоков данный API std::thread::scope допускает передачу заимствованных (borrowing) нестатических данных, в то время как потоки, создаваемые при помощи классического API std::thread::spawn, должны были владеть всеми передаваемыми аргументами и не могли получать заимствованные переменные. API std::thread::scope обеспечивает, что любые порождённые потоки будут завершены до возвращения данных, обеспечивая должный уровень безопасности для механизма заимствования.
  • Предложены дополнительные типы-обвязки для файловых дескрипторов - BorrowedFd и OwnedFd, обеспечивающие заимствование и владение. Типы помечены при помощи "#[repr(transparent)]", что позволяет напрямую использовать их во внешних Си-привязках с учётом владения.
  • Предоставлена возможность вызова Condvar::new, Mutex::new и RwLock::new в контексте констант для создания глобальных статических значений Mutex, RwLock и Condvar без применения пакетов типа lazy_static.
  • Для функций типа fn foo(value: T, f: impl Copy) разрешено использование синтаксиса вида "foo::(3, 3)", явно указывая тип дженерика.
  • Завершён переход на использование техники NLL (Non-Lexical Lifetimes) для выявления проблем с заимствованием переменных. NLL осуществляет учёт на уровне набора указателей в графе потока выполнения, что позволяет оптимизировать качество проверки заимствования переменных (borrow checker) и допустить выполнение некоторых видов корректного кода, использование которого ранее приводило к выводу ошибки. Поддержка старого механизма, использовавшего привязку времени жизни на лексическом уровне, теперь полностью удалена из rustc, а использование другого NLL внедрено повсеместно.
  • В разряд стабильных переведена очередная порция API, в том числе стабилизированы методы и реализации типажей:
    • array::from_fn
    • Box::into_pin
    • BinaryHeap::try_reserve
    • BinaryHeap::try_reserve_exact
    • OsString::try_reserve
    • OsString::try_reserve_exact
    • PathBuf::try_reserve
    • PathBuf::try_reserve_exact
    • Path::try_exists
    • Ref::filter_map
    • RefMut::filter_map
    • NonNull::<[T]>::len
    • ToOwned::clone_into
    • Ipv6Addr::to_ipv4_mapped
    • unix::io::AsFd
    • unix::io::BorrowedFd<'fd>
    • unix::io::OwnedFd
    • windows::io::AsHandle
    • windows::io::BorrowedHandle<'handle>
    • windows::io::OwnedHandle
    • windows::io::HandleOrInvalid
    • windows::io::HandleOrNull
    • windows::io::InvalidHandleError
    • windows::io::NullHandleError
    • windows::io::AsSocket
    • windows::io::BorrowedSocket<'handle>
    • windows::io::OwnedSocket
    • thread::scope
    • thread::Scope
    • thread::ScopedJoinHandle
  • Признак "const", определяющий возможность использования в любом контексте вместо констант, применён в функциях:
    • array::from_ref
    • slice::from_ref
    • intrinsics::copy
    • intrinsics::copy_nonoverlapping
    • <*const T>::copy_to
    • <*const T>::copy_to_nonoverlapping
    • <*mut T>::copy_to
    • <*mut T>::copy_to_nonoverlapping
    • <*mut T>::copy_from
    • <*mut T>::copy_from_nonoverlapping
    • str::from_utf8
    • Utf8Error::error_len
    • Utf8Error::valid_up_to
    • Condvar::new
    • Mutex::new
    • RwLock::new
  • Дополнительно можно отметить инициативу по использованию языка Rust для написания работающего на уровне ядра Linux драйвера для GPU Apple AGX, используемого в чипах Apple M1 и M2. Отмечается, что GPU Apple AGX выполняет прошивку и использует достаточно сложные совместно используемые структуры данных. Реализация управления прошивками и структурами на Rust позволила бы оптимизировать разработку и добиться более высокой безопасности. Рассматриваются два варианта разработки: написание основой части на Си, но использование компонентов на Rust для взаимодействия с прошивкой и управления структурами данных в разделяемой памяти, или написание всего драйвера на Rust и создание Rust-обвязки для подсистемы DRM.

Rust 1.62

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

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

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

Основные изменения:

  • В пакетном менеджере "cargo" предложена команда "add", позволяющая из командной строки добавлять в манифест Cargo.toml новые зависимости или изменять имеющиеся зависимости. Команда также позволяет указывать отдельные свойства (feature) и версии, например:
    cargo add serde --features derive
    cargo add nom@5
  • Добавлена возможность использования "#[derive(Default)]" с перечислениями (enum), в которых при помощи атрибута "#[default]" определён вариант по умолчанию.
    #[derive(Default)]
    enum Maybe {
    #[default]
    Nothing,
    Something(T),
    }
  • На платформе Linux задействована более компактная и быстрая реализация механизма синхронизации Mutex, основанная на применении фьютексов, предоставляемых ядром Linux. В отличие от ранее используемой реализации на базе библиотеки pthreads, для хранения состояния Mutex в новом варианте расходуется всего 5 байт вместо 40. Аналогично на futex переведены механизмы блокировок Condvar и RwLock.
  • Реализован второй уровень поддержки целевой платформы x86_64-unknown-none, предназначенной для формирования исполняемых файлов, способных работать без операционной системы. Например, указанная целевая платформа может использоваться при написании компонентов ядра. Второй уровень поддержки подразумевает гарантию сборки.

Реализован третий уровень поддержки для платформ aarch64-pc-windows-gnullvm и x86_64-pc-windows-gnullvm. Третий уровень подразумевает базовую поддержку, но без автоматизированного тестирования, публикации официальных сборок и проверки возможности сборки кода.

  • В разряд стабильных переведена добавленная порция API, в том числе стабилизированы методы и реализации типажей:
    bool::then_some
    f32::total_cmp
    f64::total_cmp
    Stdin::lines
    windows::CommandExt::raw_arg
    impl значение по умолчанию для AssertUnwindSafe
    From<>> для Rc<[u8]>
    From<>> для Arc<[u8]>
    FusedIterator для EncodeWide[3]

Rust 1.60

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

Rust 1.60

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

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

Основные возможности:

  • В компиляторе rustc стабилизирована основанная на LLVM система для генерации coverage-данных, используемых для оценки охвата кода при тестировании. Для включения coverage-данных при сборке необходимо использовать флаг "-Cinstrument-coverage", например, запуская сборку командой "RUSTFLAGS="-C instrument-coverage" cargo build". После запуска собранного таким образом исполняемого файла в текущем каталоге будет сохранён файл default.profraw, для обработки которого можно использовать утилиту llvm-profdata из компонента llvm-tools-preview. Обработанный утилитой llvm-profdata вывод затем можно передать программе llvm-cov для генерации аннотированного отчёта со сведениями об охвате кода. Информация о привязке к исходным текстам берётся из исследуемого исполняемого файла, в который включаются необходимые данные о связи coverage-счётчиков с кодом.
  • В пакетном менеджере cargo стабилизирована поддержка флага "--timings", включающего формирование детального отчёта о ходе сборки и времени выполнения каждого шага. Отчёт может оказаться полезен для оптимизации производительности сборочного процесса.
  • В пакетном менеджере cargo предложен дополнительный синтаксис для механизма условной компиляции и выбора необязательных зависимостей, настраиваемого в файле Cargo.toml через перечисление списка именованных свойств в секции features и активируемого через включение свойств во время сборки пакета при помощи флага "--features". В данной версии добавлена поддержка зависимостей в отдельных пространствах имён и слабых (weak) зависимостей.
  • В первом случае реализована возможность использования внутри секции "features" элементов с префиксом "dep:" для явной привязки к необязательной зависимости без неявного представления этой зависимости как свойства (feature). Во втором случае добавлена поддержка пометки знаком "?" ("package-name?/feature-name") необязательных зависимостей, которые следует включить только, если какое-то другое свойство включает данную необязательную зависимость.
  • Возвращена отключённая в прошлом выпуске поддержка инкрементальной компиляции. Ошибка в компиляторе, из-за которой функция была отключена, устранена.
  • Решены некоторые проблемы с предоставлением для таймеров Instant гарантии монотонного расчёта времени, при котором учитывается время, проведённое системой в спящем режиме. Ранее для работы таймера по возможности использовался OS API, который не учитывал проблемные ситуации, нарушающие монотонность времени, такие как проблемы с оборудованием, применение виртуализации или ошибки в операционной системе.
  • В разряд стабильных переведена порция API, в том числе стабилизированы методы и реализации типажей.
  • Реализован третий уровень поддержки для платформ mips64-openwrt-linux-musl и armv7-unknown-linux-uclibceabi (softfloat). Третий уровень подразумевает базовую поддержку, но без автоматизированного тестирования, публикации официальных сборок и проверки возможности сборки кода.
  • Компилятор переведён на использование LLVM 14.

Дополнительно можно отметить:

  • Добавлена поддержка раскрутки компилятора (bootstrapping) rustc при помощи бэкенда rustc_codegen_gcc, позволяющего использовать библиотеку libgccjit от проекта GCC в качестве генератора кода в rustc, что позволяет обеспечить в rustc поддержку доступных в GCC архитектур и оптимизаций. Под раскруткой компилятора понимается возможность использования в rustc генератора кода на основе GCC для сборки самого компилятора rustc. С практической стороны подобная возможность позволяет собирать rust-программы для архитектур, ранее не поддерживаемых в rustc.
  • Доступен выпуск инструментария uutils coreutils 0.0.13, в рамках которого развивается аналог пакета GNU Coreutils, переписанный на языке Rust. В состав coreutils входит более ста утилит, включая sort, cat, chmod, chown, chroot, cp, date, dd, echo, hostname, id, ln и ls. Целью проекта является создание кроссплатформенной альтернативной реализации Coreutils, способной работать в том числе на платформах Windows, Redox и Fuchsia, а также распространение под пермиссивной лицензией MIT, вместо копилефт-лицензии GPL.

В данной версии оптимизированы реализации многих утилит, в том числе совместимость утилит cp, dd, df, split и tr с аналогами от проекта GNU. Предоставлена online-документация. Для разбора аргументов командной строки задействован парсер clap, что позволило оптимизировать вывод для флага "--help" и добавить поддержку аббревиатур длинных команд (например, можно указывать "ls --col" вместо "ls --color")[4].

2021: Google включила Rust в число основных языков для разработки Android

В начале апреля 2021 года Google сообщила о включении языка программирования Rust в число языков, которые допускаются для разработки Android. Поддержка Rust реализована в рамках проекта по усилению защищенности, продвижению методов безопасного программирования и повышению эффективности обнаружения проблем при работе с памятью в Android.

По сообщению Google, несмотря на то, что команда разработчиков вкладывает много усилий и ресурсов в обнаружение, исправление и смягчение последствий данного класса багов, все же около 70% из всех опасных уязвимостей, выявленных в Android, по-прежнему вызваны ошибками при работе с операционной системой. Использование языка Rust, который ориентирован на безопасную работу с памятью и обеспечивает автоматическое управление памятью, позволит снизить риск возникновения уязвимостей, вызванных ошибками при взаимодействии с памятью.

Google включила Rust в список языков для разработки Android

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

В Google отметили, что перезаписи существующего кода C/C++ на Rust не будет, язык будет использован для написания нового кода. Это связано с тем, что большинство ошибок обнаруживается в новом или недавно измененном коде - около 50% выявляемых ошибок работы с памятью в Android определяются в коде, написанном менее года назад.[5]

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

Примечания

  1. Выпуск языка программирования Rust 1.68
  2. Выпуск языка программирования Rust 1.67
  3. Выпуск языка программирования Rust 1.62
  4. Вышла версия 1.60 языка программирования Rust
  5. Google now supports Rust for underlying Android OS development
Анализ
×
Google
Сфера деятельности:Образование и наука
161
Apple
Сфера деятельности:Связь и ИТ
129
Google Android
Производитель:Google
122
PlayStation
Производитель:SIE
52
API
Технологии
37