Выпуск языка программирования Rust 1.70

Новости мира unix. Хотите узнать секрет вечного счастья? Откройте страницу 246.
Ответить
acolyte
Аватара пользователя
Сообщения: 3259
Зарегистрирован: 20.08.2022

#

Выпуск языка программирования Rust 1.70
Дата публикации:Fri, 02 Jun 2023 09:10:23 +0300




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



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



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




Основные новшества:
  • В репозитории пакетов crates.io по умолчанию задействован протокол
    "sparse", реализующий новый способ работы с индексом, в котором отражены доступные версии всех существующих в репозитории пакетов. Новый протокол позволяет существенно повысить скорость работы с crates.io и решить проблемы с масштабированием при дальнейшем росте числа пакетов в репозитории. Для сокращения задержек, возникающих из-за загрузки полного индекса, в Sparse вместо доступа к индексу с использованием Git задействована прямая загрузка по HTTPS только необходимых индексных данных, охватывающих зависимости конкретного проекта. Для отдачи индексных данных задействован сервис index.crates.io. Для возвращения старого протокола можно использовать настройку "registries.crates-io.protocol".


    Стабилизированы структуры OnceCell и OnceLock, реализующие возможность одноразовой инициализации совместно используемых данных (записать значение можно только один раз).

    use std::cell::OnceCell;

    let cell = OnceCell::new();

    assert_eq!(cell.set(92), Ok(()));
    assert_eq!(cell.set(62), Err(62));


    Стабилизирован типаж IsTerminal, предлагающий метод is_terminal для определения связи файлового дескриптора с терминалом или TTY.

    use std::io::{stdout, IsTerminal};

    fn main() {
    let use_color = stdout().is_terminal(); // если терминал, то можно использовать коды цвета
    }


    В опции "-Cdebuginfo" появилась возможность указания уровней вывода отладочной информации не только в цифровом виде, но в форме строковых имён ("none" - идентично уровню 0, "limited" - 1 и "full" - 2). Также добавлены два новых уровня "line-directives-only" и "line-tables-only".

    В стабильных и бета-сборках в интерфейсе командой строки пакета test запрещено использование нестабильных опций тестирования, включаемых при указании -Zunstable-options, которые теперь можно использовать только в ночных сборках.




    В разряд стабильных переведена новая порция API, в том числе стабилизированы методы и реализации типажей:
    • NonZero*::MIN/MAX
      [/url]
    • BinaryHeap::retain
      [/url]
    • Default for std::collections::binary_heap::IntoIter
      [/url]
    • Default for std::collections::btree_map::{IntoIter, Iter, IterMut}
      [/url]
    • Default for std::collections::btree_map::{IntoKeys, Keys}
      [/url]
    • Default for std::collections::btree_map::{IntoValues, Values}
      [/url]
    • Default for std::collections::btree_map::Range
      [/url]
    • Default for std::collections::btree_set::{IntoIter, Iter}
      [/url]
    • Default for std::collections::btree_set::Range
      [/url]
    • Default for std::collections::linked_list::{IntoIter, Iter, IterMut}
      [/url]
    • Default for std::vec::IntoIter
      [/url]
    • Default for std::iter::Chain
      [/url]
    • Default for std::iter::Cloned
      [/url]
    • Default for std::iter::Copied
      [/url]
    • Default for std::iter::Enumerate
      [/url]
    • Default for std::iter::Flatten
      [/url]
    • Default for std::iter::Fuse
      [/url]
    • Default for std::iter::Rev
      [/url]
    • Default for std::slice::Iter
      [/url]
    • Default for std::slice::IterMut
      [/url]
    • Rc::into_inner
      [/url]
    • Arc::into_inner
      [/url]
    • std::cell::OnceCell
      [/url]
    • Option::is_some_and
      [/url]
    • NonNull::slice_from_raw_parts
      [/url]
    • Result::is_ok_and
      [/url]
    • Result::is_err_and
      [/url]
    • std::sync::atomic::Atomic*::as_ptr
      [/url]
    • std::io::IsTerminal
      [/url]
    • std::os::linux::net::SocketAddrExt
      [/url]
    • std::os::unix::net::UnixDatagram::bind_addr
      [/url]
    • std::os::unix::net::UnixDatagram::connect_addr
      [/url]
    • std::os::unix::net::UnixDatagram::send_to_addr
      [/url]
    • std::os::unix::net::UnixListener::bind_addr
      [/url]
    • std::path::Path::as_mut_os_str
      [/url]
    • std::sync::OnceLock
      [/url]
В пакетный менеджер cargo добавлена команда "cargo logout" для удаления токена доступа к API из локального реестра. В команду "cargo install" добавлена опция "--ignore-rust-version".

Компилятор переведён на использование LLVM 16.

Реализован третий уровень поддержки для платформ loongarch64-unknown-linux-gnu и i586-pc-nto-qnx700 (QNX Neutrino RTOS 7.0). Третий уровень подразумевает базовую поддержку, но без автоматизированного тестирования, публикации официальных сборок и проверки возможности сборки кода.






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


Новость позаимствована с opennet.ru
Ссылка на оригинал: https://www.opennet.ru/opennews/art.shtml?num=59233

Жизнь за Нер'зула!

Ответить