Kiadásra került a Mozilla projekt által kezdeményezett Rust 1.78 általános célú programozási nyelv, amelyet most egy független, nonprofit szervezet, a Rust Foundation támogat. A nyelv a memória biztonságos kezelésére összpontosít, és lehetőséget biztosít a feladatok magas fokú párhuzamosságának elérésére, miközben elkerüli a szemétgyűjtő és futásidő használatát (a futásidő alapvető inicializálásra és a standard könyvtár kezelésére korlátozódik).
A Rust memória kezelésének módszerei megszüntetik a fejlesztők hibáit a mutatókkal való manipulálás során, és védelmet nyújtanak az alacsony szintű memória kezelésből adódó problémákkal szemben, mint például a már felszabadított memória területére való hivatkozás, null-pointer dereferálás, pufferméret túllépés stb. A könyvtárak terjesztésére, a build biztosítására és a függőségek kezelésére a Cargo csomagkezelő fejlesztés alatt áll. A könyvtárak elhelyezésére a crates.io tároló támogatott.
A memória biztonságos kezelése a Rustban a fordítási időben történik, a hivatkozások ellenőrzésén, az objektumok tulajdonjogának nyomon követésén, az objektumok élettartamának (láthatóságának) figyelembevételén és a memória hozzáférésének helyességének értékelésén keresztül a kód futtatásakor. A Rust emellett eszközöket biztosít az egész számok túllépésének elleni védelemhez, kötelezővé teszi a változók értékeinek inicializálását használat előtt, jobban kezeli a hibákat a standard könyvtárban, alkalmazza a változatlan (immutable) hivatkozások és változók fogalmát alapértelmezés szerint, és erős statikus típussal minimalizálja a logikai hibákat.
Főbb újítások:
- Új attribútum névtér került bevezetésre, a "#[diagnostic]", amely lehetőséget biztosít a fordító által kibocsátott hibaüzenetek befolyásolására. Az új névtér első megvalósítása a "#[diagnostic::on_unimplemented]" attribútum, amely a hibaüzenetek testreszabására használható olyan esetekben, amikor egy típusosztály, amely nem lett implementálva egy adott típusra. #[diagnostic::on_unimplemented( message = "A(z) `ImportantTrait<{A}>` nem implementált a(z) `{Self}`-nél", label = "Az én címkém", note = "1. megjegyzés", note = "2. megjegyzés" )] trait ImportantTrait<A> {} fn use_my_trait(_: impl ImportantTrait<i32>) {} fn main() { use_my_trait(String::new()); } error[E0277]: A(z) `ImportantTrait<i32>` nem implementált a(z) `String`-nél —> src/main.rs:12:18 | 12 | use_my_trait(String::new()); | ———— ^^^^^^^^^^^^^ Az én címkém | | | az ehhez a híváshoz bevezetett kötelezettség miatt | = help: a trait `ImportantTrait<i32>` nem implementált a(z) `String`-nél = note: 1. megjegyzés = note: 2. megjegyzés.
- Az unsafe függvényekhez alkalmazott előzetes assert ellenőrzések most a kódgenerálás szakaszára halaszthatók, lehetővé téve e ellenőrzések végrehajtását anélkül, hogy a standard könyvtárat '#[cfg(debug_assertions)]' módban kellene összeállítani. Az ellenőrzések mostantól csak a tesztelő vagy hibakereső fordításokhoz szükséges debug assertok engedélyezésével aktiválhatók.
- A standard könyvtár olyan függvényeinek viselkedése, amelyek a mutatók és szeletek (slice) igazítására hatnak, mostantól kiszámítható a futás során, és a bemeneti adatoktól függ. A pointer::align_offset függvény, amely a mutató igazítási eltolódását számolja ki, mostantól csak akkor ad vissza usize::MAX-ot, ha a művelet végrehajtása lehetetlen. A slice::align_to és slice::align_to_mut both függvények, amelyek a szeleteket igazított mintaszeletekké és az eredeti kezdeti és végső szeletekké alakítják, mostantól mindig a legnagyobb mintát adják vissza.
- A stabilitásra átvitt elemek:
- impl Read for &Stdin
- Megengedett a nem statikus (nem ‘static) életciklus használata bizonyos, a std::error::Error-ral kapcsolatos megvalósításokhoz.
- A megvalósítás során impl megengedett a ?Sized érték használata.
- impl From for io::Error
- A Barrier::new() függvény stabilizálva lett a ‘const’ jellemző használatára bármilyen kontextusban a konstansok helyett.
- A célplatformok számára, mint például x86_64-pc-windows-msvc, i686-pc-windows-msvc, x86_64-pc-windows-gnu, i686-pc-windows-gnu, x86_64-pc-windows-gnullvm és i686-pc-windows-gnullvm, most már legalább Windows 10-es verzió szükséges.
- A harmadik szintű támogatás implementálásra került a wasm32-wasip2, arm64ec-pc-windows-msvc, armv8r-none-eabihf és loongarch64-unknown-linux-musl platformok számára. A harmadik szint alapvető támogatást jelent, de automatizált tesztelés, hivatalos build publikálás és a kód buildelhetőségének ellenőrzése nélkül.
- A második szintű támogatás implementálva lett a célplatformhoz, az Add wasm32-wasip1-hez. A második szintű támogatás garantálja a buildelhetőséget.
- A wasm32-wasi-preview1-threads platform átnevezésre került wasm32-wasip1-threads névre.
- A fordító átállt az LLVM 18 használatára. Az LLVM 18 használatakor x86-32 és x86-64 architektúrák esetén megváltozott az ABI, amely az u128 és i128 típusokkal kapcsolatos.
- A Cargo csomagkezelőben stabilizálva lett a 4. verzió a lockfile blokkokhoz.
- A Cargo-ban stabilizálva lett a globális cache, amely a legutóbbi felhasználási adatokat tartalmazza. A cache a $CARGO_HOME/.global-cache fájlban helyezkedik el SQLite segítségével, automatikusan frissül, és tükrözi az utolsó index, crate fájl, kód könyvtár, git clone és git checkout kapcsolatos változásokat.
Továbbá megemlíthetjük a Borgo programozási nyelvet, amely kifejezőbb szeretne lenni, mint a Go nyelv, de kevésbé bonyolult, mint a Rust. A Borgo a Go és Rust legjobb tulajdonságait ötvözi, pótolva minden nyelv hiányosságait. Például a Go nyelv egyszerű és érthető, de nem biztosít fejlett eszközöket a típusokkal való biztonságos munkához. A Rust nyelv eszközöket kínál a biztonságos programozáshoz, de túl bonyolult. A projektet Marco Sampellegrini fejleszti, aki a "The Simple Haskell Handbook" című könyv szerzője és a Quad CI folyamatos integrációs rendszer fejlesztője.

A Borgo statikus típust alkalmaz, amely hasonló a Go nyelvhez, és a szintaxisa hasonlít a Rust-hoz. A Borgo nyelvű kódban a sorok végén található pontosvesszők megadása nem kötelező. A Borgo nyelven írt kód Go nyelvre fordul, amely teljes mértékben kompatibilis a meglévő Go csomagokkal. A fordító kódja Rust nyelven íródott, és ISC licenc alatt érhető el. 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) }
Forrás: opennet.ru
