Rust 1.58 ծրագրավորման լեզվի թողարկում

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

Rust-ի հիշողության ավտոմատ կառավարումը վերացնում է ցուցիչները շահարկելիս սխալները և պաշտպանում է ցածր մակարդակի հիշողության մանիպուլյացիայից առաջացող խնդիրներից, ինչպիսիք են հիշողության տարածք մուտք գործելը այն ազատվելուց հետո, զրոյական ցուցիչի մատնանշումները, բուֆերի գերակատարումները և այլն: Գրադարանները բաշխելու, հավաքումն ապահովելու և կախվածությունները կառավարելու համար նախագիծը մշակում է Cargo փաթեթի կառավարիչը: Crates.io պահոցն աջակցվում է գրադարանների հոսթինգի համար:

Հիմնական նորամուծությունները.

  • В блоках форматирования строк, в дополнение к ранее доступной возможности подстановки явно перечисленных после строки переменных по номеру и имени, реализована возможность подстановки произвольных идентификаторов через добавление в строку выражений «{идентификатор}». Например: // Ранее поддерживались конструкции: println!(«Hello, {}!», get_person()); println!(«Hello, {0}!», get_person()); println!(«Hello, {person}!», person = get_person()); // теперь можно указывать let person = get_person(); println!(«Hello, {person}!»);

    Идентификаторы также можно указывать непосредственно в параметрах форматирования. let (width, precision) = get_format(); for (name, score) in get_scores() { println!(«{name}: {score:width$.precision$}»); }

    Новая подстановка работает во всех макросах, поддерживающих определение формата строки, за исключением макроса «panic!» в версиях языка Rust 2015 и 2018, в которых panic!(«{ident}») обрабатывается как обычная строка (в Rust 2021 подстановка срабатывает).

  • Изменено поведение структуры std::process::Command на платформе Windows, которая при выполнении команд из соображений безопасности больше не ищет исполняемые файлы в текущем каталоге. Текущий каталог исключён так как может быть использован для организации выполнения кода злоумышленника в случае запуска программ в не заслуживающих доверия каталогах (CVE-2021-3013). Новая логика определения исполняемых файлов подразумевает поиск в каталогах Rust, в каталоге приложения, системном каталоге Windows и каталогах, указанных в переменной окружения PATH.
  • В стандартной библиотеке расширено число функций, помеченных «#[must_use]» для вывода предупреждения в случае игнорирования возвращаемого значения, что помогает выявить ошибки, вызванные предположением, что функция изменит значения, а не вернёт новое значение.
  • API-ի նոր մասը տեղափոխվել է կայուն կատեգորիա, ներառյալ մեթոդները և հատկությունների իրականացումը կայունացվել են.
    • Metadata::is_symlink
    • Path::is_symlink
    • {integer}::saturating_div
    • Option::unwrap_unchecked
    • Result::unwrap_unchecked
    • Result::unwrap_err_unchecked
  • «const» հատկանիշը, որը որոշում է այն ցանկացած համատեքստում օգտագործելու հնարավորությունը հաստատունների փոխարեն, օգտագործվում է գործառույթներում.
    • Duration::new
    • Duration::checked_add
    • Duration::saturating_add
    • Duration::checked_sub
    • Duration::saturating_sub
    • Duration::checked_mul
    • Duration::saturating_mul
    • Duration::checked_div
  • Разрешено разыменование указателей «*const T» в контекстах «const».
  • В пакетном менеджере Cargo в метаданные пакета добавлено поле rust_version, а в команду «cargo install» добавлена опция «—message-format».
  • В компиляторе реализована поддержка механизма защиты CFI (Control Flow Integrity), добавляющего перед каждым косвенным вызовом функции проверки для выявления некоторых форм неопределённого поведения, которые потенциально могут привести к нарушению нормального порядка выполнения (control flow) в результате применения эксплоитов, изменяющих хранимые в памяти указатели на функции.
  • В компиляторе добавлена поддержка 5 и 6 версии формата coverage-сопоставлений LLVM, используемого для оценки охвата кода при тестировании.
  • В компиляторе требования к минимальной версии LLVM подняты до LLVM 12.
  • Реализован третий уровень поддержки для платформы x86_64-unknown-none. Третий уровень подразумевает базовую поддержку, но без автоматизированного тестирования, публикации официальных сборок и проверки возможности сборки кода.

Дополнительно можно отметить публикацию компанией Microsoft выпуска библиотек Rust for Windows 0.30, позволяющих использовать язык Rust для разработки приложений для ОС Windows. В набор входят два crate-пакета (windows и windows-sys), через которые можно обращаться к Win API в программах на языке Rust. Код для поддержки API генерируется динамически из метаданных с описанием API, что позволяет реализовать поддержку не только уже существующих вызовов Win API, но вызовов, которые появятся в будущем. В новой версии добавлена поддержка целевой платформы UWP (Universal Windows Platform), реализованы типажи Handle и Debug.

Source: opennet.ru

Добавить комментарий