Апублікаваны рэліз мовы праграмавання агульнага прызначэння 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