Rust 1.78 frigivet. Borgo-sprog, der kombinerer styrkerne ved Go og Rust

Det generelle programmeringssprog Rust 1.78, grundlagt af Mozilla-projektet, men nu udviklet i regi af den uafhængige non-profit organisation Rust Foundation, er blevet frigivet. Sproget fokuserer på hukommelsessikkerhed og giver midlerne til at opnå høj jobparallelisme, samtidig med at man undgår brugen af ​​en skraldeopsamler og runtime (runtime reduceres til grundlæggende initialisering og vedligeholdelse af standardbiblioteket).

Rusts hukommelseshåndteringsmetoder sparer udvikleren for fejl ved manipulation af pointere og beskytter mod problemer, der opstår på grund af hukommelseshåndtering på lavt niveau, såsom adgang til et hukommelsesområde efter det er blevet frigivet, dereferencing af nul-pointere, bufferoverskridelser osv. For at distribuere biblioteker, levere builds og administrere afhængigheder udvikler projektet Cargo Package Manager. Crates.io-lageret understøttes til hosting af biblioteker.

Hukommelsessikkerhed er tilvejebragt i Rust på kompileringstidspunktet gennem referencekontrol, holde styr på objektejerskab, holde styr på objektlevetider (scopes) og vurdere rigtigheden af ​​hukommelsesadgang under kodeudførelse. Rust giver også beskyttelse mod heltalsoverløb, kræver obligatorisk initialisering af variabelværdier før brug, håndterer fejl bedre i standardbiblioteket, anvender konceptet med uforanderlige referencer og variabler som standard, tilbyder stærk statisk skrivning for at minimere logiske fejl.

Vigtigste innovationer:

  • Et nyt attributnavneområde "#[diagnostik]" er blevet foreslået, hvilket giver et middel til at påvirke fejlmeddelelserne produceret af compileren. Den første i det nye rum er "#[diagnostic::on_unimplemented]" attributten, som kan bruges til at tilpasse fejlmeddelelserne i en situation, hvor du skal bruge en egenskab, der ikke er implementeret for typen. #[diagnostic::on_unimplemented( message = "Min besked for `ImportantTrait<{A}>` er ikke implementeret for `{Selv}`", label = "Min Label", note = "Note 1", note = "Note 2" )] egenskab ImportantTrait {} fn use_my_trait(_: impl ImportantTrait(_: impl ImportantTrait(_: impl ImportantTrait) ) {} fn main() { use_my_trait(String::new()); } fejl[E32]: Min besked til `ImportantTrait ` er ikke implementeret for `String` —> src/main.rs:0277:32 | 12 | use_my_trait(String::new()); | ———— ^^^^^^^^^^^^^^ Mit mærke | | | kræves af en bundet indført af denne indkaldelse | = hjælp: egenskaben `Vigtigttræk ` er ikke implementeret for `String` = note: Note 18 = note: Note 12
  • Pre-assert-tjek anvendt på usikre funktioner kan nu udskydes indtil kodegenerering, hvilket gør det muligt at udføre disse kontroller uden behov for at bygge standardbiblioteket i "#[cfg(debug_assertions)]"-tilstand. For at udløse tjek er det nu tilstrækkeligt at aktivere debug asserts for test eller debug builds af din kode.
  • Funktionen af ​​funktioner i standardbiblioteket, der påvirker pointer- og udsnitsjustering, er nu forudsigelig under kørsel og afhænger af inputdataene. Funktionen pointer::align_offset, som beregner offset for at justere pointeren, returnerer nu kun usize::MAX, hvis operationen mislykkes. Funktionerne slice::align_to og slice::align_to_mut begge, som transformerer skiver til en repræsentation med en justeret midterskive og de oprindelige start- og slutskiver, returnerer nu altid den største midterdel.
  • Følgende blev overført til staldkategorien:
    • impl Læs for &Stdin
    • Tillad brug af en ikke-statisk (ikke-statisk) levetid for nogle std::error::Fejlrelaterede implementeringer.
    • Impl implementering ?Størrelsesværdi er tilladt.
    • impl Fra for io::Fejl
  • Barrier::new()-funktionen er blevet stabiliseret til at blive brugt med "const"-attributten i enhver kontekst i stedet for konstanter.
  • Målplatforme x86_64-pc-windows-msvc, i686-pc-windows-msvc, x86_64-pc-windows-gnu, i686-pc-windows-gnu, x86_64-pc-windows-gnullvm og i686-pc-windows-gnu kræver nu mindst 10-pc-gn.-version af Windows.
  • Det tredje niveau af support er blevet implementeret for platformene wasm32-wasip2, arm64ec-pc-windows-msvc, armv8r-none-eabihf og loongarch64-unknown-linux-musl. Det tredje niveau involverer grundlæggende support, men uden automatiseret test, udgivelse af officielle builds eller kontrol af, om koden kan bygges.
  • Det andet niveau af understøttelse af målplatformen Add wasm32-wasip1 er blevet implementeret. Det andet supportniveau involverer en monteringsgaranti.
  • Platformen wasm32-wasi-preview1-threads er blevet omdøbt til wasm32-wasip1-threads.
  • Compileren er blevet skiftet til at bruge LLVM 18. Ved brug af LLVM 18 til x86-32- og x86-64-arkitekturer, er den ABI, der er knyttet til u128- og i128-typerne, blevet ændret.
  • I Cargo pact manager er version 4 af låsefiler (lockfile v4) blevet stabiliseret.
  • Cargo har en stabiliseret global cache med information om det seneste dataforbrug. Cachen er hostet i $CARGO_HOME/.global-cache ved hjælp af SQLite og opdateres automatisk for at afspejle de seneste ændringer til indekset, kassefilen, kodebiblioteket, git-klonen og git-checkout.

Derudover forsøger programmeringssproget Borgo at være mere udtryksfuldt end Go-sproget, men mindre komplekst end Rust-sproget. Borgo kombinerer de bedste egenskaber fra Go og Rust, og kompenserer for manglerne ved hvert sprog. For eksempel er Go enkel og ligetil, men giver ikke avancerede sikkerhedsfunktioner. Rust-sproget giver værktøjer til sikker programmering, men er overkompliceret. Projektet udvikles af Marco Sampellegrini, forfatter til The Simple Haskell Handbook og udvikler af Quad CI kontinuerligt integrationssystem.

Rust 1.78 frigivet. Borgo-sprog, der kombinerer styrkerne ved Go og Rust

Borgo bruger statisk skrivning, Go-lignende typer og Rust-lignende syntaks. Semikoloner er valgfrit i slutningen af ​​linjer i Borgo-koden. Borgo-koden er kompileret til en Go-repræsentation, der er fuldt ud kompatibel med eksisterende Go-pakker. Compilerkoden er skrevet i Rust og distribueres under ISC-licensen. brug 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.Fail loading =>code.Failed fmt.Sprintf(“Har fejlkode: %d”, kode), NetworkState.Success(res) => res.title, } fmt.Println(msg) }

Kilde: opennet.ru

Tilføj en kommentar