Lansarea limbajului de programare Rust 1.59 cu suport pentru inserții de asamblare

A fost publicată lansarea limbajului de programare de uz general Rust 1.59, fondat de proiectul Mozilla, dar dezvoltat acum sub auspiciile organizației independente non-profit Rust Foundation. Limbajul se concentrează pe siguranța memoriei și oferă mijloacele pentru a obține un paralelism ridicat al jobului, evitând în același timp utilizarea unui colector de gunoi și a unui timp de rulare (timpul de rulare este redus la inițializarea de bază și întreținerea bibliotecii standard).

Metodele de manipulare a memoriei Rust salvează dezvoltatorul de erori la manipularea pointerilor și protejează împotriva problemelor care apar din cauza manipulării memoriei de nivel scăzut, cum ar fi accesarea unei zone de memorie după ce aceasta a fost eliberată, dereferențiarea pointerilor nuli, depășirile de buffer etc. Pentru a distribui biblioteci, a furniza versiuni și a gestiona dependențe, proiectul dezvoltă managerul de pachete Cargo. Depozitul crates.io este acceptat pentru găzduirea bibliotecilor.

Siguranța memoriei este furnizată în Rust în timpul compilării prin verificarea referințelor, urmărirea proprietății obiectului, urmărirea duratelor de viață a obiectelor (sfere de aplicare) și evaluarea corectitudinii accesului la memorie în timpul execuției codului. Rust oferă, de asemenea, protecție împotriva depășirilor de numere întregi, necesită inițializarea obligatorie a valorilor variabilelor înainte de utilizare, gestionează mai bine erorile în biblioteca standard, aplică implicit conceptul de referințe imuabile și variabile, oferă tastare statică puternică pentru a minimiza erorile logice.

Principalele inovații:

  • Este posibil să se utilizeze inserții în limbaj de asamblare, care sunt solicitate în aplicațiile care trebuie să controleze execuția la un nivel scăzut sau să poată utiliza instrucțiuni specializate ale mașinii. Inserțiile de asamblare sunt adăugate folosind macrocomenzi „asm!” și „global_asm!” folosind sintaxa de formatare a șirurilor pentru denumirea registrelor similară cu cea folosită pentru substituțiile de șiruri în Rust. Compilatorul acceptă instrucțiuni de asamblare pentru arhitecturile x86, x86-64, ARM, AArch64 și RISC-V. Exemplu de inserare: utilizați std::arch::asm; // Înmulțiți x cu 6 folosind schimburi și adunări let mut x: u64 = 4; nesigur { asm!( „mov {tmp}, {x}”, „shl {tmp}, 1”, „shl {x}, 2”, „adăugați {x}, {tmp}”, x = inout(reg ) x, tmp = out(reg) _, ); } assert_eq!(x, 4 * 6);
  • S-a adăugat suport pentru sarcini destructurate (paralele), în care mai multe trăsături, felii sau structuri sunt specificate în partea stângă a expresiei. De exemplu: fie (a, b, c, d, e); (a, b) = (1, 2); [c, .., d, _] = [1, 2, 3, 4, 5]; Struct { e, .. } = Struct { e: 5, f: 3 }; assert_eq!([1, 2, 1, 4, 5], [a, b, c, d, e]);
  • Este posibil să se specifice valori implicite pentru generice const: struct ArrayStorage { arr: [T; N], } impl ArrayStorage { fn new(a: T, b: T) -> ArrayStorage { ArrayStorage { arr: [a, b], } } }
  • Managerul de pachete Cargo oferă avertismente despre utilizarea structurilor nevalide în dependențe care sunt procesate din cauza erorilor din compilator (de exemplu, din cauza unei erori, câmpurile structurilor împachetate au fost permise să fie împrumutate în blocuri sigure). Astfel de construcții nu vor mai fi acceptate într-o versiune viitoare a Rust.
  • Cargo și rustc au o capacitate încorporată de a genera fișiere executabile fără date de depanare (strip = „debuginfo”) și simboluri (strip = „simboluri”), fără a fi nevoie să apelați un utilitar separat. Setarea de curățare este implementată prin parametrul „strip” din Cargo.toml: [profile.release] strip = „debuginfo”, „symbols”
  • Compilarea incrementală este dezactivată implicit. Se spune că motivul este o soluție temporară pentru o eroare în compilator care duce la blocări și erori de deserializare. O remediere a erorilor a fost deja pregătită și va fi inclusă în următoarea versiune. Pentru a returna compilarea incrementală, puteți utiliza variabila de mediu RUSTC_FORCE_INCREMENTAL=1.
  • O nouă porțiune a API-ului a fost mutată în categoria de stabil, inclusiv metodele și implementările de trăsături au fost stabilizate:
    • std::thread::available_paralelism
    • Rezultat::copiat
    • Rezultat::clonat
    • arh::asm!
    • arch::global_asm!
    • ops::ControlFlow::is_break
    • ops::ControlFlow::is_continue
    • Încercați de la u8
    • char::TryFromCharError (Clone, Debug, Display, PartialEq, Copy, Eq, Error)
    • iter::zip
    • NonZeroU8::este_puterea_a_doi
    • NonZeroU16::este_puterea_a_doi
    • NonZeroU32::este_puterea_a_doi
    • NonZeroU64::este_puterea_a_doi
    • NonZeroU128::este_puterea_a_doi
    • DoubleEndedIterator pentru structura ToLowercase
    • DoubleEndedIterator pentru structura ToUppercase
    • TryFrom pentru [T; N]
    • UnwindSafe pentru structura Once
    • RefUnwindSafe pentru o dată
    • Funcții de suport armv8 neon încorporate în compilatorul pentru aarch64
  • Atributul „const”, care determină posibilitatea utilizării lui în orice context în loc de constante, este utilizat în funcțiile:
    • mem::MaybeUninit::as_ptr
    • mem::MaybeUninit::assume_init
    • mem::MaybeUninit::assume_init_ref
    • ffi::CStr::from_bytes_with_nul_unchecked

Sursa: opennet.ru

Adauga un comentariu