Utgivningen av Rust 1.78 allmänt programmeringsspråk, grundat av Mozilla-projektet, men nu utvecklat under överinseende av den oberoende ideella organisationen Rust Foundation, har publicerats. Språket fokuserar på minnessäkerhet och ger möjlighet att uppnå hög jobbparallellism samtidigt som man undviker användningen av en skräpsamlare och körtid (körtiden reduceras till grundläggande initiering och underhåll av standardbiblioteket).
Rusts minneshanteringsmetoder räddar utvecklaren från fel vid manipulering av pekare och skyddar mot problem som uppstår på grund av minneshantering på låg nivå, som att komma åt ett minnesområde efter att det har frigjorts, avläsning av nollpekare, buffertöverskridningar, etc. För att distribuera bibliotek, tillhandahålla builds och hantera beroenden utvecklar projektet Cargo package manager. Crates.io-förvaret stöds för värdbibliotek.
Minnessäkerhet tillhandahålls i Rust vid kompilering genom referenskontroll, hålla reda på objektägande, hålla reda på objektlivslängder (scopes) och bedöma riktigheten av minnesåtkomst under kodexekvering. Rust ger också skydd mot heltalsspill, kräver obligatorisk initiering av variabelvärden innan användning, hanterar fel bättre i standardbiblioteket, tillämpar konceptet med oföränderliga referenser och variabler som standard, erbjuder stark statisk typning för att minimera logiska fel.
Huvudsakliga innovationer:
- Ett nytt attributnamnområde "#[diagnostik]" föreslås för att tillhandahålla ett sätt att påverka de felmeddelanden som skapas av kompilatorn. Det första attributet som implementeras i det nya utrymmet är "#[diagnostic::on_unimplemented]", som kan användas för att anpassa felmeddelanden som returneras i situationer där en egenskap måste användas som inte är implementerad för en typ. #[diagnostic::on_unimplemented( meddelande = "Mitt meddelande för `ImportantTrait<{A}>` är inte implementerat för `{Self}`", label = "My Label", note = "Note 1", note = "Note 2" )] egenskap Viktigtdrag {} fn use_my_trait(_: impl ImportantTrait(_: impl ImportantTrait) ) {} fn main() { use_my_trait(String::new()); } error[E32]: Mitt meddelande för `ImportantTrait ` är inte implementerad för `String` —> src/main.rs:0277:32 | 12 | use_my_trait(String::new()); | ———— ^^^^^^^^^^^^^ My Label | | | krävs av en bunden som införs genom denna uppmaning | = hjälp: egenskapen `ImportantTrait ` är inte implementerad för `String` = not: Note 18 = not: Note 12
- Förhandskontroller som tillämpas på osäkra funktioner kan nu skjutas upp till kodgenerering, vilket gör att dessa kontroller kan utföras utan att behöva bygga standardbiblioteket i "#[cfg(debug_assertions)]"-läge. För att utlösa kontroller behöver du nu bara aktivera felsökningspåståenden för test- eller felsökningsbyggen av din kod.
- Beteendet hos funktioner i standardbiblioteket som påverkar pekare- och segmentjustering är nu förutsägbart under körning och beror på indata. Pointer::align_offset-funktionen, som beräknar offset för pekarjustering, returnerar nu usize::MAX endast om operationen inte kan utföras. Slice::align_to och slice::align_to_mut båda funktionerna, som omvandlar skivor till en representation med en justerad mittdel och de ursprungliga start- och slutskivorna, returnerar nu alltid den största mellandelen.
- Följande överfördes till stallkategorin:
- impl Läs för &Stdin
- Tillåt användning av en icke-statisk (icke-statisk) livslängd för vissa std::error::Felrelaterade implementeringar.
- Vid genomförandet av impl Det är tillåtet att använda ?Sized-värdet.
- impl Från för io::Fel
- Funktionen Barrier::new() har stabiliserats för användning med "const"-flaggan i alla sammanhang istället för konstanter.
- x86_64-pc-windows-msvc, i686-pc-windows-msvc, x86_64-pc-windows-gnu, i686-pc-windows-gnu, x86_64-pc-windows-gnullvm och i686-pc-windows-gnu kräver nu minst 10 mål-pc-window för Windows XNUMX.
- Implementerade den tredje nivån av stöd för plattformarna wasm32-wasip2, arm64ec-pc-windows-msvc, armv8r-none-eabihf och loongarch64-unknown-linux-musl. Den tredje nivån innebär grundläggande stöd, men utan automatiserad testning, publicering av officiella versioner och kontroll av möjligheten att bygga kod.
- Den andra nivån av stöd för målplattformen Add wasm32-wasip1 har implementerats. Den andra stödnivån innebär en monteringsgaranti.
- Plattformen wasm32-wasi-preview1-threads har bytt namn till wasm32-wasip1-threads.
- Kompilatorn har bytts till att använda LLVM 18. När LLVM 18 används för x86-32 och x86-64-arkitekturer har ABI associerad med u128- och i128-typerna ändrats.
- I Cargo package manager har version 4 av låsfiler (lockfile v4) stabiliserats.
- I Cargo har den globala cachen med information om den senaste användningen av data stabiliserats. Cachen lagras i $CARGO_HOME/.global-cache-filen med hjälp av SQLite, och uppdateras automatiskt för att återspegla de senaste ändringarna av index, lådafil, kodkatalog, git-klon och git-checkout.
Ett annat anmärkningsvärt programmeringsspråk är Borgo, som försöker vara mer uttrycksfullt än Go men mindre komplext än Rust. Borgo kombinerar de bästa funktionerna i Go and Rust, samtidigt som de fyller i bristerna i varje språk. Till exempel är Go-språket enkelt och okomplicerat, men ger inga avancerade säkerhetsfunktioner. Språket Rust ger möjligheter för säker programmering, men är överkomplicerat. Projektet utvecklas av Marco Sampellegrini, författare till The Simple Haskell Handbook och utvecklare av det kontinuerliga integrationssystemet Quad CI.

Borgo använder statisk typning, Go-liknande typer och Rust-liknande syntax. Att använda semikolon i slutet av rader i Borgo-koden är valfritt. Borgo-koden kompileras till en Go-representation som är helt kompatibel med befintliga Go-paket. Kompilatorkoden är skriven i Rust och distribueras under ISC-licensen. använd 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.F kod: %d", kod), NetworkState.Success(res) => res.title, } fmt.Println(msg) }
Källa: opennet.ru
