Vydání programovacího jazyka Rust 1.75 a unikernel Hermit 0.6.7

Bylo zveřejněno vydání univerzálního programovacího jazyka Rust 1.75, založeného projektem Mozilla, ale nyní vyvíjeného pod záštitou nezávislé neziskové organizace Rust Foundation. Jazyk se soustředí na bezpečnost paměti a poskytuje prostředky k dosažení vysokého paralelismu úloh a zároveň se vyhýbá použití garbage collectoru a runtime (runtime je redukováno na základní inicializaci a údržbu standardní knihovny).

Metody zpracování paměti Rust šetří vývojáře před chybami při manipulaci s ukazateli a chrání před problémy, které vznikají v důsledku nízkoúrovňového zpracování paměti, jako je přístup k oblasti paměti po jejím uvolnění, dereferencování nulových ukazatelů, přetečení vyrovnávací paměti atd. Pro distribuci knihoven, poskytování sestavení a správu závislostí projekt vyvíjí správce balíčků Cargo. Úložiště crates.io je podporováno pro hostování knihoven.

Bezpečnost paměti je v Rustu zajištěna v době kompilace prostřednictvím kontroly referencí, sledování vlastnictví objektů, sledování životnosti objektů (rozsahů) a hodnocení správnosti přístupu do paměti během provádění kódu. Rust také poskytuje 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ě, standardně aplikuje koncept neměnných referencí a proměnných, nabízí silné statické typování pro minimalizaci logických chyb.

Hlavní inovace:

  • Přidána možnost používat „asynchronní fn“ a zápis „->impl Trait“ v soukromých vlastnostech. Například pomocí „->impl Trait“ můžete napsat metodu vlastnosti, která vrací iterátor: trait Container { fn items(&self) -> impl Iterator; } impl Container for MyContainer { fn items(&self) -> impl Iterator { self.items.iter().cloned() } }

    Vlastnosti můžete také vytvořit pomocí "async fn": trait HttpService { async fn fetch(&self, url: Url) -> HtmlBody; // bude rozbaleno na: // fn fetch(&self, url: Url) -> impl Future; }

  • Přidáno API pro výpočet bajtových offsetů vzhledem k ukazatelům. Při práci s holými ukazateli („*const T“ a „*mut T“) mohou být vyžadovány operace pro přidání posunu k ukazateli. Dříve k tomu bylo možné použít konstrukci jako „::add(1)“ s přidáním počtu bajtů odpovídající velikosti „size_of::()“. Nové API zjednodušuje tuto operaci a umožňuje manipulovat s bajtovými offsety bez předchozího přetypování typů na "*const u8" nebo "*mut u8".
    • ukazatel::byte_add
    • ukazatel::byte_offset
    • ukazatel::byte_offset_from
    • ukazatel::byte_sub
    • ukazatel::wrapping_byte_add
    • pointer::wrapping_byte_offset
    • ukazatel::wrapping_byte_sub
  • Pokračující práce na zvýšení výkonu kompilátoru rustc. Přidán optimalizátor BOLT, který běží ve fázi post-link a využívá informace z předem připraveného prováděcího profilu. Použití BOLT vám umožňuje urychlit provádění kompilátoru asi o 2 % změnou rozložení kódu knihovny librustc_driver.so pro efektivnější využití mezipaměti procesoru.

    Zahrnuje sestavení kompilátoru rustc s volbou "-Ccodegen-units=1" pro zlepšení kvality optimalizace v LLVM. Provedené testy ukazují nárůst výkonu v případě sestavení „-Ccodegen-units=1“ přibližně o 1.5 %. Přidané optimalizace jsou ve výchozím nastavení povoleny pouze pro platformu x86_64-unknown-linux-gnu.

    Výše zmíněné optimalizace byly testovány společností Google, aby zkrátily dobu sestavení komponent platformy Android napsaných v Rustu. Použití „-C codegen-units=1“ při sestavování Androidu nám umožnilo zmenšit velikost sady nástrojů o 5.5 % a zvýšit její výkon o 1.8 %, přičemž doba sestavení samotné sady nástrojů se téměř zdvojnásobila.

    Povolení sběru odpadků v době propojení („--gc-sections“) přineslo nárůst výkonu až o 1.9 %, optimalizace v době propojení (LTO) až o 7.7 % a optimalizace na základě profilu (PGO) až o 19.8 %. Ve finále byly použity optimalizace pomocí utility BOLT, která umožnila zvýšení rychlosti sestavení na 24.7 %, ale velikost sady nástrojů se zvýšila o 10.9 %.

    Vydání programovacího jazyka Rust 1.75 a unikernel Hermit 0.6.7

  • Nová část API byla přesunuta do kategorie stabilní, včetně metod a implementací vlastností byly stabilizovány:
    • Atomová*::from_ptr
    • FileTimes
    • FileTimesExt
    • Soubor::set_modified
    • Soubor::set_times
    • IpAddr::to_canonical
    • Ipv6Addr::to_canonical
    • Option::as_slice
    • Option::as_mut_slice
    • ukazatel::byte_add
    • ukazatel::byte_offset
    • ukazatel::byte_offset_from
    • ukazatel::byte_sub
    • ukazatel::wrapping_byte_add
    • pointer::wrapping_byte_offset
    • ukazatel::wrapping_byte_sub
  • Atribut "const", který určuje možnost jeho použití v libovolném kontextu místo konstant, se používá ve funkcích:
    • Ipv6Addr::to_ipv4_mapped
    • MaybeUninit::assume_init_read
    • MaybeUninit::zeroed
    • mem::diskriminační
    • mem::nulováno
  • Třetí úroveň podpory byla implementována pro platformy csky-unknown-linux-gnuabiv2hf, i586-unknown-netbsd a mipsel-unknown-netbsd. Třetí úroveň zahrnuje základní podporu, ale bez automatického testování, publikování oficiálních sestavení nebo kontroly, zda lze kód sestavit.

Kromě toho si můžeme všimnout nové verze projektu Hermit, který vyvíjí specializované jádro (unikernel), napsané v jazyce Rust, poskytující nástroje pro vytváření samostatných aplikací, které mohou běžet nad hypervizorem nebo holým hardwarem bez dalších vrstev. a bez operačního systému. Při sestavení je aplikace staticky propojena s knihovnou, která samostatně implementuje všechny potřebné funkce, aniž by byla vázána na jádro OS a systémové knihovny. Kód projektu je distribuován pod licencemi Apache 2.0 a MIT. Sestavení je podporováno pro samostatné spouštění aplikací napsaných v Rust, Go, Fortran, C a C++. Projekt také vyvíjí svůj vlastní bootloader, který vám umožní spustit Hermit pomocí QEMU a KVM.

Zdroj: opennet.ru

Přidat komentář