A fost lansată versiunea 1.86 a limbajului de programare de uz general Rust, dezvoltat inițial de Mozilla, dar administrat acum de organizația non-profit Rust Foundation. Limbajul se concentrează pe utilizarea sigură a memoriei și oferă instrumente pentru a obține un înalt grad de paralelism în execuția sarcinilor, fără a necesita un colector de gunoi și un runtime (runtime-ul se rezumă la inițializarea de bază și la menț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:
- A fost adăugată suportul pentru upcasting-ul trait-urilor la supertrait-uri, adică s-a introdus posibilitatea de a transforma direct o referință la un obiect de tip trait într-o referință la un obiect de tip supertrait, fără a fi nevoie de crearea unei metode speciale în trait care să returneze o referință la supertrait. Aceleași operații pot fi efectuate și cu alte tipuri de pointeri inteligenți, de exemplu, „Arc<dyn Trait> -> Arc<dyn Supertrait>” și „*const dyn Trait -> *const dyn Supertrait”. trait Trait: Supertrait {} trait Supertrait {} fn upcast(x: &dyn Trait) -> &dyn Supertrait { x }
- În HashMap și slice-uri a fost adăugat metoda get_disjoint_mut() pentru a obține simultan mai multe referințe modificabile la elemente. Anterior, borrow checker-ul nu permitea utilizarea simultană a referințelor obținute prin metoda get_mut(). let v = &mut [1, 2, 3]; if let Ok([a, b]) = v.get_disjoint_mut([0, 2]) { *a = 413; *b = 612; } assert_eq!(v, &[413, 2, 612]); if let Ok([a, b]) = v.get_disjoint_mut([0..1, 1..3]) { a[0] = 8; b[0] = 88; b[1] = 888; } assert_eq!(v, &[8, 88, 888]);
- Este permis să se marcheze funcțiile safe cu ajutorul atributului „#[target_feature]”, indicând că funcția utilizează funcționalitățile specificate ale CPU-ului. O funcție safe, marcată cu atributul „#[target_feature]”, poate fi apelată în siguranță de către o altă funcție safe doar în cazul în care aceasta din urmă este, de asemenea, marcată cu „#[target_feature]” (în caz contrar, astfel de funcții trebuie apelate în interiorul unui bloc unsafe). De asemenea, nu pot fi transmise funcțiilor care acceptă parametri generici, restricționați de trait-urile Fn*. Anterior, atributul „#[target_feature]” putea fi aplicat doar funcțiilor marcate ca „unsafe”. #[target_feature(enable = „avx2”)] fn requires_avx2() { // … } #[target_feature(enable = „avx2”)] fn safe_callsite() { requires_avx2(); } fn unsafe_callsite() { if is_x86_feature_detected!(„avx2”) { unsafe { requires_avx2() }; } }
- În compilatorul Rust, verificările de debug sunt activate (debug-assert), asigurându-se că un pointer nu conține valoarea NULL la citirea și scrierea unor dimensiuni nenule, precum și atunci când se reîmprumută (reborrow) pointerul într-o referință. De exemplu, cu verificările de debug activate, codul de mai jos va provoca acum o stare de „panic”: let _x = *std::ptr::null::(); let _x = &*std::ptr::null::();
- Verificarea lint „missing_abi” este activată implicit, generând un avertisment dacă ABI-ul nu este specificat după cuvântul cheie extern. Anterior, dacă ABI-ul nu era specificat, se presupunea că se folosește ABI-ul „C”. Acum se recomandă să se specifice explicit ABI-ul „C”, de exemplu, ‘extern „C” {}’ și ‘extern „C” fn’
- O nouă porțiune de API a fost transformată în stabilitate, inclusiv metode și implementări ale tiparelor stabilize.
- {float}::next_down
- {float}::next_up
- ::get_disjoint_mut
- ::get_disjoint_unchecked_mut
- slice::GetDisjointMutError
- HashMap::get_disjoint_mut
- HashMap::get_disjoint_unchecked_mut
- NonZero::count_ones
- Vec::pop_if
- sync::Once::wait
- sync::Once::wait_force
- sync::OnceLock::wait
- Semnul „const” aplicat în funcții:
- hint::black_box
- io::Cursor::get_mut
- io::Cursor::set_position
- str::is_char_boundary
- str::split_at
- str::split_at_checked
- str::split_at_mut
- str::split_at_mut_checked
- A fost implementat un al treilea nivel de suport pentru platformele {aarch64-unknown,x86_64-pc}-nto-qnx710_iosock, {aarch64-unknown,x86_64-pc}-nto-qnx800, {x86_64,i686}-win7-windows-gnu, amdgcn-amd-amdhsa, x86_64-pc-cygwin, {mips,mipsel}-mti-none-elf, m68k-unknown-none-elf, armv7a-nuttx-{eabi,eabihf}, aarch64-unknown-nuttx și thumbv7a-nuttx-{eabi,eabihf}. Acest al treilea nivel implică suport de bază, dar fără testare automatizată, publicarea de versiuni oficiale și verificarea posibiltății de compilare a codului.
- A fost adăugat un avertisment privind încetarea suportului de nivelul al doilea pentru platforma țintă i586-pc-windows-msvc în următoarea versiune (1.87). Se recomandă utilizarea platformei i686-pc-windows-msvc, care diferă prin suportul instrucțiunilor SSE2. Platforma i586-pc-windows-msvc a devenit irelevantă, deoarece Windows 10 necesită suport SSE2, iar versiunile anterioare de Windows nu sunt suportate în Rust.
De asemenea, se poate menționa că compania Ferrocene a transmis comunității specificația pentru limbajul Rust (FLS — Ferrocene Language Specification), creată în procesul de dezvoltare a propriului său compilator Rust pentru sisteme critice și periodic sincronizată cu starea actuală a compilatorului Rust principal. Specificația FLS include un ghid structurat și detaliat privind sintaxa, semantica și comportamentul Rust, potrivit pentru verificare, evaluarea compatibilității și standardizare.
Materialele transmise vor fi folosite pentru crearea unei specificații etalon pentru limbajul Rust, care poate fi utilizată la dezvoltarea de compilatoare alternative și pentru verificarea compilatorului în domenii critice pentru securitate.
Sursa: opennet.ro
