Den generelle programmeringssprog Rust 1.78 er blevet udgivet. Det blev oprindeligt udviklet af Mozilla, men udvikles nu under vejledning af den uafhængige, non-profit organisation Rust Foundation. Sproget fokuserer på sikker håndtering af hukommelse og tilbyder midler til at opnå høj grad af opgaves parallelisme, uden at bruge en garbage collector og runtime (runtime begrænser sig til grundlæggende initialisering og vedligeholdelse af standardbiblioteket).
Metoder til hukommelsesarbejde i Rust befrier udviklere fra fejl ved manipulation af pekere og beskytter mod problemer, der opstår ved lavniveau håndtering af hukommelse, såsom adgang til hukommelsesområder efter frigivelse, dereferering af nulpekere, buffer-overløb osv. For distribution af biblioteker, byggeprocesser og afhængighedsstyring udvikles pakkehåndteringssystemet Cargo. For opbevaring af biblioteker understøttes repository'et crates.io.
Sikker håndtering af hukommelse sikres i Rust under kompilering ved referencekontrol, sporing af ejerskab af objekter, hensyntagen til livstid af objekter (synlighed) og vurdering af korrekt adgang til hukommelse under kodeudførelse. Rust tilbyder også midler til beskyttelse mod heltals-overløb, kræver obligatorisk initialisering af variabelværdier før brug, håndterer fejl bedre i standardbiblioteket, anvender konceptet med uforanderlige (immutable) referencer og variabler som standard og tilbyder stærk statisk typisering for at minimere logiske fejl.
Hovednyhederne:
- Et nyt navnerum for attributter, «#[diagnostic]», er blevet foreslået. Dette giver muligheder for at påvirke de fejlmeddelelser, som compileren genererer. Den første i det nye navnerum er attributten «#[diagnostic::on_unimplemented]», som kan bruges til at tilpasse fejlmeddelelser i situationer, hvor det kræves at bruge et trait, der ikke er implementeret for en type. #[diagnostic::on_unimplemented( message = «Min besked for `ImportantTrait<{A}>` er ikke implementeret for `{Self}`», label = «Min etiket», 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]: Min besked for `ImportantTrait<i32>` er ikke implementeret for `String` —> src/main.rs:12:18 | 12 | use_my_trait(String::new()); | ———— ^^^^^^^^^^^^^ Min etiket | | | krævet af en betingelse introduceret af dette kald | = hjælp: traitet `ImportantTrait<i32>` er ikke implementeret for `String` = note: Note 1 = note: Note 2
- Forudgående assert-kontroller, der anvendes på unsafe-funktioner, kan nu udsættes til koden generation stadium, hvilket gør det muligt at udføre disse kontroller uden at bygge standardbiblioteket i «#[cfg(debug_assertions)]» tilstand. For at få kontrollerne til at træde i kraft, er det nu nok at aktivere assert-er for test- eller debug-build af ens egen kode.
- Adfærden af funktioner i standardbiblioteket, der påvirker justeringen af pegepinde og skiver (slice), er nu forudsigelig under kørslen og afhænger af inputdataene. Funktionen pointer::align_offset, som beregner forskydningen for justering af en pegepind, returnerer nu usize::MAX kun når operationen ikke kan udføres. Funktionerne slice::align_to og slice::align_to_mut, der begge konverterer skiver til en repræsentation med justering og de oprindelige start- og slut-skiver, returnerer nu altid den største midterste del.
- Det er officielt blevet overført til den stabile version:
- impl Read for &Stdin
- Det er tilladt at bruge ikke-statiske (ikke ‘static) livstider for nogle implementationer relateret til std::error::Error.
- I implementeringen impl er det tilladt at bruge værdien ?Sized.
- impl From for io::Error
- Funktionen Barrier::new() er stabiliseret til brug med konstanter i enhver sammenhæng.
- For målplatformene 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-gnullvm kræves nu minimum version Windows 10.
- Den tredje supportniveau for plattformer wasm32-wasip2, arm64ec-pc-windows-msvc, armv8r-none-eabihf og loongarch64-unknown-linux-musl er implementeret. Det tredje niveau indebærer grundlæggende support, men uden automatiseret testning, offentliggørelse af officielle builds og kontrol med muligheden for at bygge koden.
- Det andet supportniveau for målen wasm32-wasip1 er implementeret. Det andet niveau indebærer garantien for bygning.
- Platformen wasm32-wasi-preview1-threads er omdøbt til wasm32-wasip1-threads.
- Compileren er overført til at bruge LLVM 18. Ved brug af LLVM 18 for arkitekturerne x86-32 og x86-64 er ABI relateret til typerne u128 og i128 ændret.
- I pakkehåndtereren Cargo er version 4 af låsefilen (lockfile v4) stabiliseret.
- Cargo har stabiliseret en global cache med oplysninger om de seneste anvendelser. Cachen placeres i filen $CARGO_HOME/.global-cache ved hjælp af SQLite, opdateres automatisk og afspejler de seneste ændringer relateret til indekset, crate-filen, kodekataloget, git clone og git checkout.
Desuden kan programmeringssproget Borgo nævnes, som forsøger at være mere udtryksfuldt end Go, men mindre komplekst end Rust. Borgo kombinerer de bedste træk fra Go og Rust, og udbedrer manglerne ved hvert af sprog. For eksempel er Go simpelt og forståeligt, men giver ikke omfattende værktøjer til type-sikkerhed. Rust giver værktøjer til sikker programmering, men er overkompliceret. Projektet drives af Marco Sampellegrini, forfatteren af "The Simple Haskell Handbook" og udvikleren af det kontinuerlige integrationssystem Quad CI.

I Borgo anvendes statisk typisering, med typer der minder om Go og en syntaks der ligner Rust. Det er ikke obligatorisk at angive semikolon ved slutningen af linjerne i Borgo-kode. Kode skrevet i Borgo kompileres til Go-sprog, som er fuldt kompatibelt med eksisterende pakker til Go. Kompilatoren er skrevet i Rust og distribueres under ISC-licens. 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) }
Kilde: opennet.ru
