De release van de algemene programmeertaal Rust 1.78, opgericht door het Mozilla-project, maar nu ontwikkeld onder auspiciën van de onafhankelijke non-profitorganisatie Rust Foundation, is gepubliceerd. De taal is gericht op geheugenveiligheid en biedt de middelen om een hoog parallellisme te bereiken bij het uitvoeren van taken, terwijl het gebruik van een garbage collector en runtime wordt vermeden (runtime wordt beperkt tot basisinitialisatie en onderhoud van de standaardbibliotheek).
De geheugenbeheertechnieken van Rust bevrijden de ontwikkelaar van pointermanipulatiefouten en beschermen tegen problemen die voortkomen uit geheugenmanipulatie op laag niveau, zoals after-free toegang, null pointer-dereferenties, bufferoverruns en dergelijke. Om bibliotheken te distribueren, de assemblage te garanderen en afhankelijkheden te beheren, ontwikkelt het project de Cargo-pakketbeheerder. De kratten.io-repository wordt ondersteund voor het hosten van bibliotheken.
Geheugenveiligheid wordt in Rust afgedwongen tijdens het compileren door middel van referentiecontrole, het volgen van objecteigendom, overweging van de levensduur van objecten (scoping) en evaluatie van geheugentoegang tijdens runtime. Rust biedt ook bescherming tegen overflows van gehele getallen, vereist dat variabelewaarden vóór gebruik worden geïnitialiseerd, heeft een betere foutafhandeling in de standaardbibliotheek, gebruikt standaard het concept van onveranderlijke referenties en variabelen en biedt sterke statische typering om logische fouten te minimaliseren.
Belangrijkste innovaties:
- Er is een nieuwe attribuutnaamruimte "#[diagnostic]" voorgesteld, die een manier biedt om de door de compiler geproduceerde foutmeldingen te beïnvloeden. De eerste in de nieuwe ruimte is het kenmerk "#[diagnostic::on_unimplemented]", dat kan worden gebruikt om de foutmeldingen aan te passen die worden gegenereerd in een situatie waarin u een eigenschap moet gebruiken die niet voor het type is geïmplementeerd. #[diagnostic::on_unimplemented( message = "Mijn bericht voor `ImportantTrait<{A}>` is niet geïmplementeerd voor `{Self}`", label = "Mijn label", note = "Opmerking 1", note = "Opmerking 2" )] eigenschap BelangrijkTrait {} fn use_my_trait(_: impl BelangrijkTrait ) {} fn main() { use_my_trait(String::new()); } error[E32]: Mijn bericht voor `ImportantTrait ` is niet geïmplementeerd voor `String` —> src/main.rs:0277:32 | 12 | use_my_trait(String::new()); | ———— ^^^^^^^^^^^^^ Mijn label | | | vereist door een grens geïntroduceerd door deze oproep | = hulp: de eigenschap `Belangrijke eigenschap ` is niet geïmplementeerd voor `String` = opmerking: opmerking 18 = opmerking: opmerking 12
- Controles vooraf die worden toegepast op onveilige functies kunnen nu worden uitgesteld tot het genereren van code, waardoor deze controles kunnen worden uitgevoerd zonder dat de standaardbibliotheek in de modus "#[cfg(debug_assertions)]" hoeft te worden gebouwd. Om controles te activeren, is het nu voldoende om debug-beweringen in te schakelen voor test- of debug-builds van uw code.
- Het gedrag van functies in de standaardbibliotheek die de uitlijning van pointers en segmenten beïnvloeden, is nu tijdens runtime voorspelbaar en afhankelijk van de invoergegevens. De functie pointer::align_offset, die de offset berekent om de pointer uit te lijnen, retourneert nu alleen usize::MAX als de bewerking mislukt. De functies slice::align_to en slice::align_to_mut beide, die segmenten transformeren in een representatie met een uitgelijnde middensegment en de originele begin- en eindsegmenten, retourneren nu altijd het grootste middengedeelte.
- Het volgende is overgebracht naar de stabiele categorie:
- impl Lezen voor &Stdin
- Sta het gebruik van een niet-statische (niet-statische) levensduur toe voor sommige std::error::Error-gerelateerde implementaties.
- Implementatie impl mag de waarde ?Sized gebruiken.
- imp. Van voor io::Fout
- De functie Barrier::new() is gestabiliseerd zodat deze in elke context kan worden gebruikt met het attribuut "const" in plaats van met constanten.
- Voor doelplatforms x86_64-pc-windows-msvc, i686-pc-windows-msvc, x86_64-pc-windows-gnu, i686-pc-windows-gnu, x86_64-pc-windows-gnullvm en i686-pc-windows-gnullvm vereist nu minimaal Windows 10-versie.
- Het derde ondersteuningsniveau is geïmplementeerd voor de platforms wasm32-wasip2, arm64ec-pc-windows-msvc, armv8r-none-eabihf en loongarch64-unknown-linux-musl. Het derde niveau omvat basisondersteuning, maar zonder geautomatiseerd testen, het publiceren van officiële builds of het controleren of de code kan worden gebouwd.
- Het tweede ondersteuningsniveau voor het doelplatform Add wasm32-wasip1 is geïmplementeerd. Het tweede niveau van ondersteuning betreft een montagegarantie.
- Het platform wasm32-wasi-preview1-threads is hernoemd naar wasm32-wasip1-threads.
- De compiler is overgeschakeld naar het gebruik van LLVM 18. Bij gebruik van LLVM 18 voor x86-32- en x86-64-architecturen is de ABI die is gekoppeld aan de typen u128 en i128 gewijzigd.
- In de Cargo Pact Manager is versie 4 van lock-bestanden (lockfile v4) gestabiliseerd.
- Cargo heeft een gestabiliseerde wereldwijde cache met informatie over het laatste datagebruik. De cache wordt gehost in $CARGO_HOME/.global-cache met behulp van SQLite en wordt automatisch bijgewerkt om de laatste wijzigingen in de index, het kratbestand, de codedirectory, git-kloon en git-checkout weer te geven.
Bovendien probeert de programmeertaal Borgo expressiever te zijn dan de Go-taal, maar minder complex dan de Rust-taal. Borgo combineert de beste eigenschappen van Go en Rust en compenseert de tekortkomingen van elke taal. Go is bijvoorbeeld eenvoudig en duidelijk, maar biedt geen geavanceerde veiligheidsvoorzieningen. De Rust-taal biedt hulpmiddelen voor veilig programmeren, maar is te ingewikkeld. Het project wordt ontwikkeld door Marco Sampellegrini, auteur van The Simple Haskell Handbook en ontwikkelaar van het Quad CI continue integratiesysteem.

Borgo gebruikt statisch typen, Go-achtige typen en Rust-achtige syntaxis. Puntkomma's zijn optioneel aan het einde van regels in Borgo-code. Borgo-code wordt gecompileerd in een Go-representatie die volledig compatibel is met bestaande Go-pakketten. De compilercode is geschreven in Rust en wordt gedistribueerd onder de ISC-licentie. gebruik fmt enum NetworkState { Loading, Failed(int), Success(T), } struct Response { titel: string, duur: int, } fn main() { let res = Response { title: “Hallo wereld”, duur: 0, } let state = NetworkState.Success(res) let msg = match status { NetworkState.Loading => “wordt nog steeds geladen”, NetworkState.Failed(code) => fmt.Sprintf(“Kreeg foutcode: %d”, code), NetworkState.Success (res) => res.title, } fmt.Println(msg) }
Bron: opennet.ru
