A fost publicat release-ul limbajului de programare de uz general Rust 1.84, care a fost dezvoltat inițial de proiectul Mozilla, dar acum este întreținut sub auspiciile unei organizații nonprofit independente, Rust Foundation. Limbajul se concentrează pe lucrul sigur cu memoria și oferă instrumente pentru atingerea unui grad ridicat de paralelism în execuția sarcinilor, fără a utiliza un colector de gunoi și runtime (runtime se reduce la inițializarea de bază și întreținerea bibliotecii standard).
Metodele de gestionare a memoriei în Rust scutesc dezvoltatorul de erori în manipularea pointerilor și protejează împotriva problemelor care apar din lucrul de nivel scăzut cu memoria, cum ar fi accesarea unui spațiu de memorie după ce acesta a fost eliberat, dereferința pointerilor nuli, depășirea limitelor buffer-ului etc. Pentru distribuirea bibliotecilor, asigurarea construirii și gestionarea dependențelor, se dezvoltă managerul de pachete Cargo. Pentru găzduirea bibliotecilor, suportul este oferit prin intermediul repository-ului 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:
- În managerul de pachete Cargo, a fost stabilizat mecanismul de gestionare a dependențelor, care selectează versiunile componentelor dependente ținând cont de compatibilitatea cu versiunile compilatorului Rust, declarate ca fiind minim suportate de proiect (MSRV, Minimum Supported Rust Version). Noua funcționalitate permite dezvoltatorilor să scape de necesitatea de a alege manual versiunile mai vechi ale fiecărei dependențe în proiectele care păstrează compatibilitatea cu versiunile anterioare ale instrumentarului Rust. Noua modalitate de determinare a dependențelor va fi activată implicit în release-ul Rust 1.85, iar pentru moment este disponibilă sub formă de opțiune, care poate fi activată în secțiunea „[resolver]” din fișierul „.cargo/config.toml” prin specificarea ‘incompatible-rust-versions = „fallback”’.
- A început traducerea compilatorului pe un nou handler de tipuri (trait solver), destinat verificării limitelor de aplicabilitate ale trait-urilor, normalizării tipurilor și evaluării compatibilității tipurilor. În versiunea 1.84, noul handler a fost utilizat pentru a verifica consistența implementărilor trait-urilor, adică evaluarea existenței a nu mai mult de un trait pentru tipul considerat, având în vedere codul din alte pachete crate. Această verificare a permis eliminarea problemelor din vechea implementare a handler-ului de tipuri, care ar fi putut conduce la apariția conflictelor din cauza suprapunerii diferitelor implementări ale trait-urilor.
- A fost propus un nou API „Strict Provenance”, care poate fi utilizat pentru a converti un pointer într-un număr întreg și înapoi, având în vedere metadatele atașate pointerului cu informații despre proveniența și domeniul său de utilizare (în afară de adresa pointerului, este atașată valoarea „provenance” cu informații despre legătura cu alte pointere, permițând determinarea locului și momentului în care pointerul poate accesa memoria). Conversia unui pointer într-un număr întreg și înapoi poate duce la comportamente nedeterminate din cauza dificultății de a urmări proveniența pointerului rezultat. Noua API permite realizarea de operațiuni de nivel jos cu pointere, cum ar fi salvarea de informații suplimentare în biții inferiori ai pointerului, fără a-l converti într-un număr întreg.
- O nouă porțiune de API a fost transformată în stabilitate, inclusiv metode și implementări ale tiparelor stabilize.
- Ipv6Addr::is_unique_local
- Ipv6Addr::is_unicast_link_local
- core::ptr::with_exposed_provenance
- core::ptr::with_exposed_provenance_mut
- ::addr
- ::expose_provenance
- ::with_addr
- ::map_addr
- ::isqrt
- ::checked_isqrt
- ::isqrt
- NonZero::isqrt
- core::ptr::without_provenance
- core::ptr::without_provenance_mut
- core::ptr::dangling
- core::ptr::dangling_mut
- Pin::as_deref_mut
- Semnul „const” aplicat în funcții:
- AtomicBool::from_ptr
- AtomicPtr::from_ptr
- AtomicU8::from_ptr
- AtomicU16::from_ptr
- AtomicU32::from_ptr
- AtomicU64::from_ptr
- AtomicUsize::from_ptr
- AtomicI8::from_ptr
- AtomicI16::from_ptr
- AtomicI32::from_ptr
- AtomicI64::from_ptr
- AtomicIsize::from_ptr
- ::is_null
- ::as_ref
- ::as_mut
- Pin::new
- Pin::new_unchecked
- Pin::get_ref
- Pin::into_ref
- Pin::get_mut
- Pin::get_unchecked_mut
- Pin::static_ref
- Pin::static_mut
- A fost stabilizată sprijinul pentru inserțiile inline în assemblare pentru arhitecturile s390x și Arm64EC.
- Pentru platforma țintă WebAssembly, sprijinul pentru funcționalitățile multivalue, reference-types și tail-call a fost stabilizat.
- A fost implementat un al doilea nivel de sprijin pentru platforma wasm32v1-none. Al doilea nivel de sprijin implică o garanție de construire.
De asemenea, se pot menționa câteva proiecte legate de Rust:
- A fost lansată versiunea 2.2 a sistemului de operare Tock, scris în limbajul Rust, destinat utilizării în microcontrolere. Sistemul permite organizarea execuției simultane a mai multor aplicații nesigure pe dispozitive încorporate cu memorie RAM limitată, cum ar fi senzori, TPM (Trusted Platform Module), dispozitive de autentificare și dispozitive purtabile. Sunt suportate platforme cu microcontrolere bazate pe arhitecturi ARM Cortex-M și RISC-V. O caracteristică cheie a Tock este izolarea nivelurilor aplicațiilor, nucleului și stratului de drivere, precum și izolarea fiecărei aplicații și driver separat. Pentru izolare se folosesc atât capabilitățile limbajului Rust, cât și divizarea la nivel de protecție a memoriei.
- Proiectul VEKOS (Verified Experimental Kernel OS) dezvoltă nucleul sistemului de operare în limbajul Rust, asigurând verificarea componentelor executabile. La fiecare operațiune cu sistemul de fișiere, crearea unui proces și alocarea memoriei se generează o confirmare criptografică, permițând verificarea operațiunii în timpul execuției (implementarea este comparabilă cu utilizarea tehnologiei blockchain pentru verificarea acțiunilor din sistemul de operare). În sistemul de fișiere VKFS, pentru a asigura integritatea și protecția împotriva alterării retroactive, este utilizată o structură „arbori Merkle” (Merkle Tree), fiecare ramură verificând toate ramurile și nodurile subiacente, datorită hash-ării arborice. Alocarea memoriei este realizată în modul COW (Copy-On-Write).
- Un grup de cercetători de la Microsoft și Inria dezvoltă un subset al limbajului C — Mini-C, destinat translației automate a programelor scrise în C în reprezentări în limbajul Rust. Spre deosebire de compilatorul c2rust, noul proiect permite generarea codului Rust fără utilizarea unsafe, dar este destinat în principal transformării proiectelor C cu dovezi formale de fiabilitate. Se presupune că va fi mai simplu să se traducă inițial un proiect C în reprezentarea Mini-C, care nu permite operații aritmetice cu pointeri, decât să se rescrie blocurile unsafe după compilarea directă din C în Rust.
Implementarea compilatorului se bazează pe instrumentele KaRaMeL. Mini-C a fost dezvoltat și testat în cadrul unui proiect de rescriere în Rust a bibliotecii criptografice HACL*, pentru care a fost oferit o dovadă formală a fiabilității. Această dovadă a fost folosită pentru a demonstra capacitatea de a genera din Mini-C cod sigur în Rust.
- Daniel Stenberg, autorul utilitarului curl, a anunțat încetarea dezvoltării și suportului pentru backend-ul alternativ HTTP al proiectului Curl, scris în Rust folosind biblioteca Hyper. Motivul invocat este lipsa de interes din partea dezvoltatorilor și utilizatorilor.
- A fost anunțată versiunea beta a shell-ului Fish 4.0, rescris în limbajul Rust. Se menționează că, după doi ani de dezvoltare, baza de cod a Fish a fost complet transferată de la C++ la Rust. Trecerea la Rust a permis rezolvarea problemelor de multithreading, obținerea unui instrumentar modern care să identifice erorile în timpul compilării, creșterea siguranței în utilizarea memoriei și atragerea de noi dezvoltatori.
- Proiectul Tor a publicat versiunea Arti 1.3.2, o implementare alternativă a clientului Tor în limbajul Rust. Arti oferă o bibliotecă încorporabilă care poate fi utilizată de diverse aplicații. La crearea Arti s-au luat în considerare experiențele anterioare în dezvoltarea Tor pentru a evita problemele arhitecturale cunoscute, a face proiectul mai modular și eficient. Ramura 1.x este marcată ca fiind adecvată pentru utilizatorii obișnuiți și oferă același nivel de confidențialitate, uzabilitate și stabilitate ca și implementarea principală în limbajul C. În noua versiune, dezvoltarea RPC a continuat, a fost pregătit suportul pentru relee și a fost adăugată protecția împotriva atacurilor DoS asupra serviciilor Onion.
- A fost publicată versiunea motorului de joc Bevy 0.15, scris în Rust. În motor este utilizată o modelare centrată pe date (Data Driven) pentru definirea logicii de joc, construită pe un set de componente gata făcute Bevy ECS (Entity Component System), care pot fi executate în paralel. Este suportat rendering 2D și 3D, animația scheletului, definirea grafului de rendering, un sistem de generare a scenelor, un cadru pentru construirea interfeței utilizatorului, modificări aduse scenelor și resurselor fără a necesita repornirea.
- A fost publicat editorul de text console Helix 25.01, scris în Rust și extinzând ideile fundamentate în vim și neovim. Este suportată integrarea cu serverele LSP și Tree-sitter, selecția simultană a mai multor blocuri, utilizarea mai multor cursori în timpul editării, teme de design și protocolul de depanare DAP (Debug Adapter Protocol).
- Motorul de browser Servo, scris în Rust, a adăugat suport pentru modul întunecat. Dimensiunea browserului ServoShell a fost redusă cu 20%. Suportul pentru specificațiile web a fost extins până la posibilitatea de a intra și citi mesaje în Discord (trimiterea mesajelor este în prezent imposibilă).
- Compania Mozilla a prezentat instrumentul Uniffi pentru React Native pentru a crea module pentru React Native utilizând limbajul Rust.
- Au fost efectuate teste de performanță pentru encoderii de imagini în format PNG. Decodeurile pe Rust (png, zune-png, wuffs) s-au dovedit a fi mai rapide decât cele pe C (libpng, spng, stb_image). De exemplu, pachetul crate png (image-rs) a depășit libpng de 1.8 ori pe sistemul x86 și de 1.5 ori pe sistemul ARM. image-rs: 375.401 MP/s (medie) 318.632 MP/s (media geometrică) zune-png: 376.649 MP/s (medie) 302.529 MP/s (media geometrică) wuffs: 376.205 MP/s (medie) 287.181 MP/s (media geometrică) libpng: 208.906 MP/s (medie) 173.034 MP/s (media geometrică) spng: 299.515 MP/s (medie) 235.495 MP/s (media geometrică) stb_image: 234.353 MP/s (medie) 171.505 MP/s (media geometrică)
Sursa: opennet.ro
