Rust 1.51 programozási nyelv kiadás

Megjelent a Mozilla projekt által alapított, de immár a Rust Foundation független non-profit szervezet égisze alatt kifejlesztett Rust 1.51 rendszerprogramozási nyelv kiadása. A nyelv a memória biztonságára összpontosít, automatikus memóriakezelést biztosít, és biztosítja a magas szintű párhuzamosság elérését szemétgyűjtő vagy futási idő nélkül (a futásidő a szabványos könyvtár alapvető inicializálására és karbantartására csökken).

A Rust automatikus memóriakezelése kiküszöböli a mutatók manipulálása során fellépő hibákat, és védelmet nyújt az alacsony szintű memóriamanipulációból eredő problémák ellen, mint például a memóriaterület felszabadítása utáni hozzáférés, nullmutató hivatkozások, puffertúllépések stb. A programkönyvtárak terjesztésére, az összeállítás biztosítására és a függőségek kezelésére a projekt a Cargo csomagkezelőt fejleszti. A crates.io tároló támogatja a könyvtárak tárolását.

Főbb újítások:

  • Az állandó generikumok használatához kapcsolódó funkcionalitás elnyerte a minimális életképes termék (MVP) státuszt, ami zöld utat ad a széles körű használathoz. A Const generikusok lehetővé teszik a típusok állandó értékekre történő általánosítását, azaz. általános argumentumokat használjon, amelyek konstans értékekre korlátozódnak, nem típusokra vagy élettartamokra. Ez a funkció lehetővé teszi egész számokkal paraméterezett típusok és absztrakció használatát, amikor bármilyen méretű tömbhöz hoz létre jellemzőket anélkül, hogy külön típust kellene létrehoznia minden érvényes értéktartományhoz, hogy ne legyenek határon túli előfordulások.

    Az aktuális kiadástól kezdve a „[T; N]" (T típus és N méret) lehetővé teszi a típus és méret elvonatkoztatását tetszőleges egész számmal, logikai értékkel és karaktertípussal (a struct és enum típusok még nem támogatottak). Az állandó általánosságok nagymértékben leegyszerűsítik a könyvtárfejlesztést; például olyan tömb használatához, amely nincs egy adott típushoz és mérethez kötve, a következőket adhatja meg: struct Array { // ^^^^^^^^^^^^^^^^^^^ egy állandó általános lista definíciója: [T; LENGTH] // ^^^^^^ használata }

    Amikor ténylegesen ezzel a meghatározással használjuk a „Tömb » a fordító létrehozza az Array monomorf változatát: struct Array { lista: [u8; 32] }

  • Stabilizálódott a konstans általánosságokon alapuló std::array::IntoIter API, amellyel tetszőleges tömbhöz érték szerint iterátorokat hozhat létre: fn main() { let array = [1, 2, 3, 4, 5] ; // Korábban egy érték feletti iterációhoz meg kellett hívni az .iter() metódust az itemhez a array.iter().copied() { println!("{}", item); } // Most megadhatja az elemet az std::array::IntoIter::new(array) { println!("{}", item); } }
  • A cargo csomagkezelő mostantól támogatja a Cargo.toml új feloldómezőjét, amellyel engedélyezhető a szolgáltatásfeloldó második verziója. A definer új verziója elkerüli a „[szolgáltatások]” részben felsorolt ​​függőségi jellemzők kombinálását, ha ez nem megfelelő, például ha olyan függőséget tartalmaz, amely valamilyen szabványos szolgáltatást kér a build szkriptekben és makrókban, de nem szabványos szolgáltatás használatakor. az eredményül kapott futtatható fájlban .

    Eddig a függőségi grafikonon többször említett csomag képességeit kombinálták. Például, ha egy projekt tartalmaz egy foo függőséget, amely meghatározza az A és B képességeket, és ezt a csomagot használják a többi bar és baz csomagban, még akkor is, ha a bar függ a foo-tól az A jellemzővel, és a baz függ a foo-tól a B jellemzővel, akkor az eredmény az lesz, hogy a cargo kombinálja ezeket a funkciókat, és a foo-t az A és B jellemzőkkel fordítja. Ez a módszer egy olyan funkciót eredményezhet, amely bizonyos függőség miatt engedélyezve van azzal a célrendszerrel, amelyre az eredményül kapott build készült. Például, ha a foo "#![no_std]"-es verzióját szeretné használni egy "#![no_std]"-vel épített végrehajtható fájlban, és ugyanakkor használja a foo-t "std"-vel az összeépítés során. rs. Amikor a Cargo.toml fájlban a solver="2" értéket adja meg, a csomagkezelő megpróbálja megfelelően kezelni ezt az ütközést, elkülönítve a fejlesztői, gazdagép- és célfüggőségeket.

  • A Cargo megvalósítja a „[profile]” szakaszban beállított split-debuginfo opciót és a megfelelő „-Csplit-debuginfo=unpacked” jelzőt a rustc-ben, új módszert kínálva a hibakeresési információk mentésére, ami szükségtelenné teszi hívja a dsymutil segédprogramot, és jelentősen felgyorsítja a felépítési folyamatot a macOS hibakeresési információival.
  • Stabilizált makos "ptr::addr_of!" és a „ptr::addr_of_mut!”, amelyek lehetővé teszik nyers mutatók létrehozását a nem igazított mezőkhöz. használja std::ptr; #[repr(packed)] struct Packed { f1: u8, f2: u16, } let packed = Csomagolt { f1: 1, f2: 2 }; // A &packed.f2 egy nem igazított mutatót hoz létre, amely meghatározatlan viselkedéshez vezet. Let raw_f2 = ptr::addr_of!(packed.f2); assert_eq!(nem biztonságos { raw_f2.read_unaligned() }, 2);
  • Az API új része átkerült a stabil kategóriába, beleértve a következő módszereket is stabilizálva:
    • Arc::decrement_strong_count
    • Ív::növekmény_erős_számlálás
    • Once::call_once_force
    • Peekable::next_if_eq
    • Peekable::next_if
    • Seek::stream_position
    • array::IntoIter
    • pánik::pánik_bármilyen
    • ptr::addr_of!
    • ptr::addr_of_mut!
    • szelet::fill_with
    • slice::split_inclusive_mut
    • szelet::split_inclusive
    • slice::strip_prefix
    • slice::strip_suffix
    • str::split_inclusive
    • sync::OnceState
    • feladat::Ébresztés
  • A támogatás harmadik szintje az i386-unknown-linux-gnu, i486-unknown-linux-gnu, aarch64_be-unknown-linux-gnu, aarch64-unknown-linux-gnu_ilp32 és aarch64_be-unknown-linux-gnu_ilp32 platformokhoz valósult meg. . A harmadik szint alaptámogatást foglal magában, de automatikus tesztelés, hivatalos buildek közzététele vagy annak ellenőrzése nélkül, hogy a kód összeállítható-e.

Forrás: opennet.ru

Hozzászólás