Опубликован релиз языка программирования общего назначения 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 = 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
- impl Default for Rc
- impl Default for Rc
- impl Default for Arc
- impl Default for Arc
- impl Default for Arc
- impl IntoIterator for Box
- impl FromIterator for Box
- impl FromIterator for Box
- 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
- ::split_at_checked
- ::split_at_mut_checked
- str::split_at_checked
- str::split_at_mut_checked
- str::trim_ascii
- str::trim_ascii_start
- str::trim_ascii_end
- ::trim_ascii
- ::trim_ascii_start
- ::trim_ascii_end
- Ipv4Addr::BITS
- Ipv4Addr::to_bits
- Ipv4Addr::from_bits
- Ipv6Addr::BITS
- Ipv6Addr::to_bits
- Ipv6Addr::from_bits
- Vec::::into_flattened
- ::as_flattened
- ::as_flattened_mut
- Признак “const”, определяющий возможность использования в любом контексте вместо констант, применён в функциях:
- ::last_chunk
- BinaryHeap::new
- Реализован третий уровень поддержки для платформы x86_64-unknown-linux-none. Третий уровень подразумевает базовую поддержку, но без автоматизированного тестирования, публикации официальных сборок и проверки возможности сборки кода.