Izdanje Rust 1.96. Procjena pogodnosti Rust-a za razvoj firmvera za mikrokontrolere

Objavljen je izdanja programskog jezika Rust 1.96, koji je započeo kao projekt Mozille, a sada ga razvija neovisna neprofitna organizacija Rust Foundation. Jezik se fokusira na sigurnu obradu memorije i pruža alate za postizanje visokog paralelizma izvršavanja zadataka, pritom izbjegavajući korištenje sakupljača smeća i runtime-a (runtime se svodi na osnovnu inicijalizaciju i podršku standardne biblioteke).

Metode upravljanja memorijom u Rust-u usmjerene su na isključivanje grešaka prilikom manipulacije pokazivačima i zaštitu od problema koji nastaju zbog niskonivojskog rada s memorijom, kao što su pristupanje memorijskom području nakon što je oslobođeno, dereferenciranje nultih pokazivača, izlazak iz okvira bafera itd. Za distribuciju biblioteka, osiguranje gradnje i upravljanje ovisnostima, projekt se razvija preko upravitelja paketa Cargo. Za hosting biblioteka podržava se repozitorij crates.io.

Sigurna manipulacija memorijom osigurava se u Rustu tijekom kompilacije provjerom referenci, praćenjem vlasništva nad objektima, uzimanjem u obzir vremena života objekata (opseg vidljivosti) i ocjenom točnosti pristupa memoriji tijekom izvršavanja koda. Rust također pruža sredstva za zaštitu od cjelobrojnih prekoračenja, zahtijeva obaveznu inicijalizaciju vrijednosti varijabli prije upotrebe, bolje obrađuje greške u standardnoj biblioteci, primjenjuje koncept nepromjenjivosti (immutable) referenci i varijabla kao zadano te nudi snažnu statičku tipizaciju za minimiziranje logičkih grešaka.

Glavne novine:

  • Dodan je modul range s implementacijom novih tipova, razvijenih za zamjenu zastarjelih tipova Range, RangeInclusive, RangeToInclusive i RangeFrom, a koji omogućuju pohranu opsega u Copy-strukturama. Tip Range definira opsege, ograničene minimalnom i maksimalnom dopuštenom vrijednošću (bez uključivanja iste), tip RangeFrom definira brojeve počevši od navedene vrijednosti, dok tip RangeInclusive – vrijednosti navedenog opsega s obje njegove granice. U budućim izdanjima dodatno će se pojaviti tipovi RangeFull i RangeTo, stara implementacija će se premjestiti u core::range::legacy::*, a sintaksa „N..M” će se prevesti u novi tip.

    Novi tipovi se razlikuju u tome što umjesto tipa Iterator implementiraju tip IntoIterator, tj. umjesto ugrađenog iteratora definiraju kako pretvoriti tip u iterator. Ovaj pristup omogućuje korištenje operacije kopiranja s novim tipovima (tip Copy, koji pokazuje da se vrijednosti tipa mogu duplicirati jednostavnim kopiranjem), što ranije nije bilo moguće zbog nekompatibilnosti s tipovima s ugrađenim iteratorima.
    Na primjer, novi tipovi omogućuju pohranu granica isječka u strukturu koja se potpuno kopira bez posebnog pohranjivanja početne i konačne vrijednosti:

    use core::range::Range;

    #[derive(Clone, Copy)]
    pub struct Span(Range);

    impl Span {
    pub fn of(self, s: &str) -> &str {
    &s[self.0]
    }
    }

  • Dodani su makroa «assert_matches!» i «debug_assert_matches!», koji provjeravaju usklađenost vrijednosti s navedenim obrascem i hitno završavaju izvršenje u slučaju neslaganja. Ovi novi makroi se razlikuju od izraza «assert!(matches!(..))» i «debug_assert!(matches!(..))» jer ispisuju dijagnostičke informacije o vrijednostima koje su izazvale grešku. Kako bi se izbjeglo preklapanje s vanjskim makroima koji se isporučuju s istim imenima, novi makroi zahtijevaju eksplicitni unos biblioteke «core::assert_matches».

    use core::assert_matches;

    fn get_random_number() -> u32 {
    4
    }

    fn main() {
    assert_matches!(get_random_number(), 1..=6);
    }

  • Prilikom izgradnje za ciljnu platformu WebAssembly, prestala je predaja opcije «—allow-undefined» linkeru, koja je dopuštala povezivanje u prisutnosti neodređenih simbola koji su se preinačavali u import iz modula «env». Prilikom izgradnje za WebAssembly, svi povezani simboli sada moraju biti definirani prema zadanim postavkama. Za vraćanje starog ponašanja možete koristiti varijablu okruženja «RUSTFLAGS=-Clink-arg=—allow-undefined» ili izraz ‘#[link(wasm_import_module = «env»)]’ u kodu.
  • U stabilne verzije prebačen je novi set API-ja, uključujući stabilizirane metode i implementacije tipa:
    • assert_matches!
    • debug_assert_matches!
    • From za AssertUnwindSafe
    • From za LazyCell
    • From za LazyLock
    • core::range::RangeToInclusive
    • core::range::RangeToInclusiveIter
    • core::range::RangeFrom
    • core::range::RangeFromIter
    • core::range::Range
    • core::range::RangeIter
  • U paketnom menadžeru Cargo otklonjena je ranjivost CVE-2026-5223, koja se može iskoristiti za prepisivanje izvorne šifre drugog crate-paketa u lokalnom predmemoriji paketa iz istog repozitorija putem manipulacija simboličkim vezama unutar crate-a paketa. Ranjivost se manifestira samo prilikom rada s vanjskim repozitorijima paketa i ne utječe na korisnike repozitorija crates.io, jer je za učitavanje paketa sa simboličkim vezama u crates.io zabranjeno.

Dodatno, vrijedi spomenuti objavljivanje (PDF) rezultata analize prikladnosti programskog jezika Rust za razvoj firmvera za mikrokontrolere i embedded sustave s ograničenim resursima.
Istraživanje je provela kompanija STMicroelectronics uz sudjelovanje nekoliko europskih sveučilišta. Dvijema izoliranim timovima programera postavljen je zadatak implementirati isti firmver za mikrokontrolere STM32U585AI s Arm Cortex-M33 srcem. Prvi tim je razvijao firmver u C-u, a drugi u Rustu.

Testiranje gotovog rada nije pokazalo značajne prednosti korištenja jezika C umjesto Rusta prilikom razvoja firmvera za mikrokontrolere u usporedbi s potrošnjom memorije i performansama. Štoviše, korištenje sistemskog runtime-a napisanog u Rustu iz otvorenog projekta Ariel OS omogućilo je postizanje potrošnje memorije u projektu na Rustu ispod razine implementacije na jeziku C koja koristi tradicionalni stog za razvoj firmvera temeljenog na biblioteci newlib.

Veličina rezultantnog firmvera bila je 84100 bajtova u projektu na Rustu i 76744 bajtova u projektu na C (10% manje), ali je potrošnja operativne memorije u firmveru na Rustu bila značajno niža — 24640 bajtova nasuprot 42608 bajtova. Što se tiče performansi, tijekom testiranja početnih prototipova razvijenih u roku od 6 tjedana, implementacija na Rustu je bila dvostruko brža od implementacije na C, no obje implementacije su znatno zaostajale za proračunatom maksimalnom performansom. Nakon 4 tjedna posvećenih optimizaciji, obje su implementacije postigle otprilike iste rezultate, blizu proračunatom maksimumu.



Izvor: opennet.ru
Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere 🔥 Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere | ProHoster