Vydanie programovacieho jazyka Rust 1.75 a unikernel Hermit 0.6.7

Bol vydaný univerzálny programovací jazyk Rust 1.75, založený projektom Mozilla, ale teraz vyvinutý pod záštitou nezávislej neziskovej organizácie Rust Foundation. Jazyk sa zameriava na bezpečnosť pamäte a poskytuje prostriedky na dosiahnutie vysokej paralelnosti úloh, pričom sa vyhýba používaniu zberača odpadu a runtime (beh je zredukovaný na základnú inicializáciu a údržbu štandardnej knižnice).

Metódy spracovania pamäte Rustu chránia vývojára pred chybami pri manipulácii s ukazovateľmi a chránia pred problémami, ktoré vznikajú v dôsledku nízkoúrovňového spracovania pamäte, ako je prístup k oblasti pamäte po jej uvoľnení, dereferencovanie nulových ukazovateľov, pretečenie vyrovnávacej pamäte atď. Na distribúciu knižníc, poskytovanie zostáv a správu závislostí projekt vyvíja správcu balíkov Cargo. Úložisko crates.io je podporované pre hosťovanie knižníc.

Bezpečnosť pamäte je v Rust zabezpečená v čase kompilácie prostredníctvom kontroly referencií, sledovania vlastníctva objektu, sledovania životnosti objektov (rozsahov) a hodnotenia správnosti prístupu do pamäte počas vykonávania kódu. Rust tiež poskytuje ochranu proti pretečeniu celých čísel, vyžaduje povinnú inicializáciu hodnôt premenných pred použitím, lepšie zvláda chyby v štandardnej knižnici, štandardne aplikuje koncept nemenných referencií a premenných, ponúka silné statické typovanie na minimalizáciu logických chýb.

Hlavné inovácie:

  • Pridaná možnosť používať „async fn“ a zápis „->impl Trait“ v súkromných vlastnostiach. Napríklad pomocou „->impl Trait“ môžete napísať metódu vlastnosti, ktorá vráti iterátor: trait Container { fn items(&self) -> impl Iterator; } impl kontajner pre MyContainer { fn items(&self) -> impl Iterator { self.items.iter().cloned() } }

    Môžete tiež vytvoriť vlastnosti pomocou "async fn": trait HttpService { async fn fetch(&self, url: Url) -> HtmlBody; // sa rozbalí na: // fn fetch(&self, url: Url) -> impl Future; }

  • Pridané API na výpočet bajtových posunov vzhľadom na ukazovatele. Pri práci s holými ukazovateľmi („*const T“ a „*mut T“) môžu byť potrebné operácie na pridanie posunu k ukazovateľu. Predtým na to bolo možné použiť konštrukciu ako „::add(1)“, pričom sa pridáva počet bajtov zodpovedajúci veľkosti „size_of::()“. Nové API zjednodušuje túto operáciu a umožňuje manipulovať s bajtovými offsetmi bez predchádzajúceho pretypovania typov na "*const u8" alebo "*mut u8".
    • ukazovateľ::byte_add
    • pointer::byte_offset
    • pointer::byte_offset_from
    • ukazovateľ::byte_sub
    • pointer::wrapping_byte_add
    • pointer::wrapping_byte_offset
    • pointer::wrapping_byte_sub
  • Pokračujúca práca na zvýšení výkonu kompilátora rustc. Pridaný optimalizátor BOLT, ktorý beží vo fáze post-link a využíva informácie z vopred pripraveného profilu vykonávania. Použitie BOLT vám umožňuje zrýchliť vykonávanie kompilátora o približne 2 % zmenou rozloženia kódu knižnice librustc_driver.so pre efektívnejšie využitie vyrovnávacej pamäte procesora.

    Zahrnuté vytvorenie kompilátora rustc s možnosťou "-Ccodegen-units=1" na zlepšenie kvality optimalizácie v LLVM. Vykonané testy ukazujú zvýšenie výkonu v prípade zostavy „-Ccodegen-units=1“ približne o 1.5 %. Pridané optimalizácie sú štandardne povolené iba pre platformu x86_64-unknown-linux-gnu.

    Vyššie uvedené optimalizácie boli testované spoločnosťou Google, aby sa skrátil čas zostavenia komponentov platformy Android napísaných v jazyku Rust. Použitie „-C codegen-units=1“ pri zostavovaní systému Android nám umožnilo zmenšiť veľkosť súpravy nástrojov o 5.5 % a zvýšiť jej výkon o 1.8 %, pričom čas zostavenia samotnej súpravy nástrojov sa takmer zdvojnásobil.

    Povolenie zberu odpadu v čase prepojenia („--gc-sections“) prinieslo zvýšenie výkonu až o 1.9 %, umožnenie optimalizácie v čase prepojenia (LTO) až o 7.7 % a optimalizácie na základe profilu (PGO) až o 19.8 %. Vo finále boli aplikované optimalizácie pomocou utility BOLT, ktorá umožnila zvýšiť rýchlosť zostavovania na 24.7 %, ale veľkosť sady nástrojov sa zvýšila o 10.9 %.

    Vydanie programovacieho jazyka Rust 1.75 a unikernel Hermit 0.6.7

  • Nová časť API bola presunutá do kategórie stabilných, vrátane metód a implementácií vlastností boli stabilizované:
    • Atomic*::from_ptr
    • FileTimes
    • FileTimesExt
    • Súbor::set_modified
    • Súbor::set_times
    • IpAddr::to_canonical
    • Ipv6Addr::to_canonical
    • Option::as_slice
    • Option::as_mut_slice
    • ukazovateľ::byte_add
    • pointer::byte_offset
    • pointer::byte_offset_from
    • ukazovateľ::byte_sub
    • pointer::wrapping_byte_add
    • pointer::wrapping_byte_offset
    • pointer::wrapping_byte_sub
  • Atribút „const“, ktorý určuje možnosť jeho použitia v akomkoľvek kontexte namiesto konštánt, sa používa vo funkciách:
    • Ipv6Addr::to_ipv4_mapped
    • MaybeUninit::assume_init_read
    • MaybeUninit::zeroed
    • mem::diskriminačný
    • mem::nulované
  • Tretia úroveň podpory bola implementovaná pre platformy csky-unknown-linux-gnuabiv2hf, i586-unknown-netbsd a mipsel-unknown-netbsd. Tretia úroveň zahŕňa základnú podporu, ale bez automatického testovania, zverejňovania oficiálnych verzií alebo kontroly, či je možné kód zostaviť.

Okrem toho si môžeme všimnúť novú verziu projektu Hermit, ktorý vyvíja špecializované jadro (unikernel), napísané v jazyku Rust, poskytujúce nástroje na vytváranie samostatných aplikácií, ktoré môžu bežať nad hypervízorom alebo holým hardvérom bez ďalších vrstiev. a bez operačného systému. Aplikácia je pri zostavení staticky prepojená s knižnicou, ktorá samostatne implementuje všetky potrebné funkcionality bez toho, aby bola viazaná na jadro OS a systémové knižnice. Kód projektu je distribuovaný pod licenciami Apache 2.0 a MIT. Zostava je podporovaná pre samostatné spúšťanie aplikácií napísaných v Rust, Go, Fortran, C a C++. Projekt tiež vyvíja svoj vlastný bootloader, ktorý vám umožní spustiť Hermit pomocou QEMU a KVM.

Zdroj: opennet.ru

Pridať komentár