Verzia Rust 1.86. Príprava oficiálnej špecifikácie jazyka Rust

Bol vydaný jazyk programovania všeobecného použitia Rust 1.86, pôvodne vytvorený projektom Mozilla, avšak momentálne sa vyvíja pod záštitou nezávislej neziskovej organizácie Rust Foundation. Jazyk sa zameriava na bezpečnú prácu s pamäťou a poskytuje prostriedky na dosiahnutie vysokej paralelnosti pri vykonávaní úloh, pričom sa zaobíde bez použitia garbage collectora a runtime (runtime sa zredukuje na základnú inicializáciu a správu š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:

  • Pridaná podpora pre prevod (upcast) typov na základný supertyp (supertrait), t. j. vznikla možnosť priamo transformovať odkaz na objekt typu v odkaz na objekt supertypu bez nutnosti vytvárania špeciálnej metódy v type, ktorá by vracala odkaz na supertyp. Podobnú operáciu je možné vykonávať aj s inými typmi inteligentných ukazovateľov, napríklad „Arc<dyn Trait> -> Arc<dyn Supertrait>“ a „*const dyn Trait -> *const dyn Supertrait“. trait Trait: Supertrait {} trait Supertrait {} fn upcast(x: &dyn Trait) -> &dyn Supertrait { x }
  • V HashMap a rezoch (slice) bol pridaný metóda get_disjoint_mut() pre súčasné získanie viacerých mutovateľných odkazov na prvky. Predtým ukazovateľ zoznamu (borrow checker) nedovoľoval súčasné použitie odkazov získaných pomocou metódy get_mut(). let v = &mut [1, 2, 3]; if let Ok([a, b]) = v.get_disjoint_mut([0, 2]) { *a = 413; *b = 612; } assert_eq!(v, &[413, 2, 612]); if let Ok([a, b]) = v.get_disjoint_mut([0..1, 1..3]) { a[0] = 8; b[0] = 88; b[1] = 888; } assert_eq!(v, &[8, 88, 888]);
  • Povolené je označovať safe-funkcie pomocou atribútu „#[target_feature]“, ktorý indikuje, že funkcia využíva dané možnosti CPU. Safe-funkciu, označenú atribútom „#[target_feature]“, môže iná safe-funkcia bezpečne zavolať iba za podmienky, že je tiež označená „#[target_feature]“ (ináč by sa podobné funkcie mali volat v unsafe-bloku). Pričom ich nemožno posúvať do funkcií, ktoré prijímajú generické (generic) parametre obmedzené typmi Fn*. Predtým mohol byť atribút „#[target_feature]“ aplikovaný iba na funkcie označené ako „unsafe“. #[target_feature(enable = „avx2“)] fn requires_avx2() { // ... } #[target_feature(enable = „avx2“)] fn safe_callsite() { requires_avx2(); } fn unsafe_callsite() { if is_x86_feature_detected!(„avx2“) { unsafe { requires_avx2() }; } }
  • V kompilátore Rust je zapnutá substitúcia ladenia (debug-assert), ktorá zabezpečuje, že ukazovateľ neobsahuje hodnotu NULL pri čítaní a zápise nenulových veľkostí, a tiež pri opätovnom prenájme (reborrow) ukazovateľa do odkazu. Napríklad s povolenými ladením nižšie uvedený kód teraz spôsobí stav „panic“: let _x = *std::ptr::null::(); let _x = &*std::ptr::null::();
  • Predvolene je zapnutá lint kontrola „missing_abi“, ktorá vyvolá varovanie, ak po kľúčovom slove extern nie je uvedený ABI. Predtým, ak po extern nebol uvedený ABI, predpokladalo sa, že sa používa ABI „C“. Teraz sa odporúča jasne uviesť ABI „C“, napríklad ‘extern „C“ {}’ a ‘extern „C“ fn’
  • Do oblasti stabilných bol prenesený nový balík API, vrátane stabilizovaných metód a implementácií traitov:
    • {float}::next_down
    • {float}::next_up
    • ::get_disjoint_mut
    • ::get_disjoint_unchecked_mut
    • slice::GetDisjointMutError
    • HashMap::get_disjoint_mut
    • HashMap::get_disjoint_unchecked_mut
    • NonZero::count_ones
    • Vec::pop_if
    • sync::Once::wait
    • sync::Once::wait_force
    • sync::OnceLock::wait
  • Príznak „const“ bol použitý v funkciách:
    • hint::black_box
    • io::Cursor::get_mut
    • io::Cursor::set_position
    • str::is_char_boundary
    • str::split_at
    • str::split_at_checked
    • str::split_at_mut
    • str::split_at_mut_checked
  • Bol zavedený tretí level podpory pre platformy {aarch64-unknown,x86_64-pc}-nto-qnx710_iosock, {aarch64-unknown,x86_64-pc}-nto-qnx800, {x86_64,i686}-win7-windows-gnu, amdgcn-amd-amdhsa, x86_64-pc-cygwin, {mips,mipsel}-mti-none-elf, m68k-unknown-none-elf, armv7a-nuttx-{eabi,eabihf}, aarch64-unknown-nuttx a thumbv7a-nuttx-{eabi,eabihf}. Tretí level predpokladá základnú podporu, ale bez automatizovaného testovania, publikovania oficiálnych zostáv a overovania možnosti zostavenia kódu.
  • Pridané varovanie o ukončení druhého levelu podpory pre cieľovú platformu i586-pc-windows-msvc v najbližšom vydaní (1.87). Odporúča sa používať platformu i686-pc-windows-msvc, ktorá sa líši podporou inštrukcií SSE2. Platforma i586-pc-windows-msvc stratila zmysel, pretože pre Windows 10 je potrebná podpora SSE2, a staršie verzie Windows v Rust nie sú podporované.

Navyše je možné poznamenať, že spoločnosť Ferrocene odovzdala komunitnému špecifikáciu jazyka Rust (FLS — Ferrocene Language Specification), vytvorenú počas vývoja svojho kompilátora Rust pre kriticky dôležité systémy a pravidelne synchronizovanú so súčasným stavom hlavného kompilátora Rust. Špecifikácia FLS obsahuje štruktúrovaného a podrobného sprievodcu po syntaxi, sémantike a správaní Rust, vhodným na overovanie, hodnotenie kompatibility a standardizáciu.

Poskytnuté materiály budú použité na vytvorenie referenčnej špecifikácie pre jazyk Rust, ktorá sa bude dať využiť pri vývoji alternatívnych kompilátorov a na testovanie kompilátora v oblastiach, ktoré sú z hľadiska bezpečnosti kritické.

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