Izšel Rust 1.78. Jezik Borgo, ki združuje prednosti Go in Rust

Objavljena je bila izdaja splošnega programskega jezika Rust 1.78, ki ga je ustanovil projekt Mozilla, zdaj pa se razvija pod okriljem neodvisne neprofitne organizacije Rust Foundation. Jezik se osredotoča na varnost pomnilnika in zagotavlja sredstva za doseganje visoke paralelnosti opravil, hkrati pa se izogiba uporabi zbiralnika smeti in izvajalnega okolja (izvajalni čas je zmanjšan na osnovno inicializacijo in vzdrževanje standardne knjižnice).

Rustove metode ravnanja s pomnilnikom rešijo razvijalca pred napakami pri ravnanju s kazalci in ščitijo pred težavami, ki nastanejo zaradi ravnanja s pomnilnikom na nizki ravni, kot je dostop do območja pomnilnika, potem ko je bilo osvobojeno, dereferenciranje ničelnih kazalcev, prekoračitev medpomnilnika itd. Za distribucijo knjižnic, zagotavljanje gradenj in upravljanje odvisnosti projekt razvija upravitelja paketov Cargo. Repozitorij crates.io je podprt za gostovanje knjižnic.

Varnost pomnilnika je v Rustu zagotovljena v času prevajanja s preverjanjem sklicevanj, spremljanjem lastništva objekta, spremljanjem življenjskih dob objektov (obseg) in ocenjevanjem pravilnosti dostopa do pomnilnika med izvajanjem kode. Rust zagotavlja tudi zaščito pred celoštevilskimi prelivi, zahteva obvezno inicializacijo vrednosti spremenljivk pred uporabo, bolje obravnava napake v standardni knjižnici, privzeto uporablja koncept nespremenljivih referenc in spremenljivk, ponuja močno statično tipkanje za zmanjšanje logičnih napak.

Glavne novosti:

  • Predlagan je bil nov imenski prostor atributa "#[diagnostic]", ki zagotavlja sredstvo za vplivanje na sporočila o napakah, ki jih ustvari prevajalnik. Prvi v novem prostoru je atribut »#[diagnostic::on_unimplemented]«, ki ga je mogoče uporabiti za prilagoditev sporočil o napakah, vrženih v situaciji, ko morate uporabiti lastnost, ki ni implementirana za vrsto. #[diagnostic::on_unimplemented( message = "Moje sporočilo za `ImportantTrait<{A}>` ni implementirano za `{Self}`", label = "Moja oznaka", note = "Opomba 1", note = "Opomba 2" )] lastnost ImportantTrait {} fn use_my_trait(_: impl ImportantTrait ) {} fn main() { use_my_trait(String::new()); } napaka[E32]: Moje sporočilo za `ImportantTrait ` ni implementiran za `String` —> src/main.rs:0277:32 | 12 | use_my_trait(String::new()); | ———— ^^^^^^^^^^^^^ Moja založba | | | zahteva vezava, uvedena s tem klicem | = pomoč: lastnost `ImportantTrait ` ni implementiran za `Niz` = opomba: Opomba 18 = opomba: Opomba 12
  • Preverjanja pred potrditvami, ki se uporabljajo za nevarne funkcije, je zdaj mogoče odložiti do generiranja kode, kar omogoča izvajanje teh preverjanj brez potrebe po gradnji standardne knjižnice v načinu "#[cfg(debug_assertions)]". Za sprožitev preverjanj je zdaj dovolj, da omogočite trditve za odpravljanje napak za preizkusne ali odpravljalne zgradbe vaše kode.
  • Vedenje funkcij v standardni knjižnici, ki vplivajo na poravnavo kazalcev in rezin, je zdaj predvidljivo med izvajanjem in je odvisno od vhodnih podatkov. Funkcija pointer::align_offset, ki izračuna odmik za poravnavo kazalca, zdaj vrne usize::MAX le, če operacija ne uspe. Funkciji slice::align_to in slice::align_to_mut obe, ki pretvorita rezine v predstavitev s poravnano srednjo rezino ter izvirnima začetnima in končnima rezinama, zdaj vedno vrneta največji srednji del.
  • V kategorijo hlevov so prešli:
    • impl Preberi za &Stdin
    • Dovolite uporabo nestatične (nestatične) življenjske dobe za nekatere implementacije, povezane z napako std::error::Error.
    • Impl implementacija ?Dovoljena je vrednost velikosti.
    • impl Od za io::Napaka
  • Funkcija Barrier::new() je bila stabilizirana za uporabo z atributom "const" v katerem koli kontekstu namesto konstant.
  • 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 in i686-pc-windows-gnullvm zdaj zahteva vsaj različico sistema Windows 10.
  • Tretja raven podpore je bila implementirana za platforme wasm32-wasip2, arm64ec-pc-windows-msvc, armv8r-none-eabihf in loongarch64-unknown-linux-musl. Tretja raven vključuje osnovno podporo, vendar brez avtomatiziranega testiranja, objave uradnih gradenj ali preverjanja, ali je kodo mogoče zgraditi.
  • Implementirana je bila druga stopnja podpore za ciljno platformo Add wasm32-wasip1. Druga raven podpore vključuje garancijo za montažo.
  • Platforma wasm32-wasi-preview1-threads je bila preimenovana v wasm32-wasip1-threads.
  • Prevajalnik je bil preklopljen na uporabo LLVM 18. Pri uporabi LLVM 18 za arhitekturi x86-32 in x86-64 je bil spremenjen ABI, povezan s tipoma u128 in i128.
  • V Cargo pact managerju je bila različica 4 zaklepnih datotek (lockfile v4) stabilizirana.
  • Cargo ima stabiliziran globalni predpomnilnik z informacijami o zadnji uporabi podatkov. Predpomnilnik gostuje v $CARGO_HOME/.global-cache z uporabo SQLite in se samodejno posodablja, da odraža najnovejše spremembe indeksa, datoteke zaboja, imenika kode, git klona in git checkout-a.

Poleg tega poskuša biti programski jezik Borgo bolj izrazit kot jezik Go, a manj zapleten kot jezik Rust. Borgo združuje najboljše lastnosti Go in Rust ter nadomešča pomanjkljivosti obeh jezikov. Na primer, Go je preprost in enostaven, vendar ne nudi naprednih varnostnih funkcij. Jezik Rust ponuja orodja za varno programiranje, vendar je preveč zapleten. Projekt razvija Marco Sampellegrini, avtor priročnika The Simple Haskell Handbook in razvijalec sistema za kontinuirano integracijo Quad CI.

Izšel Rust 1.78. Jezik Borgo, ki združuje prednosti Go in Rust

Borgo uporablja statično tipkanje, tipe, podobne Go, in sintakso, podobno Rustu. Podpičja so neobvezna na koncu vrstic v kodi Borgo. Koda Borgo je sestavljena v predstavitev Go, ki je popolnoma združljiva z obstoječimi paketi Go. Koda prevajalnika je napisana v Rustu in se distribuira pod licenco ISC. uporabite fmt enum NetworkState { Nalaganje, 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 => “še vedno se nalaga”, NetworkState.Failed(code) => fmt.Sprintf(“Got error code: %d”, code), NetworkState.Success (res) => res.title, } fmt.Println(msg) }

Vir: opennet.ru

Dodaj komentar