Byla vydána verze programovacího jazyka Rust 1.82, původně založeného projektem Mozilla, nyní rozvíjeného pod záštitou nezávislé neziskové organizace Rust Foundation. Jazyk se zaměřuje na bezpečné nakládání s pamětí a poskytuje prostředky pro dosažení vysokého paralelismu vykonávání úloh, přičemž se obejde bez použití garbage collectoru a runtime (runtime se omezuje na základní inicializaci a údržbu standardní knihovny).
Metody práce s pamětí v Rustu zbavují vývojáře chyb při manipulaci s ukazateli a chrání před problémy, které vznikají z nízkoúrovňové manipulace s pamětí, jako je přístup k oblasti paměti po jejím uvolnění, dereferencování nulových ukazatelů, přetečení bufferu atd. Pro distribuci knihoven, zajištění sestavení a správu závislostí se vyvíjí balíčkový manažer Cargo. Pro hostování knihoven je k dispozici repozitář crates.io.
Bezpečné manipulace s pamětí jsou v Rustu zajištěny během kompilace prostřednictvím kontroly referencí, sledování vlastnictví objektů, zohlednění doby života objektů (viditelnosti) a hodnocení správnosti přístupu k paměti při vykonávání kódu. Rust také poskytuje prostředky pro ochranu proti přetečení celých čísel, vyžaduje povinnou inicializaci hodnot proměnných před použitím, lépe zpracovává chyby ve standardní knihovně, aplikuje koncept neměnnosti (immutable) referencí a proměnných ve výchozím nastavení a nabízí silnou statickou typizaci pro minimalizaci logických chyb.
Hlavní novinky:
- Do balíčkového manažeru cargo byla přidána příkaz "info" pro zobrazení informací o balíčku v repozitáři.
- Byla přidána podpora syntaxe "use" v "impl Trait", která definuje informace o skrytých typech. Například, "impl Trait + use" naznačuje, že v skrytém typu je povoleno používat pouze parametry "x" a "T".
- Byla navržena samostatná syntaxe pro vytváření raw ukazatelů, která nahradila dříve používané makra: místo makra "addr_of!(expr)" byl přijat operátor "&raw const expr", a místo makra "addr_of_mut!(expr)" byl přijat operátor "&raw mut expr". struct Packed { not_aligned_field: i32, } fn main() { let p = Packed { not_aligned_field: 1_82 }; // Starý způsob vytváření raw ukazatele let ptr = std::ptr::addr_of!(p.not_aligned_field); // Nový způsob vytváření raw ukazatele let ptr = &raw const p.not_aligned_field; let val = unsafe { ptr.read_unaligned() }; }
- Byla poskytnuta možnost definovat bezpečné (safe) funkce a konstanty s časem života 'static' uvnitř extern bloků se značkou "unsafe" (dříve mohly mít všechny prvky v "unsafe extern" pouze značku "unsafe"): unsafe extern { pub safe static TAU: f64; pub safe fn sqrt(x: f64) -> f64; pub unsafe fn strlen(p: *const u8) -> usize; }
- Atributy no_mangle, link_section a export_name, které mohou vést k neurčitému chování, jsou nyní považovány za nebezpečné a vyžadují výslovné označení značkou "unsafe", například: #[unsafe(no_mangle)] pub fn my_global_function() { }
- Při porovnávání vzorů je povoleno přeskočit prázdné typy, jako "enum Void {}" nebo struktury s viditelně prázdným polem. use std::convert::Infallible; pub fn unwrap_without_panic(x: Result) -> T { let Ok(x) = x; // "Err" lze přeskočit x }
- V typech pro čísla s plovoucí desetinnou čárkou (f32 a f64) bylo standardizováno chování při zpracování nebývalých hodnot NaN (0.0/0.0), a také bylo povoleno použití operací s plovoucími desetinnými čísly ve const fn.
- V assemblerových vkladech je umožněno používat operandy s příznakem „const“ k bezprostřednímu použití celých číselných hodnot bez jejich předchozího uložení do registru. const MSG: &str = „Hello, world!\n“; unsafe { core::arch::asm!( „mov rdx, {LEN} // bude vytvořeno příkaz ‘mov rdx, 14’“, LEN = const MSG.len(), … ); }
- Je povolena adresace výrazů s příznakem „static“ v bezpečném kontextu bez definice bloku unsafe (operátory „&raw mut“ a „&raw const“ nemají vliv na hodnotu operandu a pouze vytvářejí ukazatel na něj): 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; }
- Nová sada API byla převedena do stabilního stavu, včetně stabilizovaných metod a implementací typů:
- 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
