Az 1.85 a 2024-es kiadás egy újabb javítása, amely tovább javítja memóriabiztonságot és az egyidejűségi modelleket és igyekszik egy jobb és megbízhatóbb eszközöket nyújtani teljesítménykritikus rendszerek fejlesztéséhez. A Rust elfogadtatása azonban, pont ott halad a legnehezebben, ahol a leginkább létjogosultsága van, a Linux kernel fejlesztésében.
A változások, amelyek szintaktikai és szemantikai kérdéseket is érintenek a visszafelé kompatibilitás szem előtt tartásával kerültek bevezetésre, hogy a meglévő kódbázisok destabilizálása nélkül lehessen a projektekbe a frissítéseket bevezetni. Tehát maga a nyelv tervezése és az azt övező filozófiák is azt sejtetik, hogy ez az a nyelv amivel kernel szinten dolgozni érdemes.
Főbb Rust 2024 változások
A Return Position Impl Trait élettartam rögzítési szabályai
Az egyik legjelentősebb változás a return position impl Trait (RPIT) típusok
rögzítési szabályait érinti. A 2024-es kiadás módosítja az
alapértelmezett élettartamrögzítési viselkedést, hogy kizárja a
paraméterek implicit rögzítését, hacsak nem kérik kifejezetten a use<...>
szintaxissal.
Ez a módosítás megakadályozza a véletlen élettartam-bővítési
forgatókönyveket, amelyek korábban finom hibákhoz vezettek az aszinkron
függvényekben és a trait implementációkban. A régebbi kódbázisokat
migráló fejlesztőknek ellenőrizniük kell a visszatérési
típusaláírásokat, különösen az általános paramétereket aszinkron
műveletekkel kombináló kontextusokban.
Időbeli hatókör-beállítások
A kiadás finomított időbeli hatókörszabályokat vezet be az if let
kifejezések és a block tail
kifejezések esetében. Az if let
feltételekben létrehozott időbeliségek mostantól az egész if let
blokkban fennmaradnak, kiküszöbölve ezzel a használat utáni hibák egy
csoportját, amelyek akkor fordulhattak elő, amikor több mintaillesztésen
keresztül hivatkoztak értékekre. Hasonlóképpen, a blokkokban lévő
„tail” kifejezések hosszabb időbeli élettartamot kapnak, ami lehetővé
teszi a kifejezések természetesebb láncolását mesterséges let-kötési
követelmények nélkül. Ezek a változtatások a Rust érettségét mutatják a
bonyolult vezérlésáramlási minták biztonságos kezelésében.
Natív aszinkron lezárások támogatása
A Rust 1.85.0 az async || {}
szintaxis stabilizálásával teljesíti az aszinkron lezárások régóta várt
ígéretét. Ez a funkció a Rust párhuzamossági eszköztárának kritikus
hiányosságát zárja be azzal, hogy a zárlatok rögzíthetik a
környezetüket, miközben futures-t állítanak elő. A megvalósítás három új
szabványos könyvtári tulajdonságot vezet be - AsyncFn
, AsyncFnMut
és AsyncFnOnce
-, amelyek tükrözik szinkron társaikat, de impl Future
-t adnak vissza.
A következmények az aszinkronizált kódbázisokra nézve mélyrehatóak. Vegyük például ezt a HTTP-kiszolgálói middleware példát:
async fn handle_request(req: Request) -> Response {
let auth_token = req.headers().get("Authorization");
let authenticate = async || {
let db = connect_to_database().await;
db.validate_token(auth_token.unwrap()).await
};
if authenticate().await.is_ok() {
process_request(req).await
} else {
Response::unauthorized()
}
}
Ez a szintaxis kiküszöböli a kézi future wrappinggel kapcsolatos bojlerplate-et, miközben fenntartja a Rust szigorú tulajdonosi garanciáit az aszinkron határok között.
Rust-verzió-tudatos függőségi feloldás
A Cargo függőségi feloldója az 1.85.0-ban bevezeti a rust-verzió tudatosságot, kihasználva a Cargo.toml manifesztekben lévő rust-version
mezőt. Ez a funkció megakadályozza az olyan függőségi gráf feloldást,
amely a megadottnál újabb Rust verziót igényel, így hatékonyan
kiküszöböli az eszközlánc-kompatibilitási problémák egy osztályát. A
munkaterület karbantartók számára a feloldó mostantól szigorúan
érvényesíti a default-features = false
deklarációkat az örökölt függőségekre vonatkozóan, konzisztenciát teremtve a nagyméretű projektkonfigurációkban.
Stílus kiadások a Rustfmt-ben
A Rustfmt a nyelvi kiadásoktól függetlenített stíluskiadásokat vezet be,
lehetővé téve a csapatok számára, hogy a modern formázási szabályokat a
teljes kiadásváltás vállalása nélkül is átvegyék. Az 1.85.0 kiadás
javított azonosító rendezési algoritmusokat tartalmaz, amelyek a nyers
azonosítókat (r#foo
) és a numerikus utótagokat következetesen kezelik a projektekben.
A Linux kernel dráma
A Linux kernelt hagyományosan C nyelven fejlesztik, de 2021-től fokozatosan elkezdték a Rust bevezetését a jobb memóriabiztonság és a gyakori programozási hibákkal szembeni kisebb sebezhetőség ígérete miatt. Azonban több fejlesztő köztük veterán kernel karbantartók, már rögtön a kezdeteknél megkérdőjelezték, hogy célszerű e különböző programozási nyelvek keverése egy ilyen kritikus helyen mint a kernel. A viták egészen odáig fajultak, hogy azok kezdtek vallási felhangot kapni.
A vita az idei év elején érte el a csúcspontot, amikor Christoph Hellwig a kernel DMA (Direct Memory Access) segédprogramjainak karbantartója elutasította azokat azokat a javításokat, amelyek lehetővé tették volna, hogy a Rust illesztőprogramok együttműködhessenek az ő C-alapú alrendszereivel. Hellwig azzal érvelt a nyelvek közötti integráció megnehezíti a karbantartást és széttöredezi a kritikus infrastruktúrát, és gyakorlatilag rákos daganathoz hasonlította a Rust betüremkedését az ő fejlesztői munkájába. A Rust fejlesztők ezt nyilván nem hagyták szó nélkül hiszen Hellwig egyértelműen korlátozásokat vezetett be olyan alrendszerek magvalósításánál amelyek nem tartoztak a felügyelete alá. A Rust fejlesztők először a közösségi médiában kerestek támogatókat, majd Linus Torvalds-ot kérték meg hogy oldja fel a problémát. Linusnak nem tetszett, hogy a Rust fejlesztők élükön Hector Martin a közösségi médiához fordultak. Miután Linus nem Matinnak adott igazat sőt őt nevezte meg a probléma forrásaként, Martin lemondott karbantartói pozíciójáról és csalódottságának adott hangot a vezetéssel kapcsolatban.
A dráma végül azzal vett pozitív fordulatot, hogy rögzítették az együttműködési irányelveket, és a Rust fejlesztéseket elismerték. A C kódok a továbbiakban nem módosíthatják úgy az apikat, hogy a Rust-ban meglévő fejlesztések működésképtelenné váljanak. Linus tehát végül felülbírálta Hellwig blokádját.