Bol spustený release programovacieho jazyka Rust 1.82, ktorý bol vyvinutý projektom Mozilla, ale teraz ho spravuje nezávislá nezisková organizácia Rust Foundation. Jazyk sa zameriava na bezpečnú prácu s pamäťou a poskytuje prostriedky na dosiahnutie vysokého paralelizmu pri vykonávaní úloh bez použitia garbage collectora a runtime (runtime sa obmedzuje na základnú inicializáciu a zabezpečenie štandardnej knižnice).
Metódy práce s pamäťou v Rust zbavujú vývojára chýb pri manipulácii s ukazovateľmi a chránia pred problémami, ktoré vznikajú z nízkoúrovňovej práce s pamäťou, ako je prístup do oblasti pamäte po jej uvoľnení, dereferencovanie nulových ukazovateľov, prekročenie hraníc bufra atď. Na distribúciu knižníc, zabezpečenie zostavy a správu závislostí sa vyvíja balíčkový manažér Cargo. Pre umiestnenie knižníc sa podporuje repozitár crates.io.
Bezpečné zaobchádzanie s pamäťou je v Rust zabezpečené už pri kompilácii prostredníctvom kontroly odkazov, sledovania vlastníctva objektov, zohľadňovania životnosti objektov (rozsah viditeľnosti) a posudzovania správnosti prístupu k pamäti počas vykonávania kódu. Rust tiež poskytuje prostriedky na ochranu pred celočíselnými pretečeniami, vyžaduje povinnú inicializáciu hodnôt premenných pred použitím, lepšie spracováva chyby v štandardnej knižnici, aplikuje koncept nemennosti (immutable) odkazov a premenných ako predvolené a ponúka silnú statickú typizáciu na minimalizáciu logických chýb.
Hlavné novinky:
- Do balíkového správcu cargo bola pridaná príkaz "info" na zobrazenie informácií o balíku v repozitári.
- Podpora syntaxe "use<..>" bola pridaná do "impl Trait", ktorá určuje informácie o skrytých typoch. Napríklad "impl Trait + use<'x, T>" naznačuje, že v skrytom type sú povolené iba parametre "x" a "T".
- Navrhnutá bola samostatná syntax na vytváranie raw ukazovateľov, ktorá nahradila predtým používané makrá: nahradenie makra "addr_of!(expr)" prišlo operátorom "&raw const expr", a nahradenie makra "addr_of_mut!(expr)" operátorom "&raw mut expr". struct Packed { not_aligned_field: i32, } fn main() { let p = Packed { not_aligned_field: 1_82 }; // Starý spôsob vytvárania raw ukazovateľa let ptr = std::ptr::addr_of!(p.not_aligned_field); // Nový spôsob vytvárania raw ukazovateľa let ptr = &raw const p.not_aligned_field; let val = unsafe { ptr.read_unaligned() }; }
- Bola poskytnutá možnosť definovať bezpečné (safe) funkcie a konštanty so životnosťou ‘static’ vo vnútri extern blokov s označením "unsafe" (predtým všetky prvky v "unsafe extern" mohli mať iba označenie "unsafe"): unsafe extern { pub safe static TAU: f64; pub safe fn sqrt(x: f64) -> f64; pub unsafe fn strlen(p: *const u8) -> usize; }
- Atribúty no_mangle, link_section a export_name, ktoré môžu viesť k nedefinovanému správaniu, sú teraz považované za nebezpečné a vyžadujú si explicitné označenie znakom "unsafe", napríklad: #[unsafe(no_mangle)] pub fn my_global_function() { }
- Pri porovnávaní sa povolilo preskočiť prázdne typy, ako sú "enum Void {}" alebo štruktúry s viditeľným prázdnym poľom. use std::convert::Infallible; pub fn unwrap_without_panic<T>(x: Result<T, Infallible>) -> T { let Ok(x) = x; // "Err" možno preskočiť x }
- V typoch pre čísla s pohyblivou desatinnou čiarkou (f32 a f64) bolo štandardizované správanie pri spracovaní nečíselných hodnôt NaN (0.0/0.0), a tiež bolo povolené používanie operácií s pohyblivou desatinnou čiarkou v const fn.
- V assemblerových vložkách je umožnené používanie operandov s označením „const“ na priame využitie celých číselných hodnôt bez ich predchádzajúceho uloženia v registre. const MSG: &str = „Ahoj, svet!\n“; unsafe { core::arch::asm!( „mov rdx, {LEN} \/\/ bude vytvorený príkaz ‘mov rdx, 14′“, LEN = const MSG.len(), … ); }
- Je povolená adresácia výrazov s označením „static“ v bezpečnom kontexte bez definovania bloku unsafe (operátory „&raw mut“ a „&raw const“ nemajú vplyv na hodnotu operandu a iba vytvárajú ukazovateľ naň): 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; }
- Do oblasti stabilných bol prenesený nový balík API, vrátane stabilizovaných metód a implementácií traitov:
- 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
Zdroj: opennet.ru
