Megjelent a Rust 1.82. Új böngésző Rust alapú. Rust használata a Volvóban

Megjelent a Mozilla projekt által alapított, de immár a Rust Foundation független non-profit szervezet égisze alatt kifejlesztett Rust 1.82 általános célú programozási nyelv. A nyelv a memória biztonságára összpontosít, és biztosítja az eszközöket a munka magas párhuzamosságának eléréséhez, miközben elkerüli a szemétgyűjtő és a futási időt (a futásidő a szabványos könyvtár alapvető inicializálására és karbantartására csökken).

A Rust memóriakezelési módszerei megóvják a fejlesztőt a mutatók manipulálása során előforduló hibáktól, és megóvják az alacsony szintű memóriakezelésből adódó problémáktól, 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, a buildek biztosításához és a függőségek kezeléséhez a projekt fejleszti a Cargo csomagkezelőt. A crates.io tároló támogatja a könyvtárak tárolását.

A memóriabiztonságot a Rust a fordítási időben biztosítja a referenciaellenőrzés, az objektumok tulajdonjogának nyomon követése, az objektumok élettartamának (hatóköreinek) nyomon követésével és a memória-hozzáférés helyességének értékelésével a kód végrehajtása során. A Rust védelmet nyújt az egész számok túlcsordulása ellen is, megköveteli a változó értékek kötelező inicializálását használat előtt, jobban kezeli a hibákat a szabványos könyvtárban, alapértelmezés szerint alkalmazza a megváltoztathatatlan hivatkozások és változók koncepcióját, erős statikus gépelést kínál a logikai hibák minimalizálása érdekében.

Főbb újítások:

  • Az „info” parancs hozzáadásra került a rakománycsomag-kezelőhöz, hogy megjelenítse a lerakatban lévő csomagra vonatkozó információkat.
  • Támogatás hozzáadva a "use<..>" szintaxishoz az "impl Trait"-ben, amely információkat ad meg a rejtett típusokról. Például az "impl Trait + use<'x, T>" azt határozza meg, hogy csak az "x" és "T" paraméterek használhatók rejtett típusban.
  • A nyers mutatók létrehozására külön szintaxist javasoltak, amely felváltja a korábban használt makrókat: az „addr_of!(expr)” makrót a „&raw const expr” operátor, az „addr_of_mut!(expr)” makrót pedig lecserélték. a „&raw mut” operátor által kifejt. struct Packed { not_aligned_field: i32, } fn main() { let p = Packed { not_aligned_field: 1_82 }; // Régi módszer a nyers mutató létrehozására, legyen ptr = std::ptr::addr_of!(p.not_aligned_field); // Új módja a nyers mutató létrehozásának let ptr = &raw const p.not_aligned_field; let val = nem biztonságos { ptr.read_unaligned() }; }
  • Lehetőség van "statikus" élettartamú biztonságos függvények és konstansok definiálására a "nem biztonságos" attribútummal rendelkező külső blokkokban (korábban a "nem biztonságos extern" minden eleme csak "nem biztonságos" attribútummal rendelkezett): unsafe extern { pub safe statikus TAU : f64; pub safe fn sqrt(x: f64) -> f64; pub unsafe fn strlen(p: *const u8) -> usize; }
  • A no_mangle, link_section és export_name attribútumok, amelyek meghatározatlan viselkedéshez vezethetnek, mostantól nem biztonságosnak minősülnek, és kifejezetten "nem biztonságos" jelzőt igényelnek, például: #[unsafe(no_mangle)] pub fn my_global_function() { }
  • A mintaillesztés lehetővé teszi az üres típusok kihagyását, például az „enum Void {}” vagy a látható üres mezőt tartalmazó struktúrákat. use std::convert::Infallible; pub fn kicsomagolás_pánik nélkül (x: Eredmény ) -> T { legyen Ok(x) = x; // Az "Err" kihagyható x }
  • A lebegőpontos számok típusai (f32 és f64) szabványosított viselkedést mutatnak a nem numerikus NaN értékek (0.0/0.0) feldolgozásakor, és lehetővé teszik a lebegőpontos műveletek használatát a const fn-ben.
  • Az összeállítási beillesztések lehetővé teszik a „const” attribútummal rendelkező operandusok használatát az egész számértékek közvetlen használatához anélkül, hogy azokat először egy regiszterben tárolnák. const MSG: &str = "Szia, világ!\n"; unsafe { core::arch::asm!( “mov rdx, {LEN} // a 'mov rdx, 14′” utasítás jön létre, LEN = const MSG.len(), … ); }
  • A „static” attribútummal rendelkező kifejezések megcímzése megengedett biztonságos környezetben, nem biztonságos blokk meghatározása nélkül (a „&raw mut” és „&raw const” operátorok nem befolyásolják az operandus értékét, és csak mutatót hoznak létre rá): static mut STATIC_MUT: Type = Type::new( ); extern "C" { static EXTERN_STATIC: Típus; } fn main() { let static_mut_ptr = &raw mut STATIC_MUT; let extern_static_ptr = &raw const EXTERN_STATIC; }
  • Az API új része átkerült a stabil kategóriába, beleértve a tulajdonságok módszereit és megvalósításait is:
    • std::thread::Builder::spawn_unchecked
    • std::str::CharIndexes::offset
    • std::option::Option::is_none_or
    • [T]::rendezett
    • [T]::rendezés szerint
    • [T]::kulcs szerint_rendezve
    • Iterátor::rendezett
    • Iterátor::sorted_by
    • Iterátor::kulcs szerint_rendezett
    • std::future::Ready::into_inner
    • std::iter::repeat_n
    • impl DoubleEndedIterator for Take

      Forrás: opennet.ru

Hozzászólás