Üksikasjalik vabastamine üldotstarbelise programmeerimiskeele Rust 1.78, mille loomisega alustas Mozilla, kuid mida arendatakse praegu sõltumatu mittetulundusühingu Rust Foundation juhendamisel. Keel keskendub mälu ohutule kasutusele ja pakub vahendeid kõrge paralleelsuse saavutamiseks, ilma et oleks vaja prügikoristajat ja runtime'i (runtime piirdub baasi initsialiseerimise ja standardbiblioteegi hooldamisega).
Mäluga töötamise meetodid Rust'is vabastavad arendajad pointerite manipulatsiooni vigadest ja kaitsevad neid probleemide eest, mis tulenevad madala taseme mälu haldamisest, nagu mälualale pärast selle vabastamist juurdepääs, null-pointerite dereferentseerimine, puhverserveri piiridest väljumine jne. Raamatukogude levitamiseks, kokkupaneku tagamiseks ja sõltuvuste haldamiseks arendatakse paketihaldurit Cargo. Raamatukogude majutamiseks toetatakse repoturite crates.io.
Mäluhügieen Rust'is tagatakse kompileerimise ajal viidete kontrollimise, objektide omandi jälgimise, objektide eluaja (vaateala) arvestamise ja mälule juurdepääsu korrektuse hindamise kaudu koodi täitmise ajal. Rust pakub ka vahendeid täisarvude ülevoolude vältimiseks, nõuab muutujate väärtuste kohustuslikku initsialiseerimist enne kasutamist, käsitleb vigu paremini standardraamatukogus, rakendab muutumatuse (immutable) mõistet viidete ja muutujate jaoks vaikimisi ning pakub tugevat staatilist tüüpimist loogiliste vigade vähendamiseks.
Peamised uuendused:
- Uus atribuutide nimiväli "#[diagnostic]" pakub vahendeid tõrgete teate määratlemiseks, mida kompilaator genereerib. Uues nimiväljas on esimesena rakendatud atribuut "#[diagnostic::on_unimplemented]", mida saab kasutada tõrgete teadete kohandamiseks olukordades, kus on vaja kasutada tüüpide põhimõtet, mida ei ole vastavale tüübile rakendatud. #[diagnostic::on_unimplemented( message = "My Message for `ImportantTrait<{A}>` is not implemented for `{Self}`", label = "My Label", note = "Note 1", note = "Note 2" )] trait ImportantTrait<A> {} fn use_my_trait(_: impl ImportantTrait<i32>) {} fn main() { use_my_trait(String::new()); } error[E0277]: My Message for `ImportantTrait<i32>` is not implemented for `String` —> src/main.rs:12:18 | 12 | use_my_trait(String::new()); | ———— ^^^^^^^^^^^^^ My Label | | | required by a bound introduced by this call | = help: the trait `ImportantTrait<i32>` is not implemented for `String` = note: Note 1 = note: Note 2
- Eelkontrollid, mida kasutatakse unsafe-funktsioonide puhul, võivad nüüd edasi lükata koodigeneratsiooni etapile, mis võimaldab neid kontrollida ilma, et oleks vaja standardbiblioteegi koostada režiimis "#[cfg(debug_assertions)]". Nüüd piisab, et aktiveerida tõrkeotsingu assert'ide sissekanded oma koodis testimise või tõrkeotsingu jaoks.
- Standardbiblioteegi funktsioonide käitumine, mis mõjutab puutükkide ja viidete (slice) ühtlustamist, on nüüd jooksvalt ennustatav ja sõltub sisendandmetest. Funktion pointer::align_offset, mis arvutab viite ühtlustamise nihke, tagastab nüüd usize::MAX ainult siis, kui operatsiooni tegemine on võimatu. Funktsioonid slice::align_to ja slice::align_to_mut, mis muundavad viidendid ühtlustatud keskmise viidendi ja algsete alg- ja lõpuviidendi kujule, tagastavad nüüd alati kõige suurema keskmise osa.
- Stabiilsete hulka on edastatud:
- impl Read for &Stdin
- Mõningate std::error::Error'iga seotud teostuste jaoks on lubatud kasutada mitte-staatilist (mitte 'static) elutsüklit.
- Implementatsioonis impl on lubatud kasutada väärtust ?Sized.
- impl From for io::Error
- Barrier::new() funktsioon on stabiliseeritud, et seda saaks kasutada päise 'const' kontekstis.
- Platvormidele x86_64-pc-windows-msvc, i686-pc-windows-msvc, x86_64-pc-windows-gnu, i686-pc-windows-gnu, x86_64-pc-windows-gnullvm ja i686-pc-windows-gnullvm on nüüd minimaalne nõue Windows 10.
- Kolmas toetuse tase on rakendatud platvormide jaoks wasm32-wasip2, arm64ec-pc-windows-msvc, armv8r-none-eabihf ja loongarch64-unknown-linux-musl. Kolmas tase tähendab põhitugiteenust, kuid ilma automatiseeritud testimise, ametlike versioonide väljaandmise ja koodi koostamise võimaluse kontrollimiseta.
- Teine toetuse tase on rakendatud sihtplatvormile Add wasm32-wasip1. Teine tase tähendab koostamise garantiid.
- Platvorm wasm32-wasi-preview1-threads on ümber nimetatud wasm32-wasip1-threads.
- Kompilaator on üle viidud LLVM 18 kasutamisele. LLVM 18 kasutamisel x86-32 ja x86-64 arhitektuuride jaoks on muudetud ABI, mis on seotud tüüpidega u128 ja i128.
- Cargo paketihalduris on stabiliseeritud 4. versioon lukufailidest (lockfile v4).
- Cargo's on stabiliseeritud globaalne vahemälu, kus on teave andmete viimase kasutamise kohta. Vahemälu paikneb failis $CARGO_HOME/.global-cache SQLite abil, seda uuendatakse automaatselt ja see kajastab viimaseid muudatusi, mis on seotud indeksi, crate-faili, koodide katalooge, git clone ja git checkout.
Lisaks võib mainida programmeerimiskeelt Borgo, mis püüab olla väljendusrikkam kui Go, kuid vähem keeruline kui Rust. Borgo ühendab Go ja Rust parimad omadused, täiendades iga keele puudusi. Näiteks on Go keel lihtne ja arusaadav, kuid ei paku laialdasi vahendeid tüüpide turvalisuse tagamiseks. Rust keeles on olemas turvalise programmeerimise tõhusad meetmed, kuid see on ülemäärane keerukas. Projekti arendab Marco Sampellegrini, autor raamatu „The Simple Haskell Handbook“ ja püsivate integreerimiste süsteemi Quad CI arendaja.

Borgo kasutab staatilist tüpiseerimist, mille tüübid ja süntaks sarnanevad Go keelele. Punktide lisamine koodiridade lõppu ei ole Borgo keeles kohustuslik. Borgo keeles kirjutatud kood kompileeritakse Go keelseks esitusvormiks, mis on täielikult ühilduv olemasolevate Go keele pakettidega. Kompilaatori kood on kirjutatud Rust keeles ja levitatakse ISC litsentsi alusel. use fmt enum NetworkState { Loading, Failed(int), Success(T), } struct Response { title: string, duration: int, } fn main() { let res = Response { title: "Tere, maailm", duration: 0, } let state = NetworkState.Success(res) let msg = match state { NetworkState.Loading => "veel laaditakse", NetworkState.Failed(code) => fmt.Sprintf("Saadi viga koodiga: %d", code), NetworkState.Success(res) => res.title, } fmt.Println(msg) }
Allikas: opennet.ru
