Vydanie programovacieho jazyka Rust 1.59 s podporou montážnych vložiek

Bol vydaný univerzálny programovací jazyk Rust 1.59, založený projektom Mozilla, ale teraz vyvinutý pod záštitou nezávislej neziskovej organizácie Rust Foundation. Jazyk sa zameriava na bezpečnosť pamäte a poskytuje prostriedky na dosiahnutie vysokej paralelnosti úloh, pričom sa vyhýba používaniu zberača odpadu a runtime (beh je zredukovaný na základnú inicializáciu a údržbu štandardnej knižnice).

Metódy spracovania pamäte Rustu chránia vývojára pred chybami pri manipulácii s ukazovateľmi a chránia pred problémami, ktoré vznikajú v dôsledku nízkoúrovňového spracovania pamäte, ako je prístup k oblasti pamäte po jej uvoľnení, dereferencovanie nulových ukazovateľov, pretečenie vyrovnávacej pamäte atď. Na distribúciu knižníc, poskytovanie zostáv a správu závislostí projekt vyvíja správcu balíkov Cargo. Úložisko crates.io je podporované pre hosťovanie knižníc.

Bezpečnosť pamäte je v Rust zabezpečená v čase kompilácie prostredníctvom kontroly referencií, sledovania vlastníctva objektu, sledovania životnosti objektov (rozsahov) a hodnotenia správnosti prístupu do pamäte počas vykonávania kódu. Rust tiež poskytuje ochranu proti pretečeniu celých čísel, vyžaduje povinnú inicializáciu hodnôt premenných pred použitím, lepšie zvláda chyby v štandardnej knižnici, štandardne aplikuje koncept nemenných referencií a premenných, ponúka silné statické typovanie na minimalizáciu logických chýb.

Hlavné inovácie:

  • Je možné použiť vložky v assembleri, ktoré sú žiadané v aplikáciách, ktoré potrebujú riadiť vykonávanie na nízkej úrovni alebo byť schopné používať špecializované strojové inštrukcie. Montážne vložky sa pridávajú pomocou makier "asm!" a "global_asm!" použitie syntaxe formátovania reťazcov na pomenovanie registrov podobnej tej, ktorá sa používa na nahradenie reťazcov v Ruste. Kompilátor podporuje montážne inštrukcie pre architektúry x86, x86-64, ARM, AArch64 a RISC-V. Príklad vloženia: use std::arch::asm; // Vynásobte x 6 pomocou posunov a sčítaní let mut x: u64 = 4; unsafe { asm!( "mov {tmp}, {x}", "shl {tmp}, 1", "shl {x}, 2", "add {x}, {tmp}", x = inout(reg ) x, tmp = out(reg) _, ); } claim_eq!(x, 4 * 6);
  • Pridaná podpora pre deštrukturované (paralelné) priradenia, v ktorých je na ľavej strane výrazu špecifikovaných niekoľko vlastností, rezov alebo štruktúr. Napríklad: nech (a, b, c, d, e); (a, b) = (1); [c, .., d, _] = [2, 1, 2, 3, 4]; Struct { e, .. } = Struct { e: 5, f: 5 }; claim_eq!([3, 1, 2, 1, 4], [a, b, c, d, e]);
  • Pre const generics je možné zadať predvolené hodnoty: struct ArrayStorage { arr: [T; N], } impl ArrayStorage { fn new(a: T, b: T) -> ArrayStorage { ArrayStorage { arr: [a, b], } } }
  • Správca balíkov Cargo poskytuje upozornenia na použitie neplatných štruktúr v závislostiach, ktoré sa spracovávajú kvôli chybám v kompilátore (napríklad kvôli chybe bolo povolené vypožičanie polí zabalených štruktúr v bezpečných blokoch). Takéto konštrukcie už nebudú podporované v budúcej verzii Rustu.
  • Cargo a rustc majú zabudovanú schopnosť generovať spustiteľné súbory zbavené ladiacich údajov (strip = "debuginfo") a symbolov (strip = "symboly"), bez potreby volania samostatného nástroja. Nastavenie čistenia sa realizuje cez parameter „strip“ v Cargo.toml: [profile.release] strip = „debuginfo“, „symbols“
  • Prírastková kompilácia je predvolene vypnutá. Dôvodom je údajne dočasné riešenie chyby v kompilátore, ktorá vedie k pádom a chybám deserializácie. Oprava chyby už bola pripravená a bude zahrnutá v ďalšom vydaní. Ak chcete vrátiť prírastkovú kompiláciu, môžete použiť premennú prostredia RUSTC_FORCE_INCREMENTAL=1.
  • Nová časť API bola presunutá do kategórie stabilných, vrátane metód a implementácií vlastností boli stabilizované:
    • std::thread::available_parallelism
    • Výsledok::skopírovaný
    • Výsledok::klonovaný
    • oblúk::asm!
    • arch::global_asm!
    • ops::ControlFlow::is_break
    • ops::ControlFlow::is_continue
    • TryFrom pre u8
    • char::TryFromCharError (klon, ladenie, zobrazenie, PartialEq, Copy, Eq, Error)
    • iter::zip
    • NonZeroU8::is_power_of_two
    • NonZeroU16::is_power_of_two
    • NonZeroU32::is_power_of_two
    • NonZeroU64::is_power_of_two
    • NonZeroU128::is_power_of_two
    • DoubleEndedIterator pre štruktúru ToLowercase
    • DoubleEndedIterator pre štruktúru ToUppercase
    • TryFrom pre [T; N]
    • UnwindSafe pre štruktúru Once
    • RefUnwindSafe raz
    • armv8 neónové podporné funkcie zabudované do kompilátora pre aarch64
  • Atribút „const“, ktorý určuje možnosť jeho použitia v akomkoľvek kontexte namiesto konštánt, sa používa vo funkciách:
    • mem::MaybeUninit::as_ptr
    • mem::MaybeUninit::assume_init
    • mem::MaybeUninit::assume_init_ref
    • ffi::CStr::from_bytes_with_nul_unchecked

Zdroj: opennet.ru

Pridať komentár