Публикувана е версия 1.82 на езика за програмиране Rust, разработван от Mozilla и в момента поддържан от независимата организация Rust Foundation. Езикът се фокусира върху безопасната работа с паметта и предоставя средства за постигане на висок паралелизъм в изпълнението на задачи, без да използва сборник за боклук и runtime (runtime се свежда до основна инициализация и поддръжка на стандартната библиотека).
Методите за работа с паметта в Rust освобождават разработчиците от грешки при манипулирането на указатели и защитават от проблеми, възникващи от нискоуровневата работа с паметта, като достъп до освободена памет, разыменоване на нулеви указатели, излизане извън границите на буфера и др. За разпространение на библиотеки, осигуряване на компилация и управление на зависимости, проектът развива пакетния мениджър Cargo. За хостване на библиотеки е предоставен репозиторий crates.io.
Безопасната работа с паметта в Rust се осигурява по време на компилация чрез проверка на препратки, проследяване на собствеността на обектите, отчитане на времето на живот на обектите (области на видимост) и оценка на правилността на достъпа до паметта по време на изпълнението на кода. Rust също така предлага средства за защита от препълнение на цели числа, изисква задължителна инициализация на стойностите на променливите преди използването им, подобрява обработката на грешки в стандартната библиотека, прилага концепцията за неизменяемост (immutable) на препратки и променливи по подразбиране и предлага силна статична типизация, за да се минимизират логическите грешки.
Основни нововъведения:
- В пакетния мениджър cargo е добавена команда «info» за извеждане на информация относно пакета в хранилището.
- Добавена е поддръжка за синтаксиса «use» в «impl Trait», който определя информация за скритите типове. Например, «impl Trait + use» указва, че в скрития тип е разрешено да се използват само параметрите «x» и «T».
- Предложен е нов синтаксис за създаване на raw указатели, заменил преди използваните макроси: вместо макроса «addr_of!(expr)» сега се използва операторът «&raw const expr», а вместо макроса «addr_of_mut!(expr)» — операторът «&raw mut expr». struct Packed { not_aligned_field: i32, } fn main() { let p = Packed { not_aligned_field: 1_82 }; // Старият начин за създаване на raw указател let ptr = std::ptr::addr_of!(p.not_aligned_field); // Новият начин за създаване на raw указател let ptr = &raw const p.not_aligned_field; let val = unsafe { ptr.read_unaligned() }; }
- Дадена е възможност за дефиниране на безопасни (safe) функции и константи с време на живот ‘static’ в extern блокове с обозначение «unsafe» (по-рано всички елементи в «unsafe extern» можеха да имат само обозначение «unsafe»): unsafe extern { pub safe static TAU: f64; pub safe fn sqrt(x: f64) -> f64; pub unsafe fn strlen(p: *const u8) -> usize; }
- Атрибутите no_mangle, link_section и export_name, които могат да доведат до неопределено поведение, сега се считат за небезопасни и изискват явна маркировка с обозначение «unsafe», например: #[unsafe(no_mangle)] pub fn my_global_function() { }
- При съпоставяне с образец е разрешено пропускането на празни типове, като «enum Void {}» или структури с видимо празно поле. use std::convert::Infallible; pub fn unwrap_without_panic(x: Result) -> T { let Ok(x) = x; // «Err» може да бъде пропуснат x }
- В типовете за числа с плаваща запетая (f32 и f64) е стандартизирано поведението при обработка на нечислови стойности NaN (0.0/0.0), както и е разрешено използването на операции с плаваща запетая в const fn.
- В асемблерните вмъквания е предоставена възможност за използване на операнди с признак «const» за незабавно използване на цели числови стойности без предварително запазване в регистър. const MSG: &str = «Hello, world!\n»; unsafe { core::arch::asm!( «mov rdx, {LEN} \/\/ ще бъде генерирана инструкция ‘mov rdx, 14′», LEN = const MSG.len(), … ); }
- Позволена е адресацията на изрази с признак «static» в безопасен контекст без дефиниране на блок unsafe (операторите «&raw mut» и «&raw const» не влияят на стойността на операнда и просто създават указател към него): static mut STATIC_MUT: Type = Type::new(); extern «C» { static EXTERN_STATIC: Type; } fn main() { let static_mut_ptr = &raw mut STATIC_MUT; let extern_static_ptr = &raw const EXTERN_STATIC; }
- В категорията стабилни е преведена нова порция API, като са стабилизирани методите и реализациите на типажите:
- std::thread::Builder::spawn_unchecked
- std::str::CharIndices::offset
- std::option::Option::is_none_or
- [T]::is_sorted
- [T]::is_sorted_by
- [T]::is_sorted_by_key
- Iterator::is_sorted
- Iterator::is_sorted_by
- Iterator::is_sorted_by_key
- std::future::Ready::into_inner
- std::iter::repeat_n
- impl DoubleEndedIterator for Take
Източник: opennet.ru
