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

Опубликован релиз языка программирования общего назначения 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>
    • impl Default for Rc‹str>
    • impl Default for Rc‹[T]>
    • impl Default for Arc‹str>
    • impl Default for Arc‹CStr>
    • impl Default for Arc‹[T]>
    • impl IntoIterator for Box‹[T]>
    • impl FromIterator for Box‹str>
    • impl FromIterator‹char> for Box‹str>
    • LazyCell
    • LazyLock
    • Duration::div_duration_f32
    • Duration::div_duration_f64
    • Option::take_if
    • Seek::seek_relative
    • BinaryHeap::as_slice
    • NonNull::offset
    • NonNull::byte_offset
    • NonNull::add
    • NonNull::byte_add
    • NonNull::sub
    • NonNull::byte_sub
    • NonNull::offset_from
    • NonNull::byte_offset_from
    • NonNull::read
    • NonNull::read_volatile
    • NonNull::read_unaligned
    • NonNull::write
    • NonNull::write_volatile
    • NonNull::write_unaligned
    • NonNull::write_bytes
    • NonNull::copy_to
    • NonNull::copy_to_nonoverlapping
    • NonNull::copy_from
    • NonNull::copy_from_nonoverlapping
    • NonNull::replace
    • NonNull::swap
    • NonNull::drop_in_place
    • NonNull::align_offset
    • ‹[T]>::split_at_checked
    • ‹[T]>::split_at_mut_checked
    • str::split_at_checked
    • str::split_at_mut_checked
    • str::trim_ascii
    • str::trim_ascii_start
    • str::trim_ascii_end
    • ‹[u8]>::trim_ascii
    • ‹[u8]>::trim_ascii_start
    • ‹[u8]>::trim_ascii_end
    • Ipv4Addr::BITS
    • Ipv4Addr::to_bits
    • Ipv4Addr::from_bits
    • Ipv6Addr::BITS
    • Ipv6Addr::to_bits
    • Ipv6Addr::from_bits
    • Vec::‹[T; N]>::into_flattened
    • ‹[[ T; N]]>::as_flattened
    • ‹[[ T; N]]>::as_flattened_mut
  • Признак «const», определяющий возможность использования в любом контексте вместо констант, применён в функциях:
    • ‹[T]>::last_chunk
    • BinaryHeap::new
  • Реализован третий уровень поддержки для платформы x86_64-unknown-linux-none. Третий уровень подразумевает базовую поддержку, но без автоматизированного тестирования, публикации официальных сборок и проверки возможности сборки кода.



Источник: http://www.opennet.ru/opennews/art.shtml? num=61614

OpenNet прочитано 7724 раза