Byl zveřejněn vydání programovacího jazyka Rust 1.78, původně vyvinutého projektem Mozilla, nyní rozvíjeného pod záštitou nezávislé neziskové organizace Rust Foundation. Jazyk se soustředí na bezpečné práce s pamětí a poskytuje prostředky k dosažení vysokého paralelismu provádění úkolů, přičemž se obejde bez použití garbage collectoru a runtime (runtime se omezuje na základní inicializaci a údržbu standardní knihovny).
Metody práce s pamětí v Rustu zbavují vývojáře chyb při manipulaci s ukazateli a chrání před problémy, které vznikají z nízkoúrovňové manipulace s pamětí, jako je přístup k oblasti paměti po jejím uvolnění, dereferencování nulových ukazatelů, přetečení bufferu atd. Pro distribuci knihoven, zajištění sestavení a správu závislostí se vyvíjí balíčkový manažer Cargo. Pro hostování knihoven je k dispozici repozitář crates.io.
Bezpečné manipulace s pamětí jsou v Rustu zajištěny během kompilace prostřednictvím kontroly referencí, sledování vlastnictví objektů, zohlednění doby života objektů (viditelnosti) a hodnocení správnosti přístupu k paměti při vykonávání kódu. Rust také poskytuje prostředky pro ochranu proti přetečení celých čísel, vyžaduje povinnou inicializaci hodnot proměnných před použitím, lépe zpracovává chyby ve standardní knihovně, aplikuje koncept neměnnosti (immutable) referencí a proměnných ve výchozím nastavení a nabízí silnou statickou typizaci pro minimalizaci logických chyb.
Hlavní novinky:
- Byl navržen nový prostor názvů atributů „#[diagnostic]“, který poskytuje prostředky pro ovlivnění zpráv o chybách generovaných kompilátorem. Prvním atributem v tomto novém prostoru je „#[diagnostic::on_unimplemented]“, který lze použít k úpravě chybových zpráv, které se vystavují ve situacích, kdy je vyžadováno použití traitu, který není pro daný typ implementován. #[diagnostic::on_unimplemented( message = „Moje zpráva pro `ImportantTrait<{A}>` není implementována pro `{Self}`“, label = „Moje označení“, note = „Poznámka 1“, note = „Poznámka 2“ )] trait ImportantTrait<A> {} fn use_my_trait(_: impl ImportantTrait<i32>) {} fn main() { use_my_trait(String::new()); } error[E0277]: Moje zpráva pro `ImportantTrait<i32>` není implementována pro `String` —> src/main.rs:12:18 | 12 | use_my_trait(String::new()); | ———— ^^^^^^^^^^^^^ Moje označení | | | vyžaduje se podle omezení zavedeného tímto voláním | = help: trait `ImportantTrait<i32>` není implementován pro `String` = note: Poznámka 1 = note: Poznámka 2
- Předběžné assert-kontrola, aplikované na unsafe-funkce, nyní mohou být odloženy až do fáze generování kódu, což umožňuje vykonávat tyto kontroly bez nutnosti sestavit standardní knihovnu v režimu „#[cfg(debug_assertions)]“. Pro vyvolání kontrol je nyní dostatečné povolit ladicí assert-y pro testovací nebo ladicí sestavení vašeho kódu.
- Chování funkcí ve standardní knihovně, které ovlivňují zarovnání ukazatelů a slice, je nyní predikovatelné během běhu a závisí na vstupních údajích. Funkce pointer::align_offset, která vypočítává posun pro zarovnání ukazatele, nyní vrací usize::MAX pouze v případě, že není možné provést operaci. Funkce slice::align_to a slice::align_to_mut, které transformují slice na reprezentaci se zarovnaným středním slice a původními počátečním a koncovým slice, nyní vždy vracejí největší střední část.
- Do kategorie stabilních byla převedena:
- impl Read for &Stdin
- Povolené je použití nestatického (ne 'static) času životnosti pro některé implementace spojené s std::error::Error.
- V implementaci impl je povoleno použití hodnoty ?Sized.
- impl From for io::Error
- Funkce Barrier::new() byla stabilizována pro použití s flagem 'const' v jakémkoli kontextu místo konstant.
- Pro cílové platformy x86_64-pc-windows-msvc, i686-pc-windows-msvc, x86_64-pc-windows-gnu, i686-pc-windows-gnu, x86_64-pc-windows-gnullvm a i686-pc-windows-gnullvm je nyní nezbytná minimálně verze Windows 10.
- Byla implementována třetí úroveň podpory pro platformy wasm32-wasip2, arm64ec-pc-windows-msvc, armv8r-none-eabihf a loongarch64-unknown-linux-musl. Třetí úroveň zahrnuje základní podporu, ale bez automatizovaného testování, publikování oficiálních sestavení a ověřování možnosti sestavení kódu.
- Byla zavedena druhá úroveň podpory pro cílovou platformu Add wasm32-wasip1. Druhá úroveň podpory zaručuje možnost sestavení.
- Platforma wasm32-wasi-preview1-threads byla přejmenována na wasm32-wasip1-threads.
- Kompilátor byl převeden na používání LLVM 18. Při použití LLVM 18 pro architektury x86-32 a x86-64 byl změněn ABI související s typy u128 a i128.
- V balíčkovém správci Cargo byla stabilizována 4. verze blokovacích souborů (lockfile v4).
- V Cargo byla stabilizována globální cache s informacemi o posledním použití dat. Cache je umístěna v souboru $CARGO_HOME/.global-cache pomocí SQLite, automaticky se aktualizuje a odráží poslední změny související s indexem, crate souborem, adresářem s kódem, git clone a git checkout.
Dále lze zmínit programovací jazyk Borgo, který se snaží být výstižnější než jazyk Go, ale méně složitý než jazyk Rust. Borgo kombinuje nejlepší vlastnosti Go a Rust, čímž doplňuje nedostatky každého jazyka. Například jazyk Go je jednoduchý a srozumitelný, ale nenabízí pokročilé prostředky na zajištění bezpečnosti při práci s typy. Jazyk Rust poskytuje prostředky pro bezpečné programování, ale je příliš složitý. Projekt vyvíjí Marco Sampellegrini, autor knihy 'The Simple Haskell Handbook' a vývojář systému kontinuální integrace Quad CI.

V Borgo se používá statické typování, typy analogické jazyku Go a syntaxe podobná Rustu. Uvedení středníků na konci řádků v kódu v Borgu není povinné. Kód v jazyce Borgo se kompiluje do podoby jazyka Go, který je plně kompatibilní s existujícími balíčky pro jazyk Go. Kód kompilátoru je napsán v jazyce Rust a je distribuován pod licencí ISC. use fmt enum NetworkState { Loading, Failed(int), Success(T), } struct Response { title: string, duration: int, } fn main() { let res = Response { title: "Ahoj světe", duration: 0, } let state = NetworkState.Success(res) let msg = match state { NetworkState.Loading => "stále se načítá", NetworkState.Failed(code) => fmt.Sprintf("Dostal jsem chybový kód: %d", code), NetworkState.Success(res) => res.title, } fmt.Println(msg) }
Zdroj: opennet.ru
