Rust 1.45 programozási nyelv kiadás

közzétett A rendszer programozási nyelvének 1.45-es kiadása Rozsdaa Mozilla projekt alapította. A nyelv a biztonságos memóriakezelésre összpontosít, automatikus memóriakezelést biztosít, és biztosítja a magas párhuzamos munkavégzés elérését, miközben elkerüli a szemétgyűjtő és futásidejű.

A Rust automatikus memóriakezelése megóvja a fejlesztőt a mutatók manipulálása során előforduló hibáktól, és védelmet nyújt az alacsony szintű memóriakezelés miatt felmerülő problémák ellen, mint például a memóriaterület elérése annak felszabadítása után, a nulla mutatók hivatkozásának megszüntetése, a puffertúllépések stb. A programkönyvtárak terjesztéséhez, az összeállítás biztosításához és a függőségek kezeléséhez a projekt csomagkezelőt fejleszt ki Szállítmány, amely lehetővé teszi, hogy egy kattintással megszerezze a programhoz szükséges könyvtárakat. Egy tárhely támogatott a könyvtárak fogadására ládák.io.

A főbb innovációk:

  • Régóta megszüntetve disszidál egész számok és lebegőpontos számok közötti átalakítás során. Mivel a Rust fordító az LLVM-et használja háttérként, a típuskonverziós műveleteket LLVM közbenső kódutasításokon keresztül hajtották végre, mint pl. fptoui, amelyeknek van egy jelentős tulajdonsága - definiálatlan viselkedés, ha az eredményül kapott érték nem fér bele a céltípusba. Például az f300 típusú 32 lebegőérték u8 típusú egész számmá konvertálásakor az eredmény megjósolhatatlan, és a különböző rendszereken változhat. A probléma az, hogy ez a funkció olyan kódban jelenik meg, amely nincs megjelölve „nem biztonságos”.

    A Rust 1.45-től kezdve a típusméret-túlcsordulás viselkedése szigorúan szabályozott, és az "as" konverziós művelet ellenőrzi a túlcsordulást, és kényszeríti a konvertálást a céltípus maximális vagy minimális értékére (a fenti példában egy 300-at 255-re alakítanak át). Az ilyen ellenőrzések letiltásához további API-hívások állnak rendelkezésre „{f64, f32}::to_int_unchecked”, amelyek nem biztonságos módban működnek.

    fn cast(x: f32) -> u8 {
    x mint u8
    }

    fn main() {
    legyen túl_nagy = 300.0;
    legyen túl kicsi = -100.0;
    legyen nan = f32::NAN;

    legyen x: f32 = 1.0;
    legyen y: u8 = nem biztonságos { x.to_int_unchecked() };

    println!("túl_big_casted = {}", cast(túl_nagy)); // 255. kimenet
    println!("túl_small_casted = {}", cast(túl_kicsi)); // 0. kimenet
    println!("not_a_number_casted = {}", cast(nan)); // 0. kimenet
    }

  • Stabilizált használat eljárási makrókfüggvényszerű kifejezések, sablonok és utasítások. Korábban az ilyen makrókat nem lehetett mindenhol meghívni, csak a kód bizonyos részein (külön hívásként, más kóddal nem összefonva). A makrók hívhatóságának kiterjesztése a függvényekhez hasonlóan az egyik követelmény volt a webes keretrendszer működéséhez. Rakéta a Rust stabil kiadásaiban. Korábban a kezelők meghatározásában a Rocketben további rugalmasság eléréséhez engedélyezni kellett a „proc_macro_hygiene” nevű kísérleti funkciót, amely a Rust stabil verzióiban nem érhető el. Ez a funkció most be van építve a nyelv stabil kiadásaiba.
  • Engedélyezett a „char” típusú tartományok használata a tartományon belüli értékek iterálásához (ops::{Range, RangeFrom, RangeFull, RangeInclusive, RangeTo}):

    for ch in 'a'..='z' {
    nyomtat!("{}", ch);
    }
    println!(); // Kinyomtatja az "abcdefghijklmnopqrstuvwxyz" kifejezést

  • Az API új része átkerült a stabil kategóriába, beleértve a stabilizáltat is
    Arc::as_ptr,
    BTreeMap::remove_entry,
    Rc::as_ptr,
    rc::Gyenge::as_ptr,
    rc::Gyenge::from_raw,
    rc::Gyenge::into_raw,
    str::szalag_előtag,
    str::strip_suffix,
    szinkronizálás::Gyenge::as_ptr,
    sync::Gyenge::from_raw,
    sync::Gyenge::in_raw,
    char::UNICODE_VERSION,
    Span::resolved_at,
    Span::located_at,
    Span::mixed_site,
    unix::process::CommandExt::arg0.

  • A rustc fordító támogatja a különböző célplatform-szolgáltatások felülbírálását a „target-feature” jelzővel, például „-C target-feature=+avx2,+fma”. Új zászlók is hozzáadásra kerültek:
    "force-unwind-tables" a feloldó hívástáblák létrehozásához, függetlenül az összeomláskezelési stratégiától; "embed-bitcode" annak szabályozására, hogy az LLVM bitkód szerepeljen-e a generált rlib-ekben. Az "embed-bitcode" jelző alapértelmezés szerint engedélyezve van a Cargo-ban az összeállítási idő és a lemezterület-felhasználás optimalizálása érdekében.

  • A harmadik támogatási szint a mipsel-sony-psp és a thumbv7a-uwp-windows-msvc platformok számára biztosított. A harmadik szint alapvető támogatást foglal magában, de automatikus tesztelés és a hivatalos buildek közzététele nélkül.

Ezenkívül meg lehet jegyezni a történet a legegyszerűbb létrehozásáról alkalmazások Rust nyelven, elkezdi használni a rendszerbetöltőt, és készen áll az önálló betöltésre az operációs rendszer helyett.
A cikk az első az alacsony szintű programozásban és az operációs rendszer fejlesztésében keresett technikák bemutatására szolgáló sorozatban.

Forrás: opennet.ru

Hozzászólás