Objavljen je programski jezik opće namjene Rust 1.78, utemeljen na projektu Mozilla, ali sada razvijen pod pokroviteljstvom nezavisne neprofitne organizacije Rust Foundation. Jezik se fokusira na sigurnost memorije i pruža sredstva za postizanje visokog paralelizma poslova uz izbjegavanje upotrebe skupljača smeća i vremena izvođenja (vrijeme izvođenja je smanjeno na osnovnu inicijalizaciju i održavanje standardne biblioteke).
Rustove metode rukovanja memorijom spašavaju programere od pogrešaka pri manipuliranju pokazivačima i štite od problema koji nastaju zbog rukovanja memorijom na niskoj razini, kao što je pristup memorijskom području nakon što je ono oslobođeno, dereferenciranje nultih pokazivača, prekoračenje međuspremnika, itd. Za distribuciju biblioteka, pružanje nadogradnji i upravljanje ovisnostima, projekt razvija upravitelja paketa Cargo. Repozitorij crates.io podržan je za smještaj knjižnica.
Sigurnost memorije osigurana je u Rustu tijekom kompajliranja provjerom referenci, praćenjem vlasništva objekta, praćenjem životnih vijekova objekta (opsega) i procjenom ispravnosti pristupa memoriji tijekom izvođenja koda. Rust također pruža zaštitu od prekoračenja cjelobrojnih brojeva, zahtijeva obaveznu inicijalizaciju vrijednosti varijabli prije upotrebe, bolje obrađuje pogreške u standardnoj biblioteci, primjenjuje koncept nepromjenjivih referenci i varijabli prema zadanim postavkama, nudi snažno statično tipkanje za smanjenje logičkih pogrešaka.
Glavne inovacije:
- Predložen je novi prostor imena atributa "#[diagnostic]" koji omogućuje način utjecaja na poruke o pogreškama koje proizvodi prevoditelj. Prvi u novom prostoru je atribut "#[diagnostic::on_unimplemented]", koji se može koristiti za prilagodbu poruka o pogrešci koje se pojavljuju u situaciji kada trebate upotrijebiti značajku koja nije implementirana za tip. #[diagnostic::on_unimplemented( message = "Moja poruka za `ImportantTrait<{A}>` nije implementirana za `{Self}`", label = "Moja oznaka", note = "Napomena 1", note = "Napomena 2" )] značajka ImportantTrait {} fn use_my_trait(_: impl ImportantTrait ) {} fn main() { use_my_trait(String::new()); } pogreška[E32]: Moja poruka za `ImportantTrait ` nije implementiran za `String` —> src/main.rs:0277:32 | 12 | koristi_moju_osobinu(Niz::novo()); | ———— ^^^^^^^^^^^^^ Moja etiketa | | | zahtijeva veza uvedena ovim pozivom | = pomoć: osobina `ImportantTrait ` nije implementirano za `Niz` = bilješka: Napomena 18 = bilješka: Napomena 12
- Provjere prije tvrdnji primijenjene na nesigurne funkcije sada se mogu odgoditi do generiranja koda, omogućujući izvođenje ovih provjera bez potrebe za izgradnjom standardne biblioteke u načinu rada "#[cfg(debug_assertions)]". Da biste pokrenuli provjere, sada je dovoljno omogućiti tvrdnje o ispravljanju pogrešaka za testne ili ispravljačke verzije vašeg koda.
- Ponašanje funkcija u standardnoj biblioteci koje utječu na poravnanje pokazivača i odsječaka sada je predvidljivo tijekom izvođenja i ovisi o ulaznim podacima. Funkcija pointer::align_offset, koja izračunava pomak za poravnavanje pokazivača, sada vraća usize::MAX samo ako operacija ne uspije. Obje funkcije slice::align_to i slice::align_to_mut, koje pretvaraju rezove u prikaz s poravnatim srednjim rezovima i izvornim početnim i završnim rezovima, sada uvijek vraćaju najveći srednji dio.
- U kategoriju stabilnih prebačeni su:
- impl Čitaj za &Stdin
- Dopusti korištenje nestatičnog (nestatičnog) životnog vijeka za neke implementacije povezane s std::error::Error.
- Impl implementacija ?Dopuštena je vrijednost veličine.
- impl From za io::Greška
- Funkcija Barrier::new() je stabilizirana za korištenje s atributom "const" u bilo kojem kontekstu umjesto konstanti.
- Za ciljne platforme 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 sada zahtijeva barem verziju sustava Windows 10.
- Treća razina podrške implementirana je za platforme wasm32-wasip2, arm64ec-pc-windows-msvc, armv8r-none-eabihf i loongarch64-unknown-linux-musl. Treća razina uključuje osnovnu podršku, ali bez automatiziranog testiranja, objavljivanja službenih međugradnji ili provjere može li se kod izgraditi.
- Implementirana je druga razina podrške za ciljnu platformu Add wasm32-wasip1. Druga razina podrške uključuje jamstvo za montažu.
- Platforma wasm32-wasi-preview1-threads preimenovana je u wasm32-wasip1-threads.
- Kompajler je prebačen na korištenje LLVM 18. Prilikom korištenja LLVM 18 za x86-32 i x86-64 arhitekture, ABI povezan s tipovima u128 i i128 je promijenjen.
- U Cargo pact manageru verzija 4 zaključanih datoteka (lockfile v4) je stabilizirana.
- Cargo ima stabiliziranu globalnu predmemoriju s informacijama o posljednjoj upotrebi podataka. Predmemorija se nalazi u $CARGO_HOME/.global-cache koristeći SQLite i automatski se ažurira kako bi odražavala najnovije promjene indeksa, datoteke sanduka, direktorija koda, git klona i git provjere.
Osim toga, programski jezik Borgo pokušava biti izražajniji od jezika Go, ali manje složen od jezika Rust. Borgo kombinira najbolje značajke Goa i Rusta, nadoknađujući nedostatke svakog jezika. Na primjer, Go je jednostavan i jasan, ali ne nudi napredne sigurnosne značajke. Rust jezik pruža alate za sigurno programiranje, ali je prekompliciran. Projekt razvija Marco Sampellegrini, autor The Simple Haskell Handbook i programer Quad CI kontinuiranog integracijskog sustava.

Borgo koristi statično tipkanje, tipove slične Go-u i sintaksu sličnu Rustu. Točke i zareze nisu obavezne na kraju redaka u Borgo kodu. Borgo kod je kompiliran u Go reprezentaciju koja je potpuno kompatibilna s postojećim Go paketima. Kod prevoditelja napisan je u Rustu i distribuira se pod ISC licencom. koristite 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 => “još uvijek se učitava”, NetworkState.Failed(code) => fmt.Sprintf(“Got error code: %d”, code), NetworkState.Success (res) => res.title, } fmt.Println(msg) }
Izvor: opennet.ru
