Выпуск мовы праграмавання Rust 1.64

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

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

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

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

  • Падвышаныя патрабаванні да асяроддзя Linux у кампілятары, пакетным мэнэджары Cargo і стандартнай бібліятэцы libstd - мінімальныя патрабаванні да Glibc паднятыя з версіі 2.11 да 2.17, а ядры Linux c версіі 2.6.32 да 3.2. Абмежаванні таксама распаўсюджваюцца на выкананыя файлы Rust-прыкладанняў, сабраных з libstd. Новым патрабаванням адпавядаюць дыстрыбутывы RHEL 7, SLES 12-SP5, Debian 8 і Ubuntu 14.04/6. Будзе спынена падтрымка RHEL 11, SLES 4-SP7, Debian 12.04 і Ubuntu XNUMX/XNUMX. Карыстачам, якія выкарыстоўваюць сабраныя інструментар Rust выкананыя файлы ў асяроддзі са старым ядром Linux, прапанавана абнавіць свае сістэмы, заставацца на старых выпусках кампілятара або самастойна падтрымліваць сваё адгалінаванне libstd з праслойкамі для захавання сумяшчальнасці.

    Сярод прычын спынення падтрымкі старых Linux-сістэм згадваюцца абмежаваныя рэсурсы па працягу суправаджэння сумяшчальнасці са старымі асяроддзямі. Падтрымка старых Glibc патрабуе выкарыстанні старога інструментара пры праверцы ў сістэме бесперапыннай інтэграцыі, ва ўмовах падвышэння патрабаванняў да версій у LLVM і ўтылітах крос-кампіляцыі. Павышэнне патрабаванняў да версіі ядра звязана з магчымасцю выкарыстання ў libstd новых сістэмных выклікаў без неабходнасці падтрымання праслоек для забеспячэння сумяшчальнасці са старымі ядрамі.

  • Стабілізаваны тыпаж IntoFuture, які нагадвае IntoIterator, але адрозніваецца ад апошняга выкарыстаннем ". await" замест цыклаў "for … in …". У спалучэнні з IntoFuture ключавое слова ". await" можа чакаць не толькі тыпаж Future, але і любыя іншыя тыпы, якія можна сканвертаваць у Future.
  • Утыліта rust-analyzer уключана ў склад калекцыі ўтыліт, якая пастаўляецца ў выпусках Rust. Утыліта таксама доступу для ўсталёўкі пры дапамозе rustup (rustup component add rust-analyzer).
  • У пакетным мэнэджары Cargo рэалізавана магчымасць атрымання ў спадчыну працоўнай вобласці для выключэння дубліравання паміж пакетамі тыпавых значэнняў палёў, такіх як версіі Rust і URL рэпазітароў. Таксама дададзена падтрымка зборкі адразу для некалькіх мэтавых платформаў (у опцыі «—target» зараз можна ўказваць больш за адзін параметр).
  • У разрад стабільных пераведзена новая порцыя API, у тым ліку стабілізаваны метады і рэалізацыі тыпажоў:
    • future::IntoFuture
    • num::NonZero*::checked_mul
    • num::NonZero*::checked_pow
    • num::NonZero*::saturating_mul
    • num::NonZero*::saturating_pow
    • num::NonZeroI*::abs
    • num::NonZeroI*::checked_abs
    • num::NonZeroI*::overflowing_abs
    • num::NonZeroI*::saturating_abs
    • num::NonZeroI*::unsigned_abs
    • num::NonZeroI*::wrapping_abs
    • num::NonZeroU*::checked_add
    • num::NonZeroU*::checked_next_power_of_two
    • num::NonZeroU*::saturating_add
    • os::unix::process::CommandExt::process_group
    • os::windows::fs::FileTypeExt::is_symlink_dir
    • os::windows::fs::FileTypeExt::is_symlink_file
  • У асноўны склад (core) і бібліятэку alloc дададзены Сі-сумяшчальныя тыпы, раней стабілізаваныя ў модулі std::ffi:
    • core::ffi::CStr
    • core::ffi::FromBytesWithNulError
    • alloc::ffi::CString
    • alloc::ffi::FromVecWithNulError
    • alloc::ffi::IntoStringError
    • alloc::ffi::NulError
  • У модулі core::ffi і std::ffi дададзены Сі-тыпы, раней стабілізаваныя ў модулі std::os::raw (напрыклад, для Сі-тыпаў uint і ulong прапанаваны тыпы c_uint і c_ulong):
    • ffi::c_char
    • ffi::c_double
    • ffi::c_float
    • ffi::c_int
    • ffi::c_long
    • ffi::c_longlong
    • ffi::c_schar
    • ffi::c_short
    • ffi::c_uchar
    • ffi::c_uint
    • ffi::c_ulong
    • ffi::c_ulonglong
    • ffi::c_ushort
  • Стабілізаваны нізкаўзроўневыя апрацоўшчыкі для выкарыстання з механізмам Poll (у будучыні плануецца прадаставіць спрошчаны API, якія не патрабуюць выкарыстання нізкаўзроўневых структур тыпу Pull і Pin):

    • future::poll_fn
    • task::ready!
  • Прыкмета "const", вызначальны магчымасць выкарыстання ў любым кантэксце замест канстант, ужыты ў функцыі slice::from_raw_parts.
  • З мэтай больш кампактнага захоўвання дадзеных зменена раскладка памяці структур Ipv4Addr, Ipv6Addr, SocketAddrV4 і SocketAddrV6. Магчыма парушэнне сумяшчальнасці з адзінкавымі crate-пакетамі, якія выкарыстоўваюць std::mem::transmute для нізкаўзроўневых маніпуляцый са структурамі.
  • У зборцы кампілятара rust для платформы Windows задзейнічаны PGO-аптымізацыі (profile-guided optimization), якія дазволілі падняць прадукцыйнасць кампіляцыі кода на 10-20%.
  • У кампілятары рэалізавана новае папярэджанне аб нявыкарыстаных палях у пэўных структурах.

Дадаткова можна адзначыць справаздачу аб стане распрацоўкі альтэрнатыўнай рэалізацыі кампілятара мовы Rust, падрыхтаванай праектам gccrs (GCC Rust) і ўхваленай для ўключэння ў склад GCC. Пасля інтэграцыі фронтэнда штатны інструментар GCC зможа выкарыстоўвацца для кампіляцыі праграм на мове Rust без неабходнасці ўстаноўкі кампілятара rustc, пабудаванага з выкарыстаннем напрацовак LLVM. Пакуль распрацоўка ідзе па плане і калі не ўзнікне непрадбачаных праблем, фронтэнд для мовы Rust будзе інтэграваны ў склад выпуску GCC 13, прызначанага на травень наступнага года. Рэалізацыя Rust у GCC 13 будзе мець статут бэта-версіі, пакуль не якая ўключаецца па змаўчанні.

Крыніца: opennet.ru

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