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

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

#

Выпуск языка программирования Rust 1.80
Дата публикации:Fri, 26 Jul 2024 20:23:27 +0300




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



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



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




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


    use std::sync::LazyLock;
    use std::time::Instant;

    static LAZY_TIME: LazyLock<Instant> = LazyLock::new(Instant::now);

    fn main() {
    let start = Instant::now();
    std::thread::scope(|s| {
    s.spawn(|| {
    println!("Thread lazy time is {:?}", LAZY_TIME.duration_since(start));
    });
    println!("Main lazy time is {:?}", LAZY_TIME.duration_since(start));
    });
    }


    В компиляторе rustc стабилизирована опция "--check-cfg", которая задействована в пакетном менеджере для проверки всех имён и значений, задаваемых через cfg, включая имена из Cargo.toml.


    fn main() {
    println!("Hello, world!");

    #[cfg(feature = "crayon")]
    rayon::join(
    || println!("Hello, Thing One!"),
    || println!("Hello, Thing Two!"),
    );
    }

    warning: unexpected `cfg` condition value: `crayon`
    --> src/main.rs:4:11
    |
    4 | #[cfg(feature = "crayon")]
    | ^^^^^^^^^^--------
    | |
    | help: there is a expected value with a similar name: `"rayon"`


    В шаблонах разрешено указание диапазонов в форматах "a..b" и "..b", которые аналогичны использованию выражений Range и RangeTo.

    pub fn size_prefix(n: u32) -> &'static str {
    const K: u32 = 10u32.pow(3);
    const M: u32 = 10u32.pow(6);
    const G: u32 = 10u32.pow(9);
    match n {
    ..K => "",
    K..M => "k",
    M..G => "M",
    G.. => "G",
    }
    }


    В разряд стабильных переведена новая порция API, в том числе стабилизированы методы и реализации типажей:
    • impl Default for Rc<CStr>
      [/url]
    • impl Default for Rc<str>
      [/url]
    • impl Default for Rc<[T]>
      [/url]
    • impl Default for Arc<str>
      [/url]
    • impl Default for Arc<CStr>
      [/url]
    • impl Default for Arc<[T]>
      [/url]
    • impl IntoIterator for Box<[T]>
      [/url]
    • impl FromIterator for Box<str>
      [/url]
    • impl FromIterator<char> for Box<str>
      [/url]
    • LazyCell
      [/url]
    • LazyLock
      [/url]
    • Duration::div_duration_f32
      [/url]
    • Duration::div_duration_f64
      [/url]
    • Option::take_if
      [/url]
    • Seek::seek_relative
      [/url]
    • BinaryHeap::as_slice
      [/url]
    • NonNull::offset
      [/url]
    • NonNull::byte_offset
      [/url]
    • NonNull::add
      [/url]
    • NonNull::byte_add
      [/url]
    • NonNull::sub
      [/url]
    • NonNull::byte_sub
      [/url]
    • NonNull::offset_from
      [/url]
    • NonNull::byte_offset_from
      [/url]
    • NonNull::read
      [/url]
    • NonNull::read_volatile
      [/url]
    • NonNull::read_unaligned
      [/url]
    • NonNull::write
      [/url]
    • NonNull::write_volatile
      [/url]
    • NonNull::write_unaligned
      [/url]
    • NonNull::write_bytes
      [/url]
    • NonNull::copy_to
      [/url]
    • NonNull::copy_to_nonoverlapping
      [/url]
    • NonNull::copy_from
      [/url]
    • NonNull::copy_from_nonoverlapping
      [/url]
    • NonNull::replace
      [/url]
    • NonNull::swap
      [/url]
    • NonNull::drop_in_place
      [/url]
    • NonNull::align_offset
      [/url]
    • <[T]>::split_at_checked
      [/url]
    • <[T]>::split_at_mut_checked
      [/url]
    • str::split_at_checked
      [/url]
    • str::split_at_mut_checked
      [/url]
    • str::trim_ascii
      [/url]
    • str::trim_ascii_start
      [/url]
    • str::trim_ascii_end
      [/url]
    • <[u8]>::trim_ascii
      [/url]
    • <[u8]>::trim_ascii_start
      [/url]
    • <[u8]>::trim_ascii_end
      [/url]
    • Ipv4Addr::BITS
      [/url]
    • Ipv4Addr::to_bits
      [/url]
    • Ipv4Addr::from_bits
      [/url]
    • Ipv6Addr::BITS
      [/url]
    • Ipv6Addr::to_bits
      [/url]
    • Ipv6Addr::from_bits
      [/url]
    • Vec::<[T; N]>::into_flattened
      [/url]


    • <[[ T; N]]>::as_flattened
      [/url]
    • <[[ T; N]]>::as_flattened_mut
      [/url]
Признак "const", определяющий возможность использования в любом контексте вместо констант, применён в функциях:
    • <[T]>::last_chunk
      [/url]
    • BinaryHeap::new
      [/url]
Реализован третий уровень поддержки для платформы x86_64-unknown-linux-none. Третий уровень подразумевает базовую поддержку, но без автоматизированного тестирования, публикации официальных сборок и проверки возможности сборки кода.


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

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

Ответить