A fost publicată versiunea 1.78 a limbajului de programare general Rust, dezvoltat inițial de proiectul Mozilla, dar acum este susținut de o organizație independentă non-profit, Rust Foundation. Limbajul se concentrează pe lucrul sigur cu memoria și oferă instrumente pentru a atinge un înalt grad 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 la î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:
- A fost propus un nou spațiu de nume pentru atributele „#[diagnostic]”, care oferă instrumente pentru influențarea mesajelor de eroare emise de compilator. Primul atribut din noul spațiu este „#[diagnostic::on_unimplemented]”, care poate fi utilizat pentru a personaliza mesajele de eroare emise în situațiile în care se cere utilizarea unui trait care nu este implementat pentru un tip. #[diagnostic::on_unimplemented( message = "My Message for `ImportantTrait<{A}>` is not implemented for `{Self}`", label = "My Label", note = "Note 1", note = "Note 2" )] trait ImportantTrait<A> {} fn use_my_trait(_: impl ImportantTrait<i32>) {} fn main() { use_my_trait(String::new()); } error[E0277]: My Message for `ImportantTrait<i32>` is not implemented for `String` —> src/main.rs:12:18 | 12 | use_my_trait(String::new()); | ———— ^^^^^^^^^^^^^ My Label | | | required by a bound introduced by this call | = help: the trait `ImportantTrait<i32>` is not implemented for `String` = note: Note 1 = note: Note 2
- Verificările preliminare assert aplicate funcțiilor unsafe pot fi acum amânate până în etapa generării codului, ceea ce permite efectuarea acestor verificări fără a necesita compilarea bibliotecii standard în modul „#[cfg(debug_assertions)]”. Pentru ca verificările să fie activate, este suficient să se activeze assert-urile de depanare pentru compilările de testare sau de depanare ale propriului cod.
- Comportamentul funcțiilor din biblioteca standard care afectează alinierea pointerilor și a slice-urilor este acum predictibil în timpul execuției și depinde de datele de intrare. Funcția pointer::align_offset, care calculează offset-ul pentru alinierea pointerului, va returna acum usize::MAX doar atunci când operația nu poate fi efectuată. Funcțiile slice::align_to și slice::align_to_mut, care transformă slice-urile în reprezentări cu un mediu aliniat și slice-uri inițiale și finale originale, returnează acum întotdeauna cea mai mare parte mediană.
- Au fost trecute în categoria stabilă:
- impl Read for &Stdin
- Este permis utilizarea unui timp de viață non-static (nu ‘static) pentru unele implementări legate de std::error::Error.
- În implementarea impl<Fd: AsFd> este permisă utilizarea unei valori ?Sized.
- impl From<TryReserveError> pentru io::Error
- Funcția Barrier::new() a fost stabilizată pentru utilizarea cu semnul „const” în orice context în loc de constante.
- Pentru platformele țintă x86_64-pc-windows-msvc, i686-pc-windows-msvc, x86_64-pc-windows-gnu, i686-pc-windows-gnu, x86_64-pc-windows-gnullvm și i686-pc-windows-gnullvm se cere acum cel puțin versiunea Windows 10.
- A fost implementat cel de-al treilea nivel de suport pentru platformele wasm32-wasip2, arm64ec-pc-windows-msvc, armv8r-none-eabihf și loongarch64-unknown-linux-musl. Al treilea nivel implică suport de bază, dar fără testare automatizată, publicarea de build-uri oficiale și verificarea capacității de construire a codului.
- A fost implementat al doilea nivel de suport pentru platforma țintă Add wasm32-wasip1. Al doilea nivel de suport oferă garanția compilării.
- Platforma wasm32-wasi-preview1-threads a fost redenumită în wasm32-wasip1-threads.
- Compilerul a fost transformat pentru a utiliza LLVM 18. Atunci când se folosește LLVM 18 pentru arhitecturi x86-32 și x86-64, ABI-ul legat de tipurile u128 și i128 a fost modificat.
- În managerul de pachete Cargo a fost stabilizată versiunea 4 a fișierelor de blocare (lockfile v4).
- În Cargo a fost stabilizat un cache global cu informații despre ultima utilizare a datelor. Cache-ul se află în fișierul $CARGO_HOME/.global-cache folosind SQLite, este actualizat automat și reflectă ultimele modificări legate de index, fișierul crate, directorul de cod, git clone și git checkout.
De asemenea, se poate menționa limbajul de programare Borgo, care încearcă să fie mai expresiv decât limbajul Go, dar mai puțin complex decât limbajul Rust. Borgo combină cele mai bune trăsături ale lui Go și Rust, compensând dezavantajele fiecărui limbaj. De exemplu, limbajul Go este simplu și ușor de înțeles, dar nu oferă instrumente avansate pentru a asigura siguranța în lucrul cu tipurile. Limbajul Rust oferă instrumente pentru programare sigură, dar este prea complicat. Proiectul este dezvoltat de Marco Sampellegrini, autorul cărții „The Simple Haskell Handbook” și dezvoltator al sistemului de integrare continuă Quad CI.

În Borgo se folosește tipizarea statică, tipuri asemănătoare cu cele din limbajul Go și o sintaxă similară cu cea din Rust. Specificarea punctelor și virgulelor la sfârșitul liniilor în codul Borgo nu este obligatorie. Codul în limbajul Borgo se compilează într-o reprezentare în limbajul Go, care este complet compatibilă cu pachetele existente pentru limbajul Go. Codul compilatorului este scris în limbajul Rust și este distribuit sub licența ISC. use fmt enum NetworkState { Loading, Failed(int), Success(T), } struct Response { title: string, duration: int, } fn main() { let res = Response { title: "Hello world", duration: 0, } let state = NetworkState.Success(res) let msg = match state { NetworkState.Loading => "still loading", NetworkState.Failed(code) => fmt.Sprintf("Got error code: %d", code), NetworkState.Success(res) => res.title, } fmt.Println(msg) }
Sursa: opennet.ro
