A fost lansat release-ul limbajului de programare Rust 1.96, care a fost dezvoltat inițial de Mozilla, dar acum este susținut de organizația independentă non-profit Rust Foundation. Limbajul se concentrează pe utilizarea sigură a memoriei și oferă instrumente pentru a atinge un nivel ridicat de paralelism în executarea sarcinilor, fără a utiliza un garbage collector și un runtime (runtime-ul este limitat la inițializarea de bază și întreținerea bibliotecii standard).
Metodele de gestionare a memoriei în Rust sunt orientate spre eliminarea erorilor în manipularea pointerilor și protejarea împotriva problemelor care apar din lucrul la nivel de memorie, cum ar fi accesarea unei zone de memorie după eliberarea ei, dereferentierea pointerilor nuli, depășirea limitelor buffer-ului etc. Pentru distribuirea bibliotecilor, asigurarea compilării și gestionarea dependențelor, proiectul se dezvoltă cu ajutorul managerului de pachete Cargo. Un depozit pentru biblioteci este susținut la crates.io.
Lucrul sigur cu memoria este asigurat în Rust în timpul compilării prin verificarea referințelor, urmărirea proprietății obiectelor, luarea în considerare a timpului de viață al obiectelor (domeniul de vizibilitate) și evaluarea corectitudinii accesului la memorie în timpul execuției codului. Rust oferă, de asemenea, instrumente pentru protejarea împotriva suprasaturării numerice, impune inițializarea obligatorie a valorilor variabilelor înainte de utilizare, gestionează mai bine erorile în biblioteca standard, aplică conceptul de referințe și variabile imutabile (immutable) din oficiu și oferă o tipizare statică puternică pentru a minimiza erorile logice.
Noutăți principale:
- A fost adăugat modulul range cu implementarea unor tipuri noi, dezvoltate pentru a înlocui tipurile învechite Range, RangeInclusive, RangeToInclusive și RangeFrom, permițând stocarea intervalelor în structuri Copy. Tipul Range definește intervale limitate de o valoare minimă și una maximă (dar fără a le include), tipul RangeFrom definește numere începând de la o valoare specificată, iar tipul RangeInclusive reprezintă valorile din intervalul specificat incluzând ambele limite. În versiuni viitoare vor apărea tipurile RangeFull și RangeTo, iar vechea implementare va fi mutată în core::range::legacy::*, iar sintaxa „N..M” va fi adaptată la noile tipuri.
Noile tipuri se diferențiază prin faptul că în loc de trait-ul Iterator, implementează trait-ul IntoIterator, adică în loc să definească un iterator încorporat, definesc cum să fie transformat un tip într-un iterator. Această abordare permite utilizarea operației de copiere cu noile tipuri (trait-ul Copy, care arată că valorile unui tip pot fi duplicate prin copiere simplă), care anterior nu era disponibilă din cauza incompatibilității cu tipurile cu iteratoare încorporate.
De exemplu, noile tipuri oferă posibilitatea de a salva limitele unui slice într-o structură care se copiază complet fără a salva separat valorile de început și de sfârșit:use core::range::Range;
#[derive(Clone, Copy)]
pub struct Span(Range);impl Span {
pub fn of(self, s: &str) -> &str {
&s[self.0]
}
} - Au fost adăugate macro-urile „assert_matches!” și „debug_assert_matches!”, care verifică dacă o valoare se potrivește unui șablon specificat și termină execuția în caz de necortare. Față de expresiile „assert!(matches!(..))” și „debug_assert!(matches!(..))”, noile macro-uri diferă prin faptul că oferă informații de depanare cu valorile care au provocat eșecul. Pentru a evita coliziunile cu macro-uri externe furnizate cu nume similare, noile macro-uri necesită importul explicit al bibliotecii „core::assert_matches”.
use core::assert_matches;
fn get_random_number() -> u32 {
4
}fn main() {
assert_matches!(get_random_number(), 1..=6);
} - La compilarea pentru platforma țintă WebAssembly, transmiterea opțiunii de legare „—allow-undefined” care permitea legarea în prezența simbolurilor nedefinite care erau transformate în importuri din modulul „env” a fost oprită. La compilarea pentru WebAssembly, toate simbolurile legate acum trebuie să fie obligatoriu definite în mod implicit. Pentru a reveni la comportamentul anterior, se poate utiliza variabila de mediu „RUSTFLAGS=-Clink-arg=—allow-undefined” sau expresia ‘#[link(wasm_import_module = „env”)]’ în cod.
- O nouă porțiune de API a fost transformată în stabilitate, inclusiv metode și implementări ale tiparelor stabilize.
- assert_matches!
- debug_assert_matches!
- From pentru AssertUnwindSafe
- From pentru LazyCell
- From pentru LazyLock
- core::range::RangeToInclusive
- core::range::RangeToInclusiveIter
- core::range::RangeFrom
- core::range::RangeFromIter
- core::range::Range
- core::range::RangeIter
- În managerul de pachete Cargo a fost remediată vulnerabilitatea CVE-2026-5223, care putea fi utilizată pentru a suprascrie codul sursă al altui pachet crate în cache-ul local de pachete din același depozit prin manipularea linkurilor simbolice din cadrul acestuia. Vulnerabilitatea apare doar în timpul lucrului cu depozite externe de pachete și nu afectează utilizatorii depozitului crates.io, deoarece încărcarea pachetelor cu linkuri simbolice este interzisă în crates.io.
De asemenea, merită menționată publicarea (PDF) rezultatelor analizei fezabilității limbajului Rust pentru dezvoltarea firmware-ului pentru microcontrolere și sisteme încorporate cu resurse limitate.
Studiul a fost efectuat de compania STMicroelectronics cu participarea mai multor universități europene. Două echipe de dezvoltatori izolate au fost provocate să implementeze același firmware pentru microcontrolerele STM32U585AI cu nucleul Arm Cortex-M33. Prima echipă a creat firmware-ul în C, iar a doua în Rust.
Testarea lucrării realizate nu a descoperit avantaje notabile în utilizarea limbajului C față de Rust în dezvoltarea firmware-ului pentru microcontrolere în comparația consumului de memorie și a performanței. Mai mult, utilizarea runtime-ului sistemic scris în Rust din proiectul open-source Ariel OS a permis obținerea unui consum de memorie în proiectul Rust mai mic decât în implementarea în limbajul C, care folosește un stivă tradițională pentru dezvoltarea firmware-ului bazată pe biblioteca newlib.
Dimensiunea firmware-ului rezultat a fost de 84100 de octeți în proiectul pe Rust și 76744 de octeți în proiectul pe C (cu 10% mai puțin), dar consumul de memorie RAM în firmware-ul pe Rust a fost semnificativ mai mic – 24640 de octeți față de 42608 de octeți. În ceea ce privește performanța, în timpul testării prototipurilor inițiale, dezvoltate în 6 săptămâni, implementarea pe Rust depășea de două ori implementarea pe C, dar ambele implementări erau semnificativ sub performanța maximă estimată. După 4 săptămâni alocate optimizării, ambele implementări au atins aproximativ același rezultat, apropiat de maximum estimat.

Sursa: opennet.ro
