Lansarea limbajului de programare Rust 1.40

publicat lansarea limbajului de programare a sistemului Rugina 1.40, fondată de proiectul Mozilla. Limbajul se concentrează pe siguranța memoriei, oferă gestionarea automată a memoriei și oferă instrumente pentru realizarea unui paralelism ridicat al sarcinilor fără a utiliza un colector de gunoi și Runtime.

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:

  • A fost adăugată capacitatea de a marca structuri (struct) și enumerare (enum cu bloc Variant) folosind atributul "#[non_exhaustive]", care Acesta permite în viitor, adăugați noi câmpuri și opțiuni la structurile și enumerațiile declarate. De exemplu, dezvoltatorii de module care au structuri cu câmpuri declarate public pot folosi „#[non_exhaustive]” pentru a marca structurile care pot avea noi câmpuri adăugate în viitor. Până acum, în această situație, dezvoltatorul era nevoit să aleagă între declararea câmpurilor în mod privat și legarea la o listă imuabilă de câmpuri. Noul atribut elimină această limitare și vă permite să adăugați noi câmpuri în viitor fără riscul de a rupe codul extern compilat anterior. În pachetele crate, la potrivirea opțiunilor din secțiunea „potrivire”, este necesară o definiție explicită a măștii „_ => {...}”, acoperind posibilele câmpuri viitoare, altfel va fi afișată o eroare la adăugarea de noi câmpuri.
  • Adăugat abilitatea de a apela macro-ul procedural mac!() într-un context de tip. De exemplu, acum puteți scrie „type Foo = expand_to_type!(bar);” dacă „expand_to_type” este o macrocomandă procedurală.
  • În blocurile „externe { ... }”. adăugat abilitatea de a utiliza macrocomenzi procedurale și cu atribute, inclusiv macrocomenzi „bang!()”, de exemplu:

    macro_reguli! make_item { ($nume:ident) => { fn $nume(); } }

    extern {
    make_item!(alfa);
    make_item!(beta);
    }

    extern "C" {
    #[macro_identitatea_mea] fn foo();
    }

  • În macro-uri implementate capacitatea de a genera elemente „macro_rules!”. Se generează „macro_rules!” posibil atât în ​​macro-uri asemănătoare funcțiilor (“mac!()”), cât și în macro-uri sub formă de atribute (“#[mac]”).
  • În elementul de mapare $m:meta adăugat suport pentru valori arbitrare de enumerare a simbolurilor ("[TOKEN_STREAM]", "{TOKEN_STREAM}" și "(TOKEN_STREAM)"), de exemplu:

    macro_reguli! accept_meta { ($m:meta) => {} }
    accept_meta!( my::path );
    accept_meta!( my::path = "lit" );
    accept_meta!( my::path ( abc ) );
    accept_meta!( my::path [ abc ] );
    accept_meta!( my::path { abc } );

  • În modul Rust 2015, ieșirea erorilor este activată pentru problemele identificate la verificarea împrumutării variabilelor (verificatorul de împrumut) folosind tehnica NLL (Non-Lexical Lifetimes). Anterior, avertismentele au fost înlocuite cu erori la rularea în modul Rust 2018.
    După ce schimbarea a fost extinsă la modul Rust 2015, dezvoltatorii au putut în sfârșit să o facă scapa de de la vechiul verificator de împrumuturi.

    Să reamintim că sistemul de verificare bazat pe un nou mecanism de luare în considerare a duratei de viață a variabilelor împrumutate a făcut posibilă identificarea unor probleme care au trecut neobservate de vechiul cod de verificare. Deoarece ieșirea erorilor pentru astfel de verificări ar putea afecta compatibilitatea cu codul funcțional anterior, avertismentele au fost emise inițial în loc de erori.

  • Atributul „const”, care determină posibilitatea utilizării lui în orice context în loc de constante, este utilizat pentru funcția is_power_of_two (pentru numere întregi fără semn).
  • O nouă porțiune a API-ului a fost mutată în categoria stabilă, inclusiv macro-ul todo!() și metodele slice::repeat, mem::take, BTreeMap::get_key_value, HashMap::get_key_value, au fost stabilizate.
    Option::as_deref, Option::as_deref_mut, Option::flatten, UdpSocket::peer_addr, {f32,f64}::to_be_bytes, {f32,f64}::to_le_bytes,{f32,f64}::to_ne_bytes, {f32,f64} f32}::from_be_bytes, {f64,f32}::from_le_bytes și {f64,fXNUMX}::from_ne_bytes.

  • În managerul de pachete cargo
    implementate memorarea în cache a avertismentelor compilatorului pe disc. S-a adăugat opțiunea „metadate de marfă” la comanda „metadate de marfă”.--platforma-filtru" pentru a afișa numai pachetele legate la platforma țintă specificată în coloana de rezoluție a dependenței. S-a adăugat opțiunea de configurare a versiunii http.ssl pentru a defini versiunile TLS valide.
    S-a adăugat posibilitatea de a publica secțiunea „dependențe de dezvoltare" fără a specifica cheia "versiune".

  • Compilatorul rustc oferă suport de nivel al treilea pentru platformele țintă thumbv7neon-unknown-linux-musleabihf, aarch64-unknown-none-softfloat, mips64-unknown-linux-muslabi64 și mips64el-unknown-linux-muslabi64. Al treilea nivel implică suport de bază, dar fără testarea automată și publicarea versiunilor oficiale.

Sursa: opennet.ru

Adauga un comentariu