Vydanie Rust 1.82. Nový prehliadač na Rust. Použitie Rust vo Volve

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
Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster