Det har publicerats en ny version av det allmÀnna programmeringssprÄket Rust 1.86, som ursprungligen utvecklades av Mozilla men nu vidareutvecklas under den oberoende, ideella organisationen Rust Foundation. SprÄket fokuserar pÄ sÀker minneshantering och erbjuder verktyg för att uppnÄ hög parallellism i uppgiftsutförande, utan att behöva anvÀnda en skrÀpare och runtime (runtime begrÀnsas till grundlÀggande initialisering och stöd för standardbiblioteket).
Minneshanteringsmetoderna i Rust skyddar utvecklare frÄn att göra fel vid manipulering av pekare och skyddar mot problem som uppstÄr vid lÄg nivÄ minnesarbete, sÄsom att komma Ät minnesomrÄden efter att de har frigjorts, dereferera nullpekare, buffer overflow, etc. För distribution av bibliotek, byggande och hantering av projektberoenden utvecklas paketförvaltaren Cargo. För lagring av bibliotek stöds ett repository pÄ crates.io.
SÀker minneshantering sÀkerstÀlls i Rust under kompilering genom att kontrollera referenser, spÄra Àgandeskap över objekt, ta hÀnsyn till livslÀngden av objekt (synlighet) och utvÀrdera korrekt minnesÄtkomst under körning av koden. Rust erbjuder ocksÄ verktyg för att skydda mot heltalsöverflöden, krÀver obligatorisk initialisering av variabelvÀrden innan de anvÀnds, hanterar fel bÀttre i standardbiblioteket, tillÀmpar konceptet av oförÀnderliga (immutable) referenser och variabler som standard och erbjuder stark statisk typning för att minimera logiska fel.
Huvudsakliga nyheter:
- Stöd för uppcasting av trait-typer till grundlÀggande supertrait har lagts till, vilket innebÀr att det nu Àr möjligt att omvandla en referens till ett trait-objekt direkt till en referens till ett supertrait-objekt utan att behöva skapa en specifik metod i traitet som returnerar en referens till supertraitet. En liknande operation kan ocksÄ utföras med andra typer av smarta pekare, till exempel "Arc<dyn Trait> -> Arc<dyn Supertrait>" och "*const dyn Trait -> *const dyn Supertrait". trait Trait: Supertrait {} trait Supertrait {} fn upcast(x: &dyn Trait) -> &dyn Supertrait { x }
- En ny metod, get_disjoint_mut(), har lagts till i HashMap och skivor (slice) för att simultant fÄ flera Àndringsbara referenser till element. Tidigare tillÀt inte lÄne-checkern samtidiga anvÀndningar av referenser som erhölls via metoden get_mut(). 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]);
- Det har blivit tillÄtet att mÀrkta safe-funktioner med attributet "#[target_feature]", som anger att funktionen anvÀnder angivna CPU-funktioner. En safe-funktion, som Àr mÀrkt med attributet "#[target_feature]", kan endast sÀkert anropas av en annan safe-funktion om den ocksÄ Àr mÀrkt med "#[target_feature]" (annars mÄste sÄdana funktioner anropas i en unsafe-block). De kan inte överföras till funktioner som accepterar generiska parametrar som begrÀnsas av trait Fn*. Tidigare kunde attributet "#[target_feature]" endast tillÀmpas pÄ funktioner mÀrkta som "unsafe". #[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() }; } }
- I Rust-kompilatorn Àr debug-assertions aktiverade, vilket innebÀr att pekaren inte fÄr vara null vid lÀsning och skrivning av icke-noll storlekar, samt vid ÄterlÄn (reborrow) av pekaren till en referens. Till exempel, nÀr debug-assertions Àr aktiverade kommer nedanstÄende kod nu att leda till ett "panic": let _x = *std::ptr::null::(); let _x = &*std::ptr::null::();
- Som standard Ă€r lint-checken "missing_abi" aktiverad, vilket resulterar i en varning om ABI inte anges efter nyckelordet extern. Tidigare antogs det att ABI "C" anvĂ€ndes om none ABI angavs efter extern. Det rekommenderas nu att tydligt ange ABI "C", till exempel âextern "C" {}â och âextern "C" fnâ
- En ny uppsÀttning API har blivit stabiliserad, inklusive stabilisering av metoder och implementeringar av traits:
- {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
- Indikatorn "const" har tillÀmpats i funktioner:
- 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
- Det har lagts till ett tredje nivÄ av stöd för plattformar {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 och thumbv7a-nuttx-{eabi,eabihf}. Den tredje nivÄn innebÀr grundlÀggande stöd, men utan automatiserade tester, publicering av officiella byggen och verifiering av byggbarhet av koden.
- En varning har lagts till om att det andra nivÄn av stöd för mÄlplattformen i586-pc-windows-msvc kommer att upphöra i nÀsta version (1.87). Det rekommenderas att anvÀnda plattformen i686-pc-windows-msvc, som erbjuder stöd för SSE2-instruktioner. Plattformen i586-pc-windows-msvc har förlorat sin relevans, eftersom stöd för SSE2 krÀvs för Windows 10, och Àldre versioner av Windows stöds inte lÀngre i Rust.
Det bör Ă€ven nĂ€mnas att företaget Ferrocene har överlĂ€mnat sprĂ„kets specifikation för Rust (FLS â Ferrocene Language Specification) till samhĂ€llet, vilken skapades under utvecklingen av sitt Rust-kompilator för kritiska system och som periodiskt uppdateras med aktuell status av den primĂ€ra Rust-kompilatorn. FLS-specifikationen innehĂ„ller en strukturerad och detaljerad vĂ€gledning om syntax, semantik och beteende för Rust, vilket Ă€r lĂ€mpligt för verifiering, bedömning av kompatibilitet och standardisering.
De överlÀmnade material kommer att anvÀndas för att skapa en referensspecifikation för programmeringssprÄket Rust, vilket kan anvÀndas vid utveckling av alternativa kompilatorer och för att verifiera kompilatorn inom omrÄden som Àr kritiska ur sÀkerhetssynpunkt.
KĂ€lla: opennet.ru
