Выпуск мовы праграмавання Rust 1.75 і unikernel Hermit 0.6.7

Апублікаваны рэліз мовы праграмавання агульнага прызначэння Rust 1.75, заснаванага праектам Mozilla, але цяпер які развіваецца пад заступніцтвам незалежнай некамерцыйнай арганізацыі Rust Foundation. Мова сфакусаваная на бяспечнай працы з памяццю і дае сродкі для дасягнення высокага паралелізму выканання заданняў, пры гэтым абыходзячыся без выкарыстання зборшчыка смецця і runtime (runtime зводзіцца да базавай ініцыялізацыі і суправаджэння стандартнай бібліятэкі).

Метады працы з памяццю ў Rust пазбаўляюць распрацоўніка ад памылак пры маніпуляванні паказальнікамі і абараняюць ад праблем, якія ўзнікаюць з-за нізкаўзроўневай працы з памяццю, такіх як зварот да вобласці памяці пасля яе вызвалення, разнайменаванне нулявых паказальнікаў, вынахад за межы буфера і да т.п. Для распаўсюджвання бібліятэк, забеспячэнні зборкі і кіраванні залежнасцямі праектам развіваецца пакетны мэнэджар Cargo. Для размяшчэння бібліятэк падтрымліваецца рэпазітар crates.io.

Бяспечная праца з памяццю забяспечваецца ў Rust падчас кампіляцыі праз праверку спасылак, адсочванне валодання аб'ектамі, улік часу жыцця аб'ектаў (вобласці бачнасці) і адзнаку карэктнасці доступу да памяці падчас выканання кода. Rust таксама дае сродкі для абароны ад цэлалікіх перапаўненняў, патрабуе абавязковай ініцыялізацыі значэнняў зменных перад выкарыстаннем, лепш апрацоўвае памылкі ў стандартнай бібліятэцы, ужывае канцэпцыю нязменнасці (immutable) спасылак і зменных па змаўчанні, прапануе моцную статычную тыпізацыю для мінімізацыі лагічных памылак.

Асноўныя навіны:

  • Дададзена магчымасць выкарыстання "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, які працуе на стадыі пасля завяршэння кампаноўкі і выкарыстоўвае звесткі з загадзя падрыхтаванага профіля выканання. Ужыванне BOLT дазваляе паскорыць выкананне кампілятара прыкладна на 2% за рахунак змены раскладкі кода бібліятэкі librustc_driver.so для больш эфектыўнага выкарыстання працэсарнага кэша.

    Уключана зборка кампілятара rustc з опцыяй "-Ccodegen-units = 1", якая дазваляе павысіць якасць аптымізацыі ў LLVM. Праведзеныя тэсты паказваюць павелічэнне прадукцыйнасці ў выпадку са зборкі "-Ccodegen-units = 1" прыкладна на 1.5%. Даданыя аптымізацыі па змаўчанні ўключаюцца толькі для платформы x86_64-unknown-linux-gnu.

    Раней паказаныя аптымізацыі былі апрабаваны кампаніяй Google для скарачэння часу зборкі кампанентаў платформы Android, напісаных на мове Rust. Ужыванне "-C codegen-units=1" пры зборцы Android дазволіла знізіць памер інструментара на 5.5% і павялічыць яго прадукцыйнасць на 1.8%, пры гэтым час зборкі самога інструментара павялічылася амаль у два разы.

    Уключэнне зборкі смецця падчас кампаноўкі ("-gc-sections") дало магчымасць давесці прырост прадукцыйнасці да 1.9%, уключэнне аптымізацыі на этапе звязвання (LTO) - да 7.7%, а аптымізацый на аснове профілю выканання кода (PGO) - да 19.8% . У фінале былі ўжытыя аптымізацыі пры дапамозе ўтыліты BOLT, якія дазволілі давесці прырост хуткасці зборкі да 24.7/10.9%, але памер інструментара пры гэтым вырас на XNUMX/XNUMX%.

    Выпуск мовы праграмавання Rust 1.75 і unikernel Hermit 0.6.7

  • У разрад стабільных пераведзена новая порцыя API, у тым ліку стабілізаваны метады і рэалізацыі тыпажоў:
    • Atomic*::from_ptr
    • FileTimes
    • FileTimesExt
    • File::set_modified
    • File::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::zeroed
    • mem::discriminant
    • mem::zeroed
  • Рэалізаваны трэці ўзровень падтрымкі для платформы csky-unknown-linux-gnuabiv2hf, i586-unknown-netbsd і mipsel-unknown-netbsd. Трэці ўзровень мае на ўвазе базавую падтрымку, але без аўтаматызаванага тэсціравання, публікацыі афіцыйных зборак і праверкі магчымасці зборкі кода.

Дадаткова можна адзначыць новую версію праекта Hermit, які развівае спецыялізаванае ядро ​​(unikernel), напісанае на мове Rust, якое прадстаўляе інструментарый для зборкі самадастатковых прыкладанняў, здольных працаваць па-над гіпервізарам або голага абсталявання без дадатковых праслоек і без аперацыйнай сістэмы. Пры зборцы дадатак статычна звязваецца з бібліятэкай, якая самастойна рэалізуе ўсю неабходную функцыянальнасць, не прывязваючыся да ядра АС і сістэмным бібліятэкам. Код праекту распаўсюджваецца пад ліцэнзіямі Apache 2.0 і MIT. Падтрымліваецца зборка для адасобленага выканання прыкладанняў, напісаных на мовах Rust, Go, Fortran, C і C++. Таксама праектам развіваецца ўласны загрузнік, які дазваляе запускаць Hermit пры дапамозе QEMU і KVM.

Крыніца: opennet.ru

Дадаць каментар