Vydanie Rust 1.87

V deň oslavy desiateho výročia od vydania programovacieho jazyka Rust 1.0 (projekt Rust bol založený v roku 2006, vydanie 0.1 bolo vytvorené v roku 2012 a prvá stabilná verzia bola navrhnutá v roku 2015) bol zverejnený release Rust 1.87. Jazyk sa zameriava na bezpečné nakladanie s pamäťou a poskytuje prostriedky na dosiahnutie vysokého paralelizmu vykonávania úloh, pričom sa zaobíde bez použitia garbage collectora a runtime (runtime sa redukuje na základnú inicializáciu a sprievodnú činnosť š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 štandardnej knižnice bola pridaná podpora anonymných kanálov (anonymous pipe). Na vytvorenie anonymných kanálov bol navrhnutý metóda std::io::pipe(), ktorá sa môže používať v kombinácii s std::process::Command na spracovanie štandardných vstupných a výstupných tokov, ako aj na zlúčenie tokov stdout a stderr. use std::process::Command; use std::io::Read; let (mut recv, send) = std::io::pipe()?; let mut command = Command::new("path/to/bin") // zlúčenie stdout a stderr do jedného kanála .stdout(send.try_clone()?) .stderr(send) .spawn()?; let mut output = Vec::new(); recv.read_to_end(&mut output)?; assert!(command.wait()?.success());
  • Povolil sa volanie z safe-kódu väčšiny zabudovaných funkcií (Intrinsics) std::arch. Zmena sa uplatňuje na zabudované funkcie std::arch, ktoré sú označené ako unsafe len kvôli väzbe na špecifickú funkcionalitu, ak je táto funkcionalita zapnutá. Napríklad, _mm256_add_epi32 je možné volať z safe-kódu, ak sa v aplikácii používa ‘#[target_feature(enable = "avx2")]’.
  • Z blokov «asm!» s assemblerovým kódom je povolené uskutočňovať prechody na bloky s kódom v jazyku Rust, čo zjednodušuje vývoj nízkoúrovnového kódu, napríklad implementáciu optimalizácií v jadre alebo organizáciu interakcie s hardvérom. Bod pre prechod pre assemblerový príkaz «jmp» sa stanovuje v makre «asm!» pomocou nového operandu «label», ktorý obsahuje blokový výraz s kódom v jazyku Rust. unsafe { asm!( «jmp {}», label { println!(«Skok z asm!»); } ); }
  • Povolené je presne uvádzať zachytené generické typy a časové trvanie v definíciách typov s použitím návratových typov impl Trait. trait Foo { fn method(&'a self) -> impl Sized; type Implicit1: Sized; fn method_desugared(&'a self) -> Self::Implicit1; fn precise(&'a self) -> impl Sized + use; type Implicit2: Sized; fn precise_desugared(&'a self) -> Self::Implicit2; }
  • Do oblasti stabilných bol prenesený nový balík API, vrátane stabilizovaných metód a implementácií traitov:
    • Vec::extract_if
    • vec::ExtractIf
    • LinkedList::extract_if
    • linked_list::ExtractIf
    • ::split_off
    • ::split_off_mut
    • ::split_off_first
    • ::split_off_first_mut
    • ::split_off_last
    • ::split_off_last_mut
    • String::extend_from_within
    • os_str::Display
    • OsString::display
    • OsStr::display
    • io::pipe
    • io::PipeReader
    • io::PipeWriter
    • impl From for OwnedHandle
    • impl From for OwnedHandle
    • impl From for Stdio
    • impl From for Stdio
    • impl From for OwnedFd
    • impl From for OwnedFd
    • Box<MaybeUninit>::write
    • impl TryFrom<Vec> for String
    • ::offset_from_unsigned
    • ::byte_offset_from_unsigned
    • ::offset_from_unsigned
    • ::byte_offset_from_unsigned
    • NonNull::offset_from_unsigned
    • NonNull::byte_offset_from_unsigned
    • ::cast_signed
    • NonZero::::cast_signed.
    • ::cast_unsigned.
    • NonZero::::cast_unsigned.
    • ::is_multiple_of
    • ::unbounded_shl
    • ::unbounded_shr
    • ::unbounded_shl
    • ::unbounded_shr
    • ::midpoint
    • ::from_utf8
    • ::from_utf8_mut
    • ::from_utf8_unchecked
    • ::from_utf8_unchecked_mut
  • Príznak „const“ bol použitý v funkciách:
    • core::str::from_utf8_mut
    • ::copy_from_slice
    • SocketAddr::set_ip
    • SocketAddr::set_port,
    • SocketAddrV4::set_ip
    • SocketAddrV4::set_port,
    • SocketAddrV6::set_ip
    • SocketAddrV6::set_port
    • SocketAddrV6::set_flowinfo
    • SocketAddrV6::set_scope_id
    • char::is_digit
    • char::is_whitespace
    • <N::as_flattened
    • <N::as_flattened_mut
    • String::into_bytes
    • String::as_str
    • String::capacity
    • String::as_bytes
    • String::len
    • String::is_empty
    • String::as_mut_str
    • String::as_mut_vec
    • Vec::as_ptr
    • Vec::as_slice
    • Vec::capacity
    • Vec::len
    • Vec::is_empty
    • Vec::as_mut_slice
    • Vec::as_mut_ptr
  • Druhý úroveň podpory pre cieľovú platformu i586-pc-windows-msvc bola odstránená. Odporúča sa používať platformu i686-pc-windows-msvc, ktorá sa líši podporou inštrukcií SSE2. Platforma i586-pc-windows-msvc stratila význam, pretože pre Windows 10 je potrebná podpora SSE2 a staršie verzie Windows v Rust nie sú podporované.

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