Objavljen je izdanak programskog jezika Rust 1.96, koji je prvotno razvijen od strane Mozille, a danas ga razvija neprofitna organizacija Rust Foundation. Jezik se fokusira na sigurnu upotrebu memorije i pruža alate za postizanje visokog paralelizma izvršenja zadataka, bez potrebe za sakupljačem smeća i runtime-om (runtime se svodi na osnovnu inicijalizaciju i održavanje 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 s implementacijom novih tipova, razvijenih za zamenu zastarelih tipova Range, RangeInclusive, RangeToInclusive i RangeFrom, koji omogućuju skladištenje opsega u Copy-strukturama. Tip Range definiše opsege, ograničene minimalnom i maksimalnom dozvoljenom vrednosti (ali ne uključujući ih), tip RangeFrom definiše brojeve počevši od određene vrednosti, dok tip RangeInclusive uključuje vrednosti navedenog opsega sa obe njegove granice. U budućim izdanjima dodatno će se pojaviti tipovi RangeFull i RangeTo, a stara implementacija će biti prebačena u core::range::legacy::*, dok će se sintaksa „N..M“ prevesti na novi oblik tipova.
Novi tipovi se razlikuju po tome što umesto tipa Iterator implementiraju tip IntoIterator, tj. umesto ugrađenog iteratora definišu kako da se tip pretvori u iterator. Ovaj pristup omogućava korišćenje operacije kopiranja sa novim tipovima (tip Copy, koji pokazuje da se vrednosti tipa mogu duplicirati jednostavnim kopiranjem), što je ranije bilo nedostupno zbog nespojivosti sa tipovima koji imaju ugrađene iteratore.
Na primer, novi tipovi omogućavaju skladištenje granica preseka u strukturu koja se kompletno kopira bez odvojenog čuvanja početne i krajnje 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 makrovi „assert_matches!“ i „debug_assert_matches!“, koji proveravaju usklađenost vrednosti sa određenim obrascem i hitno završavaju izvršenje u slučaju neslaganja. Ovi novi makrovi se razlikuju od izraza „assert!(matches!(..))“ i „debug_assert!(matches!(..))“ po tome što pružaju ispravne informacije sa vrednostima koje su izazvale grešku. Da bi se izbegla preklapanja sa spoljnim makroima koji se isporučuju pod sličnim imenima, novi makrovi zahtevaju eksplicitni 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 sestavljanju za ciljno platformo WebAssembly je prenos možnosti za linker "—allow-undefined", ki je dovoljeval povezovanje ob prisotnosti nepopolnih simbolov, ki so se pretvarjali v uvoz iz modula "env", prenehal. Pri sestavljanju za WebAssembly morajo biti vsi povezani simboli zdaj privzeto obvezno definirani. 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 for AssertUnwindSafe
- From for LazyCell
- From for LazyLock
- core::range::RangeToInclusive
- core::range::RangeToInclusiveIter
- core::range::RangeFrom
- core::range::RangeFromIter
- core::range::Range
- core::range::RangeIter
- V upravljalniku paketov Cargo je odpravljena ranljivost CVE-2026-5223, ki se lahko izkoristi 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 pojavi samo pri delu s tretjimi repozitoriji paketov in ne vpliva na uporabnike repozitorija crates.io, saj je v crates.io prepovedano nalaganje paketov s simbolnimi povezavami.
Dodatno lahko omenimo objavo (PDF) rezultatov analize primernosti programskega jezika Rust za razvoj vdelane programske opreme za mikrokontrolerje in vgrajene sisteme z omejenimi viri.
Raziskavo je opravila podjetje STMicroelectronics v sodelovanju z več evropskimi univerzami. Dvema izoliranima skupinama razvijalcev je bila dodeljena naloga, da implementirata enako vdelano programsko opremo za mikrokontrolerje STM32U585AI z jedrom Arm Cortex-M33. Prva skupina je ustvarila vdelano programsko opremo v C-ju, druga pa v Rustu.
Testiranje opravljenega dela ni pokazalo opaznih prednosti pri uporabi jezika C namesto Rusta pri razvoju vdelane programske opreme za mikrokontrolerje pri primerjavi porabe pomnilnika in zmogljivosti. Še več, uporaba Rusovega sistemskega runtime-a iz odprtega projekta Ariel OS je omogočila, da je bila poraba pomnilnika v projektu na Rustu nižja kot v izvedbi v C-ju, ki uporablja tradicionalni sklad za razvoj programske opreme na osnovi knjižnice newlib.
Končna velikost programske opreme je bila 84100 bajtov v projektu Rust in 76744 bajtov v projektu C (10 % manj), vendar je poraba pomnilnika v programski opremi na Rustu bila znatno nižja — 24640 bajtov proti 42608 bajtom. Kar zadeva zmogljivost, je bila pri testiranju začetnih prototipov, razvitih v 6 tednih, implementacija v Rustu dvakrat hitrejša od implementacije v C, vendar sta obe različici znatno zaostajali za izračunano maksimalno zmogljivostjo. Po 4 tednih, namenjenih optimizaciji, sta obe implementaciji dosegli približno enake rezultate, blizu izračunanemu maksimumu.

Izvor: opennet.ru
