Izdaja Rust 1.96. Ocena primernosti Rusta za izdelavo programske opreme za mikrokontrolerje

Objavljena je nova verzija programskog jezika Rust 1.96, koji je prvobitno razvijen od strane kompanije Mozilla, a sada ga razvija nezavisna neprofitna organizacija Rust Foundation. Jezik se fokusira na sigurnu upotrebu memorije i pruža sredstva za postizanje visokog stepena paralelizma izvršavanja zadataka, pri čemu ne koristi sakupljač smeća i runtime (runtime se svodi na osnovnu inicijalizaciju i podršku standardne biblioteke).

Metode rada s memorijom u Rustu usmjerene su na isključivanje grešaka prilikom manipulacije pokazivačima i zaštitu od problema koji nastaju zbog niskog nivoa rada s memorijom, kao što su pristupanje oblasti memorije nakon njenog oslobađanja, dereferenciranje nultih pokazivača, izlazak izvan granica bafera itd. Za distribuciju biblioteka, osiguranje gradnje i upravljanje zavisnostima, projekat se razvija koristeći alat za upravljanje paketima Cargo. Za hostovanje biblioteka podržava se repozitorij crates.io.

Sigurno upravljanje memorijom u Rust-u osigurano je tokom kompajliranja pomoću provjere referenci, praćenja vlasništva nad objektima, uzimanja u obzir vremena života objekata (vidljivost) i procjene ispravnosti pristupa memoriji tokom izvršavanja koda. Rust takođe pruža sredstva za zaštitu od prelivanja cijelih brojeva, zahtijeva obaveznu inicijalizaciju vrijednosti varijabli prije korišćenja, bolje obrađuje greške u standardnoj biblioteci, primjenjuje koncept nepromjenjivosti (immutable) referenci i varijabli kao podrazumijevano, te nudi jaku statičku tipizaciju za minimiziranje logičkih grešaka.

Glavne novosti:

  • Dodan je modul range sa realizacijom novih tipova, koji zamenjuju zastarele tipove Range, RangeInclusive, RangeToInclusive i RangeFrom, i omogućavaju skladištenje opsega u Copy-strukturama. Tip Range definiše opsege, ograničene minimalnom i maksimalnom dozvoljenom vrednošću (ali je ne uključuje), tip RangeFrom definiše brojeve počevši od naznačene vrednosti, dok tip RangeInclusive obuhvata vrednosti naznačenog opsega uključujući obe njegove granice. U budućim izdanjima dodatno će se pojaviti tipovi RangeFull i RangeTo, stara realizacija će biti premestena u core::range::legacy::*, a sintaksa „N..M“ će se prevesti na novu verziju tipova.

    Novi tipovi se razlikuju po tome što umesto tipa Iterator implementiraju tip IntoIterator, tj. umesto ugrađenog iterat jednog tipa definišu kako pretvoriti tip u iteratrora. Ovaj pristup omogućava korišćenje operacije kopiranja sa novim tipovima (tip Copy, koji pokazuje da se vrednosti tipa mogu duplicirati jednostavnim kopiranjem), koja ranije nije bila dostupna zbog nespojivosti sa tipovima koji imaju ugrađene iteratore.
    Na primer, novi tipovi omogućavaju čuvanje granica preseka u strukturi koja se potpuno kopira bez odvojenog čuvanja početnih i krajnjih vrednosti:

    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 makroi „assert_matches!“ i „debug_assert_matches!“, koji proveravaju usklađenost vrednosti sa navedenim obrascem i hitno završavaju izvršavanje u slučaju neslaganja. Za razliku od izraza „assert!(matches!(..))“ i „debug_assert!(matches!(..))“, novi makroi se razlikuju po ispisu dijagnostičkih informacija sa vrednostima koje su izazvale grešku. Da bi se izbeglo preklapanje sa spoljim makroima koji dolaze sa sličnim imenima, novi makroi zahtevaju eksplicitno uvoz biblioteke „core::assert_matches“.

    use core::assert_matches;

    fn get_random_number() -> u32 {
    4
    }

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

  • Pri zbiranju za ciljno platformo WebAssembly je bilo prenešeno posredovanje povezovalniku možnosti „—allow-undefined“, ki je omogočala povezovanje v prisotnosti nedefiniranih simbolov, ki so se pretvarjali v uvoz iz modula „env“. Pri zbiranju za WebAssembly morajo zdaj vsi simboli, povezani s povezovanjem, privzeto biti določeni. Za vrnitev starega vedenja lahko uporabite okoljsko spremenljivko „RUSTFLAGS=-Clink-arg=—allow-undefined“ ali izraz ‘#[link(wasm_import_module = „env“)]’ v kodi.
  • У розряд стабільних переведено нову порцію API, зокрема стабілізовані методи та реалізації типажів:
    • 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
  • V upravitelju paketov Cargo je bila odpravljena ranljivost CVE-2026-5223, ki se lahko izkorišča za prepisovanje izvorne kode drugega crate-paketa v lokalnem predpomnilniku paketov iz istega repozitorija preko manipulacij s simbolnimi povezavami znotraj crate-a paketov. Ranljivost se kaže samo pri delu s tretjimi strankami repozitorijev paketov in ne vpliva na uporabnike repozitorija crates.io, saj je v crates.io prepovedano nalaganje paketov s simbolnimi povezavami.

Dodatno lahko izpostavimo objavo (PDF) rezultatov analize primernosti jezika Rust za razvoj vdelavnih programov za mikrokrmilnike in vgrajene sisteme z omejenimi viri.
Raziskavo je izvedlo podjetje STMicroelectronics ob sodelovanju več evropskih univerz. Dve izolirani skupini razvijalcev sta bili zadolženi za implementacijo istega vdelavnega programa za mikrokrmilnike STM32U585AI z jedrom Arm Cortex-M33. Prva ekipa je ustvarila vdelavni program v C, druga pa v Rustu.

Testiranje opravljene naloge ni pokazalo opaznih prednosti uporabe jezika C namesto Rust pri razvoju vdelavnih programov za mikrokrmilnike v primerjavi porabe pomnilnika in zmogljivosti. Poleg tega je uporaba sistemskega runtime-a, napisanega v Rustu, iz odprtega projekta Ariel OS, omogočila dosego porabe pomnilnika v projektu na Rustu, ki je bila nižja kot pri implementaciji v jeziku C, ki je uporabljala tradicionalni sklad za razvoj vdelavnih programov na osnovi knjižnice newlib.

Končna velikost izvorne kode je znašala 84100 bajtov v projektu Rust in 76744 bajtov v projektu C (10 % manj), vendar je poraba pomnilnika v izvorni kodi Rust ostala bistveno nižja — 24640 bajtov proti 42608 bajtom. Kar se tiče zmogljivosti, je testiranje začetnih prototipov, razvitih v 6 tednih, pokazalo, da je izvedba v Rustu dvakrat presegla izvedbo v C, vendar sta obe izvedbi znatno zaostajali za izračunanim maksimalnim zmogljivostim. Po 4 tednih, namenjenih optimizaciji, sta obe izvedbi dosegli približno enak rezultat, blizu izračunanemu maksimumu.



Izvor: opennet.ru
Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki 🔥 Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki | ProHoster