Lansarea limbajului de programare Rust 1.36

publicat lansarea limbajului de programare a sistemului Rugina 1.36, fondată de proiectul Mozilla. Limbajul se concentrează pe siguranța memoriei, oferă o gestionare automată a memoriei și oferă un mijloc de a obține un paralelism ridicat al sarcinilor fără a utiliza un colector de gunoi sau un timp de rulare.

Gestionarea automată a memoriei Rust eliberează dezvoltatorul de manipularea pointerului și protejează împotriva problemelor care decurg din manipularea memoriei de nivel scăzut, cum ar fi accesările la memorie după eliberarea, dereferențele pointerului nul, depășirile de buffer și altele asemenea. Se dezvoltă un manager de pachete pentru a distribui biblioteci, a asigura asamblarea și a gestiona dependențele de către proiect. încărcătură, permițându-vă să obțineți bibliotecile necesare pentru program cu un singur clic. Un depozit este acceptat pentru a găzdui biblioteci lăzi.io.

Principalul inovații:

  • Trăsătură stabilizată Viitor, care reprezintă o valoare a cărei evaluare poate să nu fie încă finalizată în timpul utilizării blocurilor async / .wait. Valorile asincrone definite folosind Future fac posibilă continuarea executării lucrărilor utile în fir, așteptând simultan finalizarea calculelor de o anumită valoare;
  • Biblioteca stabilizată aloc, care oferă indicatoare și colecții inteligente pentru gestionarea valorilor alocate de memorie. Alocarea memoriei în std folosește acum tipul Un lucru, care sunt reexportate din aloc. Utilizarea separată a alloc are sens în aplicațiile care nu sunt legate de std („#![no_std]”), precum și în bibliotecile concepute pentru a fi utilizate în programe similare fără std;
  • Pentru a ocoli verificările pentru inițializarea corectă a valorilor propus tip intermediar Poate Unitatea, care poate fi folosit în locul funcției mem::uninițialized ca o alternativă mai sigură. Funcția mem::uninitialized este convenabilă pentru crearea rapidă a tablourilor, dar induce în eroare compilatorul deoarece pare să fi fost inițializat, dar în realitate valoarea rămâne neinițializată. MaybeUninit vă permite să indicați în mod explicit compilatorului că valoarea este neinițializată, să țineți cont de posibilul comportament nedefinit asociat cu acesta și, de asemenea, să organizați verificări în programe prin „maybe_t:” și inițializarea pas cu pas, marcând finalizarea acesteia folosind apelul „.assume_init()”. Odată cu apariția MaybeUninit, funcția mem::uninițialized a fost depreciată și nu este recomandată pentru utilizare;
  • Tehnica NLL (Non-Lexical Lifetimes), care a extins sistemul de înregistrare a duratei de viață a variabilelor împrumutate, a fost stabilizată pentru limbajul Rust 2015 (inițial, NLL a fost acceptat doar de Rust 2018). În loc să comite durate de viață la nivel lexical, NLL face acest lucru la nivelul setului de pointeri din graficul fluxului de execuție. Această abordare vă permite să creșteți calitatea verificării împrumutării variabilelor (verificatorul de împrumut) și să permiteți executarea unor tipuri de cod corect, a cărui utilizare a condus anterior la o eroare. Noul comportament face, de asemenea, mult mai ușoară depanarea;
  • Noua implementare a tablourilor asociative inclusă Hashmap, pe baza aplicării structurii Masa Elvețiană (încărcat automat hashbrown::HashMap, cu excepția cazului în care se specifică în mod explicit altfel, cum ar fi std::HashMap, care se bazează pe SipHash 1-3). Interfața software rămâne aceeași, iar diferențele vizibile de dezvoltator se rezumă la performanță sporită și consum redus de memorie;
  • În managerul de pachete cargo adăugat opțiunea „--offline”, care permite operarea fără accesarea rețelei, în care la instalarea dependențelor sunt folosite doar pachetele stocate în cache în sistemul local. Dacă dependența nu se află în memoria cache locală, va fi generată o eroare. Pentru a preîncărca dependențele în memoria cache locală înainte de a fi offline, puteți utiliza comanda „cargo fetch”;
  • S-a implementat capacitatea de a apela macro-ul „dbg!” indicarea mai multor argumente;
  • Atributul „const”, care determină posibilitatea utilizării în orice context în locul constantelor, este utilizat pentru metode
    Layout::from_size_align_unchecked,
    mem::needs_drop,
    NonNull::legănând și
    NonNull::cast;

  • O nouă parte a API-urilor a fost transferată în categoria stabilă, inclusiv metodele care au fost stabilizate
    task::Waker, task::Poll,
    VecDeque::rotate_left, VecDeque::rotate_right,
    Read::read_vectored, Write::write_vectored,
    Iterator::copiat,
    BorrowMut (pentru șiruri de caractere) și str::as_mut_ptr.

Sursa: opennet.ru

Adauga un comentariu