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

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

#

Выпуск языка программирования Rust 1.73
Дата публикации:Thu, 05 Oct 2023 22:14:58 +0300




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



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



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




Основные новшества:
  • Переработано оформление сообщений, выдаваемых применяемым по умолчанию обработчиком аварийного завершения программы (panic). Текст, указанный в макросе "panic!" теперь показывается в отдельной строке без обрамления кавычками, что упрощает читаемость сообщения и устраняет путаницу при наличии в вложенных кавычек или разделения на несколько строк.

    fn main() {
    let file = "ferris.txt";
    panic!("oh no! {file:?} not found!");
    }

    Было

    thread 'main' panicked at 'oh no! "ferris.txt" not found!', src/main.rs:3:5

    Стало

    thread 'main' panicked at src/main.rs:3:5:
    oh no! "ferris.txt" not found!



    Также переработан вывод сообщений, показываемых при срабатывании макросов "assert_eq" и "assert_ne".

    fn main() {
    assert_eq!("🦀", "🐟", "ferris is not a fish");
    }

    Было

    thread 'main' panicked at 'assertion failed: `(left == right)`
    left: `"🦀"`,
    right: `"🐟"`: ferris is not a fish', src/main.rs:2:5

    Cтало

    thread 'main' panicked at src/main.rs:2:5:
    assertion `left == right` failed: ferris is not a fish
    left: "🦀"
    right: "🐟"


    В соответствии с RFC 3184 добавлена возможность прямой манипуляции локальными для потока (thread_local) ключами хранилища LocalKey<Cell<T>> и LocalKey<RefCell<T>> через использование методов get(), set(), take() и replace(), вместо использования замыкания "with(|inner| ...)", что позволяет не выполнять дополнительный код инициализации для значений по умолчанию, указанных для новых потоков при помощи макроса "thread_local!".

    thread_local! {
    static THINGS: Cell<Vec<i32>> = Cell::new(Vec::new());
    }

    fn f() {
    // было
    THINGS.with(|i| i.set(vec![1, 2, 3]));
    // стало
    THINGS.set(vec![1, 2, 3]);

    // ...

    // было
    let v = THINGS.with(|i| i.take());
    // стало
    let v: Vec<i32> = THINGS.take();
    }

    В разряд стабильных переведена новая порция API, в том числе стабилизированы методы и реализации типажей:

    • Unsigned
      {integer}::next_multiple_of
      [/url]
    • Unsigned
      {integer}::checked_next_multiple_of
      [/url]
    • std::ffi::FromBytesUntilNulError
      [/url]
    • std::os::unix::fs::chown
      [/url]
    • std::os::unix::fs::fchown
      [/url]
    • std::os::unix::fs::lfchown
      [/url]
    • LocalKey::<Cell<T>>::get
      [/url]
    • LocalKey::<Cell<T>>::set
      [/url]
    • LocalKey::<Cell<T>>::take
      [/url]
    • LocalKey::<Cell<T>>::replace
      [/url]
    • LocalKey::<RefCell<T>>::with_borrow
      [/url]
    • LocalKey::<RefCell<T>>::with_borrow_mut
      [/url]
    • LocalKey::<RefCell<T>>::set
      [/url]
    • LocalKey::<RefCell<T>>::take
      [/url]
    • LocalKey::<RefCell<T>>::replace
      [/url]
Признак "const", определяющий возможность использования в любом контексте вместо констант, применён в функциях:
    • rc::Weak::new
      [/url]
    • sync::Weak::new
      [/url]
    • NonNull::as_ref
      [/url]
В компиляторе обеспечена запись информации о версии в секцию ".comment" по аналогии с GCC и Clang.

Реализован третий уровень поддержки для платформ aarch64-unknown-teeos, csky-unknown-linux-gnuabiv2, riscv64-linux-android, riscv64gc-unknown-hermit, x86_64-unikraft-linux-musl и x86_64-unknown-linux-ohos. Третий уровень подразумевает базовую поддержку, но без автоматизированного тестирования, публикации официальных сборок и проверки возможности сборки кода.


Реализован второй уровень поддержки целевой платформы wasm32-wasi-preview1-threads. Второй уровень поддержки подразумевает гарантию сборки.




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

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

Ответить