Megjelent a Mozilla projekt által indított, de ma már a független, nonprofit Rust Foundation által fejlesztett, általános célú Rust 1.86 programozási nyelv. A nyelv a memória biztonságos kezelésére összpontosít, és eszközöket biztosít a feladatok magas párhuzamos végrehajtásának eléréséhez, mindezt anélkül, hogy szemétgyűjtőt vagy futási időt (runtime) használnának (a futási időt a standard könyvtár alapértelmezett inicializációjára és karbantartására korlátozzák).
A Rust memória kezelésének módszerei megszüntetik a fejlesztők hibáit a mutatókkal való manipulálás során, és védelmet nyújtanak az alacsony szintű memória kezelésből adódó problémákkal szemben, mint például a már felszabadított memória területére való hivatkozás, null-pointer dereferálás, pufferméret túllépés stb. A könyvtárak terjesztésére, a build biztosítására és a függőségek kezelésére a Cargo csomagkezelő fejlesztés alatt áll. A könyvtárak elhelyezésére a crates.io tároló támogatott.
A memória biztonságos kezelése a Rustban a fordítási időben történik, a hivatkozások ellenőrzésén, az objektumok tulajdonjogának nyomon követésén, az objektumok élettartamának (láthatóságának) figyelembevételén és a memória hozzáférésének helyességének értékelésén keresztül a kód futtatásakor. A Rust emellett eszközöket biztosít az egész számok túllépésének elleni védelemhez, kötelezővé teszi a változók értékeinek inicializálását használat előtt, jobban kezeli a hibákat a standard könyvtárban, alkalmazza a változatlan (immutable) hivatkozások és változók fogalmát alapértelmezés szerint, és erős statikus típussal minimalizálja a logikai hibákat.
Főbb újítások:
- Hozzáadva a típusok alapvető szupertípusra (supertrait) való felminősítésének támogatása, azaz lehetőség van közvetlenül átkonvertálni a trait objektumokra mutató hivatkozásokat a szupertrait objektumokra mutató hivatkozásokká, anélkül hogy külön módszert kellene létrehozni a trait-re, amely visszaadja a szupertrait-re mutató hivatkozást. Hasonló műveletet végezhetünk más típusú okos mutatókkal is, például az „Arc<dyn Trait> -> Arc<dyn Supertrait>” és „*const dyn Trait -> *const dyn Supertrait”. trait Trait: Supertrait {} trait Supertrait {} fn upcast(x: &dyn Trait) -> &dyn Supertrait { x }
- A HashMap és vágatok (slice) esetében hozzáadva a get_disjoint_mut() módszert több módosítható hivatkozás egyidejű megszerzésére. Korábban a borrow checker nem engedte meg a hivatkozások egyidejű használatát, amelyeket a get_mut() módszer segítségével szereztek meg. let v = &mut [1, 2, 3]; if let Ok([a, b]) = v.get_disjoint_mut([0, 2]) { *a = 413; *b = 612; } assert_eq!(v, &[413, 2, 612]); if let Ok([a, b]) = v.get_disjoint_mut([0..1, 1..3]) { a[0] = 8; b[0] = 88; b[1] = 888; } assert_eq!(v, &[8, 88, 888]);
- Megengedett a safe-funkciók megjelölése a „#[target_feature]” attribútummal, amely jelzi, hogy a funkció a megadott CPU képességeit használja. A „#[target_feature]” attribútummal megjelölt safe-funkciót egy másik safe-funkció csak akkor hívhatja meg biztonságosan, ha ő is meg van jelölve „#[target_feature]” által (különben ezek a funkciók unsafe-blokkon belül hívhatók meg). Ezeket nem lehet olyan funkciókba átadni, amelyek általános (generic) paramétereket fogadnak, amelyeket Fn* traitek korlátoznak. Korábban a „#[target_feature]” attribútumot csak a „unsafe” jelölésű funkciókra lehetett alkalmazni. #[target_feature(enable = "avx2")] fn requires_avx2() { \/\/ … } #[target_feature(enable = "avx2")] fn safe_callsite() { requires_avx2(); } fn unsafe_callsite() { if is_x86_feature_detected!("avx2") { unsafe { requires_avx2() }; } }
- A Rust fordítóban engedélyezve van a debug-assert alábbiak szerint a NULL értékű mutatók olvasásakor és írásakor. Például a következő kód most „panic”-t eredményez: let _x = *std::ptr::null::(); let _x = &*std::ptr::null::();
- Alapértelmezés szerint engedélyezve van a „missing_abi” lint-ellenőrzés, amely figyelmeztetést ad, ha az extern kulcsszó után nincs megadva ABI. Korábban, ha az extern után nem adtak meg ABI-t, akkor az „C” ABI-t használták. Most ajánlott egyértelműen megadni az „C” ABI-t, például ‘extern „C” {}’ és ‘extern „C” fn’.
- Új API-k kerültak a stabil kiadások közé, beleértve a metódusok és típusimplementációk stabilizálását:
- {float}::next_down
- {float}::next_up
- ::get_disjoint_mut
- ::get_disjoint_unchecked_mut
- slice::GetDisjointMutError
- HashMap::get_disjoint_mut
- HashMap::get_disjoint_unchecked_mut
- NonZero::count_ones
- Vec::pop_if
- sync::Once::wait
- sync::Once::wait_force
- sync::OnceLock::wait
- A «const» jelző alkalmazása a funkciókban:
- hint::black_box
- io::Cursor::get_mut
- io::Cursor::set_position
- str::is_char_boundary
- str::split_at
- str::split_at_checked
- str::split_at_mut
- str::split_at_mut_checked
- Bevezetésre került a harmadik szintű támogatás a következő platformokhoz: {aarch64-unknown,x86_64-pc}-nto-qnx710_iosock, {aarch64-unknown,x86_64-pc}-nto-qnx800, {x86_64,i686}-win7-windows-gnu, amdgcn-amd-amdhsa, x86_64-pc-cygwin, {mips,mipsel}-mti-none-elf, m68k-unknown-none-elf, armv7a-nuttx-{eabi,eabihf}, aarch64-unknown-nuttx és thumbv7a-nuttx-{eabi,eabihf}. A harmadik szint alapvető támogatást jelent, de automatizált tesztelés, hivatalos kiadások publikálása és a kód összeállításának ellenőrzése nélkül.
- Figyelmeztetés érkezett a második szintű támogatás megszűnésére az i586-pc-windows-msvc célplatform esetén a következő kiadásban (1.87). Javasolt az i686-pc-windows-msvc platform használata, amely SSE2 utasítások támogatásával rendelkezik. Az i586-pc-windows-msvc platform elveszítette jelentőségét, mivel a Windows 10-hez szükség van az SSE2 támogatására, ráadásul a régebbi Windows verziók számára a Rust nem nyújt támogatást.
További megjegyzés, hogy a Ferrocene vállalat átadta a közösségnek a Rust nyelv specifikációját (FLS – Ferrocene Language Specification), amelyet a Rust fordítójuk fejlesztése során készítettek és időszakosan szinkronizálnak a Rust fő fordítójának aktuális állapotával. Az FLS specifikáció tartalmaz egy strukturált és részletes útmutatót a Rust szintaxisáról, szemantikai tulajdonságairól és működéséről, amely alkalmas a verifikációra, kompatibilitás értékelésére és a standardizálásra.
A benyújtott anyagokat a Rust nyelv referencia specifikációjának elkészítésére használják, amely alternatív fordítók fejlesztésére és a fordítók ellenőrzésére is alkalmazható olyan területeken, amelyek kritikusak a biztonság szempontjából.
Forrás: opennet.ru
