Bylo zveřejněno vydání univerzálního programovacího jazyka Rust 1.82, založeného projektem Mozilla, ale nyní vyvíjeného pod záštitou nezávislé neziskové organizace Rust Foundation. Jazyk se soustředí na bezpečnost paměti a poskytuje prostředky k dosažení vysokého paralelismu úloh a zároveň se vyhýbá použití garbage collectoru a runtime (runtime je redukováno na základní inicializaci a údržbu standardní knihovny).
Metody zpracování paměti Rust šetří vývojáře před chybami při manipulaci s ukazateli a chrání před problémy, které vznikají v důsledku nízkoúrovňového zpracování paměti, jako je přístup k oblasti paměti po jejím uvolnění, dereferencování nulových ukazatelů, přetečení vyrovnávací paměti atd. Pro distribuci knihoven, poskytování sestavení a správu závislostí projekt vyvíjí správce balíčků Cargo. Úložiště crates.io je podporováno pro hostování knihoven.
Bezpečnost paměti je v Rustu zajištěna v době kompilace prostřednictvím kontroly referencí, sledování vlastnictví objektů, sledování životnosti objektů (rozsahů) a hodnocení správnosti přístupu do paměti během provádění kódu. Rust také poskytuje 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ě, standardně aplikuje koncept neměnných referencí a proměnných, nabízí silné statické typování pro minimalizaci logických chyb.
Hlavní inovace:
- Do správce cargo package manager byl přidán příkaz „info“, který zobrazuje informace o balíčku v úložišti.
- Přidána podpora pro syntaxi "use<..>" v "impl Trait", která specifikuje informace o skrytých typech. Například "impl Trait + use<'x, T>" určuje, že ve skrytém typu lze použít pouze parametry "x" a "T".
- Byla navržena samostatná syntaxe pro vytváření nezpracovaných ukazatelů, která nahrazuje dříve používaná makra: makro „addr_of!(expr)“ bylo nahrazeno operátorem „&raw const expr“ a makro „addr_of_mut!(expr)“ bylo nahrazeno. operátorem „&raw mut“ expr“. struct Packed { not_aligned_field: i32, } fn main() { let p = Packed { not_aligned_field: 1_82 }; // Starý způsob, jak vytvořit nezpracovaný ukazatel let ptr = std::ptr::addr_of!(p.not_aligned_field); // Nový způsob, jak vytvořit nezpracovaný ukazatel let ptr = &raw const p.not_aligned_field; let val = unsafe { ptr.read_unaligned() }; }
- Je možné definovat bezpečné funkce a konstanty se „statickou“ životností uvnitř externích bloků s atributem „unsafe“ (dříve mohly mít všechny prvky v „unsafe extern“ pouze atribut „unsafe“): unsafe extern { pub safe statická TAU: f64; hospoda safe fn sqrt(x: f64) -> f64; pub unsafe fn strlen(p: *const u8) -> useize; }
- Atributy no_mangle, link_section a export_name, které mohou vést k nedefinovanému chování, jsou nyní považovány za nebezpečné a vyžadují explicitní příznak „nebezpečné“, například: #[unsafe(no_mangle)] pub fn my_global_function() { }
- Porovnávání vzorů umožňuje přeskočit prázdné typy, jako je "enum Void {}" nebo struktury s viditelným prázdným polem. použijte std::convert::Infallible; hospoda fn unwrap_without_panic (x: Výsledek ) -> T { nech Ok(x) = x; // "Err" lze přeskočit x }
- Typy pro čísla s pohyblivou řádovou čárkou (f32 a f64) mají standardizované chování při zpracování nenumerických hodnot NaN (0.0/0.0) a také umožňují použití operací s pohyblivou řádovou čárkou v const fn.
- Vložky sestavení poskytují možnost používat operandy s atributem „const“ k přímému použití celočíselných číselných hodnot bez předchozího uložení do registru. const MSG: &str = "Ahoj světe!\n"; unsafe { core::arch::asm!( “mov rdx, {LEN} // bude vygenerována instrukce 'mov rdx, 14′”, LEN = const MSG.len(), … ); }
- Adresování výrazů s atributem „static“ je povoleno v bezpečném kontextu bez definování nebezpečného bloku (operátory „&raw mut“ a „&raw const“ neovlivňují hodnotu operandu a vytvářejí pouze ukazatel na něj): static mut STATIC_MUT: Type = Type::new(); extern "C" { static EXTERN_STATIC: Typ; } fn main() { let static_mut_ptr = &raw mut STATIC_MUT; nech extern_static_ptr = &raw const EXTERN_STATIC; }
- Nová část API byla přesunuta do kategorie stabilní, včetně metod a implementací vlastností byly stabilizovány:
- std::thread::Builder::spawn_unchecked
- std::str::CharIndices::offset
- std::option::Option::is_none_or
- [T]::je_seřazeno
- [T]::je_řazeno_podle
- [T]::je_řazeno_podle_klíče
- Iterátor::is_sorted
- Iterátor::is_sorted_by
- Iterator::is_sorted_by_key
- std::future::Připraveno::into_inner
- std::iter::repeat_n
- impl DoubleEndedIterator pro Take
Zdroj: opennet.ru
