ืฉื—ืจื•ืจ ืฉืคืช ื”ืชื›ื ื•ืช Rust 1.75 ื•- unikernel Hermit 0.6.7

ืคืจืกื•ื ืฉืคืช ื”ืชื›ื ื•ืช ืœืžื˜ืจื•ืช ื›ืœืœื™ื•ืช Rust 1.75, ืฉื ื•ืกื“ื” ืขืœ ื™ื“ื™ ืคืจื•ื™ืงื˜ ืžื•ื–ื™ืœื”, ืืš ืคื•ืชื—ื” ื›ืขืช ื‘ื—ืกื•ืช ื”ืขืžื•ืชื” ื”ืขืฆืžืื™ืช Rust Foundation. ื”ืฉืคื” ืžืชืžืงื“ืช ื‘ื‘ื˜ื™ื—ื•ืช ื–ื™ื›ืจื•ืŸ ื•ืžืกืคืงืช ืืช ื”ืืžืฆืขื™ื ืœื”ืฉื’ืช ืžืงื‘ื™ืœื™ื•ืช ืขื‘ื•ื“ื” ื’ื‘ื•ื”ื” ืชื•ืš ื”ื™ืžื ืขื•ืช ืžืฉื™ืžื•ืฉ ื‘ืืกืคืŸ ืืฉืคื” ื•ื–ืžืŸ ืจื™ืฆื” (ื–ืžืŸ ื”ืจื™ืฆื” ืžืฆื˜ืžืฆื ืœืืชื—ื•ืœ ื•ืชื—ื–ื•ืงื” ื‘ืกื™ืกื™ื™ื ืฉืœ ื”ืกืคืจื™ื™ื” ื”ืกื˜ื ื“ืจื˜ื™ืช).

ืฉื™ื˜ื•ืช ื”ื˜ื™ืคื•ืœ ื‘ื–ื™ื›ืจื•ืŸ ืฉืœ Rust ื—ื•ืกื›ื•ืช ืžื”ืžืคืชื— ืฉื’ื™ืื•ืช ื‘ืขืช ืžื ื™ืคื•ืœืฆื™ื” ืฉืœ ืžืฆื‘ื™ืขื™ื ื•ืžื’ื™ื ื•ืช ืžืคื ื™ ื‘ืขื™ื•ืช ื”ืžืชืขื•ืจืจื•ืช ืขืงื‘ ื˜ื™ืคื•ืœ ื‘ื–ื™ื›ืจื•ืŸ ื‘ืจืžื” ื ืžื•ื›ื”, ื›ื’ื•ืŸ ื’ื™ืฉื” ืœืื–ื•ืจ ื–ื™ื›ืจื•ืŸ ืœืื—ืจ ืฉื—ืจื•ืจื•, ื–ื™ื”ื•ื™ ืžืฆื‘ื™ืขื™ null, ื—ืจื™ื’ื•ืช ืžืื’ืจ ื•ื›ื•'. ื›ื“ื™ ืœื”ืคื™ืฅ ืกืคืจื™ื•ืช, ืœืกืคืง ื‘ื ื™ื™ื” ื•ืœื ื”ืœ ืชืœื•ืช, ื”ืคืจื•ื™ืงื˜ ืžืคืชื— ืืช ืžื ื”ืœ ื”ื—ื‘ื™ืœื•ืช Cargo. ืžืื’ืจ crates.io ื ืชืžืš ืœืื™ืจื•ื— ืกืคืจื™ื•ืช.

ื‘ื˜ื™ื—ื•ืช ื–ื™ื›ืจื•ืŸ ืžืกื•ืคืงืช ื‘-Rust ื‘ื–ืžืŸ ื”ืงื•ืžืคื™ืœืฆื™ื” ื‘ืืžืฆืขื•ืช ื‘ื“ื™ืงืช ื”ืคื ื™ื•ืช, ืžืขืงื‘ ืื—ืจ ื‘ืขืœื•ืช ืขืœ ืื•ื‘ื™ื™ืงื˜, ืžืขืงื‘ ืื—ืจ ืžืฉืš ื—ื™ื™ื ืฉืœ ืื•ื‘ื™ื™ืงื˜ (ืกืงื•ืคื™ื), ื•ื”ืขืจื›ืช ื ื›ื•ื ื•ืช ื”ื’ื™ืฉื” ืœื–ื™ื›ืจื•ืŸ ื‘ืžื”ืœืš ื‘ื™ืฆื•ืข ืงื•ื“. Rust ืžืกืคืงืช ื’ื ื”ื’ื ื” ืžืคื ื™ ื”ืฆืคืช ืžืกืคืจื™ื ืฉืœืžื™ื, ื“ื•ืจืฉืช ืืชื—ื•ืœ ื—ื•ื‘ื” ืฉืœ ืขืจื›ื™ ืžืฉืชื ื™ื ืœืคื ื™ ื”ืฉื™ืžื•ืฉ, ืžื˜ืคืœืช ื‘ืฉื’ื™ืื•ืช ื˜ื•ื‘ ื™ื•ืชืจ ื‘ืกืคืจื™ื™ื” ื”ืกื˜ื ื“ืจื˜ื™ืช, ืžื™ื™ืฉืžืช ืืช ื”ืจืขื™ื•ืŸ ืฉืœ ื”ืคื ื™ื•ืช ื•ืžืฉืชื ื™ื ื‘ืœืชื™ ื ื™ืชื ื™ื ืœืฉื™ื ื•ื™ ื›ื‘ืจื™ืจืช ืžื—ื“ืœ, ืžืฆื™ืขื” ื”ืงืœื“ื” ืกื˜ื˜ื™ืช ื—ื–ืงื” ื›ื“ื™ ืœืžื–ืขืจ ืฉื’ื™ืื•ืช ืœื•ื’ื™ื•ืช.

ื—ื™ื“ื•ืฉื™ื ืขื™ืงืจื™ื™ื:

  • ื ื•ืกืคื” ืืช ื”ื™ื›ื•ืœืช ืœื”ืฉืชืžืฉ ื‘-"async fn" ื•ื‘ืกื™ืžื•ืŸ "->impl Trait" ื‘ืชื›ื•ื ื•ืช ืคืจื˜ื™ื•ืช. ืœื“ื•ื’ืžื”, ื‘ืืžืฆืขื•ืช "->impl Trait" ื ื™ืชืŸ ืœื›ืชื•ื‘ ืฉื™ื˜ืช ืชื›ื•ื ื” ืฉืžื—ื–ื™ืจื” ืื™ื˜ืจื˜ื•ืจ: trait Container { fn items(&self) -> impl Iterator; } impl Container for MyContainer { fn items(&self) -> impl Iterator { self.items.iter().cloned() } }

    ืืชื” ื™ื›ื•ืœ ื’ื ืœื™ืฆื•ืจ ืชื›ื•ื ื•ืช ื‘ืืžืฆืขื•ืช "async fn": trait HttpService { async fn fetch(&self, url: Url) -> HtmlBody; // ื™ื•ืจื—ื‘ ืœ: // fn fetch(&self, url: Url) -> impl Future; }

  • ื ื•ืกืฃ API ืœื—ื™ืฉื•ื‘ ืงื™ื–ื•ื– ื‘ืชื™ื ื‘ื™ื—ืก ืœืžืฆื‘ื™ืขื™ื. ื›ืืฉืจ ืขื•ื‘ื“ื™ื ืขื ืžืฆื‘ื™ืขื™ื ื—ืฉื•ืคื™ื ("*const T" ื•-"*mut T"), ื™ื™ืชื›ืŸ ืฉื™ื™ื“ืจืฉื• ืคืขื•ืœื•ืช ืœื”ื•ืกืคืช ื”ื™ืกื˜ ืœืžืฆื‘ื™ืข. ื‘ืขื‘ืจ, ืœืฉื ื›ืš ื ื™ืชืŸ ื”ื™ื” ืœื”ืฉืชืžืฉ ื‘ื‘ื ื™ื™ื” ื›ืžื• "::add(1)", ื”ื•ืกืคืช ืžืกืคืจ ื”ื‘ืชื™ื ื”ืžืชืื™ื ืœื’ื•ื“ืœ "size_of::()". ื”-API ื”ื—ื“ืฉ ืžืคืฉื˜ ืืช ื”ืคืขื•ืœื” ื”ื–ื• ื•ืžืืคืฉืจ ืœืชืคืขืœ ืงื™ื–ื•ื– ื‘ืชื™ื ืžื‘ืœื™ ืœื”ื˜ื™ืœ ืชื—ื™ืœื” ืืช ื”ื˜ื™ืคื•ืกื™ื ืœ-"*const u8" ืื• "*mut u8".
    • pointer::byte_add
    • pointer::byte_offset
    • pointer::byte_offset_from
    • pointer::byte_sub
    • pointer::wrapping_byte_add
    • pointer::wrapping_byte_offset
    • pointer::wrapping_byte_sub
  • ื”ืžืฉืš ืขื‘ื•ื“ื” ืœื”ื’ื‘ืจืช ื”ื‘ื™ืฆื•ืขื™ื ืฉืœ ืžื”ื“ืจ rustc. ื”ื•ืกื™ืฃ ืืช ื”-BOLT Optimizer, ืฉืคื•ืขืœ ื‘ืฉืœื‘ ืฉืœืื—ืจ ื”ืงื™ืฉื•ืจ ื•ืžืฉืชืžืฉ ื‘ืžื™ื“ืข ืžืคืจื•ืคื™ืœ ื‘ื™ืฆื•ืข ืฉื”ื•ื›ืŸ ืžืจืืฉ. ืฉื™ืžื•ืฉ ื‘-BOLT ืžืืคืฉืจ ืœื”ืื™ืฅ ืืช ื‘ื™ืฆื•ืข ื”ืžื”ื“ืจ ื‘ื›-2% ืขืœ ื™ื“ื™ ืฉื™ื ื•ื™ ื”ืคืจื™ืกื” ืฉืœ ืงื•ื“ ื”ืกืคืจื™ื™ื” librustc_driver.so ืœืฉื™ืžื•ืฉ ื™ืขื™ืœ ื™ื•ืชืจ ื‘ืžื˜ืžื•ืŸ ื”ืžืขื‘ื“.

    ื›ืœืœ ื‘ื ื™ื™ืช ืžื”ื“ืจ rustc ืขื ืืคืฉืจื•ืช "-Ccodegen-units=1" ืœืฉื™ืคื•ืจ ืื™ื›ื•ืช ื”ืื•ืคื˜ื™ืžื™ื–ืฆื™ื” ื‘-LLVM. ื”ื‘ื“ื™ืงื•ืช ืฉื‘ื•ืฆืขื• ืžืจืื•ืช ืขืœื™ื™ื” ื‘ื‘ื™ืฆื•ืขื™ื ื‘ืžืงืจื” ืฉืœ ื”ืžื‘ื ื” "-Ccodegen-units=1" ื‘ื›-1.5%. ื”ืื•ืคื˜ื™ืžื™ื–ืฆื™ื•ืช ืฉื ื•ืกืคื• ืžื•ืคืขืœื•ืช ื›ื‘ืจื™ืจืช ืžื—ื“ืœ ืจืง ืขื‘ื•ืจ ืคืœื˜ืคื•ืจืžืช x86_64-unknown-linux-gnu.

    ื”ืื•ืคื˜ื™ืžื™ื–ืฆื™ื•ืช ืฉื”ื•ื–ื›ืจื• ืงื•ื“ื ื ื‘ื“ืงื• ืขืœ ื™ื“ื™ ื’ื•ื’ืœ ื›ื“ื™ ืœื”ืคื—ื™ืช ืืช ื–ืžืŸ ื”ื‘ื ื™ื™ื” ืฉืœ ืจื›ื™ื‘ื™ ืคืœื˜ืคื•ืจืžืช ืื ื“ืจื•ืื™ื“ ืฉื ื›ืชื‘ื• ื‘- Rust. ืฉื™ืžื•ืฉ ื‘-"-C codegen-units=1" ื‘ืขืช ื‘ื ื™ื™ืช ืื ื“ืจื•ืื™ื“ ืืคืฉืจ ืœื ื• ืœื”ืงื˜ื™ืŸ ืืช ื’ื•ื“ืœ ืขืจื›ืช ื”ื›ืœื™ื ื‘-5.5% ื•ืœื”ื’ื“ื™ืœ ืืช ื”ื‘ื™ืฆื•ืขื™ื ืฉืœื• ื‘-1.8%, ื‘ืขื•ื“ ืฉื–ืžืŸ ื”ื‘ื ื™ื™ื” ืฉืœ ืขืจื›ืช ื”ื›ืœื™ื ืขืฆืžื• ื›ืžืขื˜ ื”ื•ื›ืคืœ.

    ื”ืคืขืœืช ืื™ืกื•ืฃ ืืฉืคื” ื‘ื–ืžืŸ ืงื™ืฉื•ืจ ("--gc-sections") ื”ื‘ื™ืื” ืืช ื”ืฉื™ืคื•ืจ ื‘ื‘ื™ืฆื•ืขื™ื ืœ-1.9%, ื”ืคืขืœืช ืื•ืคื˜ื™ืžื™ื–ืฆื™ื” ืฉืœ ื–ืžืŸ ืงื™ืฉื•ืจ (LTO) ืขื“ 7.7%, ื•ืื•ืคื˜ื™ืžื™ื–ืฆื™ื•ืช ืžื‘ื•ืกืกื•ืช ืคืจื•ืคื™ืœ (PGO) ืขื“ 19.8%. ื‘ื’ืžืจ ื”ื•ื—ืœื• ืื•ืคื˜ื™ืžื™ื–ืฆื™ื•ืช ื‘ืืžืฆืขื•ืช ื›ืœื™ ื”ืฉื™ืจื•ืช BOLT, ืฉืืคืฉืจื• ืœื”ื’ื“ื™ืœ ืืช ืžื”ื™ืจื•ืช ื”ื‘ื ื™ื™ื” ืœ-24.7%, ืืš ื’ื•ื“ืœ ืขืจื›ืช ื”ื›ืœื™ื ื’ื“ืœ ื‘-10.9%.

    ืฉื—ืจื•ืจ ืฉืคืช ื”ืชื›ื ื•ืช Rust 1.75 ื•- unikernel Hermit 0.6.7

  • ื—ืœืง ื—ื“ืฉ ืฉืœ ื”-API ื”ื•ืขื‘ืจ ืœืงื˜ื’ื•ืจื™ื” ืฉืœ ื™ืฆื™ื‘, ื›ื•ืœืœ ื”ืฉื™ื˜ื•ืช ื•ื”ื™ื™ืฉื•ื ืฉืœ ืชื›ื•ื ื•ืช ื”ืชื™ื™ืฆื‘ื•:
    • ืื˜ื•ืžื™*::from_ptr
    • FileTimes
    • FileTimesExt
    • File::set_modified
    • ืงื•ื‘ืฅ::set_times
    • IpAddr::to_canonical
    • Ipv6Addr::to_canonical
    • Option::as_slice
    • Option::as_mut_slice
    • pointer::byte_add
    • pointer::byte_offset
    • pointer::byte_offset_from
    • pointer::byte_sub
    • pointer::wrapping_byte_add
    • pointer::wrapping_byte_offset
    • pointer::wrapping_byte_sub
  • ื”ืชื›ื•ื ื” "const", ื”ืงื•ื‘ืขืช ืืช ื”ืืคืฉืจื•ืช ืœื”ืฉืชืžืฉ ื‘ื” ื‘ื›ืœ ื”ืงืฉืจ ื‘ืžืงื•ื ื‘ืงื‘ื•ืขื™ื, ืžืฉืžืฉืช ื‘ืคื•ื ืงืฆื™ื•ืช:
    • Ipv6Addr::to_ipv4_mapped
    • MaybeUninit::assume_init_read
    • MaybeUninit::ืืคืก
    • mem::discriminant
    • mem::ืืคืก
  • ืจืžืช ื”ืชืžื™ื›ื” ื”ืฉืœื™ืฉื™ืช ื™ื•ืฉืžื” ืขื‘ื•ืจ ื”ืคืœื˜ืคื•ืจืžื•ืช csky-unknown-linux-gnuabiv2hf, i586-unknown-netbsd ื•-mipsel-unknown-netbsd. ื”ืจืžื” ื”ืฉืœื™ืฉื™ืช ื›ื•ืœืœืช ืชืžื™ื›ื” ื‘ืกื™ืกื™ืช, ืืš ืœืœื ื‘ื“ื™ืงื•ืช ืื•ื˜ื•ืžื˜ื™ื•ืช, ืคืจืกื•ื ื‘ื•ื ื™ื ืจืฉืžื™ื™ื ืื• ื‘ื“ื™ืงื” ืื ื ื™ืชืŸ ืœื‘ื ื•ืช ืืช ื”ืงื•ื“.

ื‘ื ื•ืกืฃ, ืื ื• ื™ื›ื•ืœื™ื ืœืฆื™ื™ืŸ ื’ืจืกื” ื—ื“ืฉื” ืฉืœ ืคืจื•ื™ืงื˜ ื”-Hermit, ืืฉืจ ืžืคืชื—ืช ืœื™ื‘ื” (unikernel) ืžื™ื•ื—ื“ืช, ื”ื›ืชื•ื‘ื” ื‘ืฉืคืช Rust, ื”ืžืกืคืงืช ื›ืœื™ื ืœื‘ื ื™ื™ืช ื™ื™ืฉื•ืžื™ื ืขืฆืžืื™ื™ื ืฉื™ื›ื•ืœื™ื ืœืคืขื•ืœ ืขืœ ื’ื‘ื™ Hypervisor ืื• ื—ื•ืžืจื” ื—ืฉื•ืคื” ืœืœื ืฉื›ื‘ื•ืช ื ื•ืกืคื•ืช. ื•ืœืœื ืžืขืจื›ืช ื”ืคืขืœื”. ื›ืฉื”ืืคืœื™ืงืฆื™ื” ื‘ื ื•ื™ื”, ื”ืืคืœื™ืงืฆื™ื” ืžืงื•ืฉืจืช ืกื˜ื˜ื™ืช ืœืกืคืจื™ื™ื”, ื”ืžื™ื™ืฉืžืช ื‘ืื•ืคืŸ ืขืฆืžืื™ ืืช ื›ืœ ื”ืคื•ื ืงืฆื™ื•ื ืœื™ื•ืช ื”ื“ืจื•ืฉื”, ืžื‘ืœื™ ืœื”ื™ื•ืช ืงืฉื•ืจื” ืœื’ืจืขื™ืŸ ืžืขืจื›ืช ื”ื”ืคืขืœื” ื•ืœืกืคืจื™ื•ืช ื”ืžืขืจื›ืช. ืงื•ื“ ื”ืคืจื•ื™ืงื˜ ืžื•ืคืฅ ืชื—ืช ืจื™ืฉื™ื•ื ื•ืช Apache 2.0 ื•-MIT. Assembly ื ืชืžืš ืœื‘ื™ืฆื•ืข ืขืฆืžืื™ ืฉืœ ื™ื™ืฉื•ืžื™ื ืฉื ื›ืชื‘ื• ื‘- Rust, Go, Fortran, C ื•-C++. ื”ืคืจื•ื™ืงื˜ ื’ื ืžืคืชื— ืžืืชื—ื•ืœ ืžืฉืœื• ื”ืžืืคืฉืจ ืœืš ืœื”ืฉื™ืง ืืช Hermit ื‘ืืžืฆืขื•ืช QEMU ื•-KVM.

ืžืงื•ืจ: OpenNet.ru

ื”ื•ืกืคืช ืชื’ื•ื‘ื”