Выпуск Rust 1.78. Мова Borgo, які спалучае моцныя бакі Go і Rust

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

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

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

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

  • Прапанавана новая прастора імёнаў атрыбутаў «#[diagnostic]», якая дае сродкі для ўплыву на выдаваныя кампілятарам паведамленні аб памылках. Першым у новай прасторы рэалізаваны атрыбут "#[diagnostic::on_unimplemented]", які можа выкарыстоўвацца для налады паведамленняў пра памылкі, якія выдаюцца ў сітуацыі, калі патрабуецца выкарыстоўваць тыпаж, які не рэалізаваны для тыпу. #[diagnostic ::on_unimplemented( 1» )] trait ImportantTrait {} fn use_my_trait(_: impl ImportantTrait ) {} fn main() { use_my_trait(String::new()); } error[E2]: My Message for `ImportantTrait `is not implemented for `String` —> src/main.rs:32:0277 | 32 | use_my_trait(String::new()); | ———— ^^^^^^^^^^^^^^ My Label | | | required by a bound introduced by this call | = help: the trait `ImportantTrait ` is not implemented for `String` = note: Note 12 = note: Note 18
  • Папярэднія assert-праверкі, якія прымяняюцца да unsafe-функцыямі, зараз могуць адкладацца да стадыі генерацыі кода, што дазваляе выконваць дадзеныя праверкі без неабходнасці зборкі стандартнай бібліятэкі ў рэжыме "#[cfg(debug_assertions)]". Для спрацоўвання праверак зараз дастаткова ўключэння адладкавых assert-ов для тэставых або адладкавых зборак свайго кода.
  • Паводзіны функцый у стандартнай бібліятэцы, якія ўплываюць на выраўноўванне паказальнікаў і зрэзаў (slice), зараз прадказальна падчас выканання і залежыць ад уваходных дадзеных. Функцыя pointer::align_offset, якая вылічае зрушэнне для выраўноўвання паказальніка, зараз вяртае usize::MAX толькі пры немагчымасці выканання аперацыі. Функцыі slice::align_to і slice::align_to_mut both, пераўтваральныя зрэзы ва ўяўленне з выраўнаваным сярэднім зрэзам і зыходнымі пачатковым і канчатковым зрэзамі, зараз заўсёды вяртаюць самую вялікую сярэднюю частку.
  • У разрад стабільных пераведзены:
    • impl Read for &Stdin
    • Дазволена выкарыстанне нестатычнага (не 'static) чакай жыцця для некаторых рэалізацый, звязаных з std::error::Error.
    • У рэалізацыі impl дазволена выкарыстанне значэння? Sized.
    • impl From for io::Error
  • Функцыя Barrier::new() стабілізаваная для выкарыстання з прыкметай "const" у любым кантэксце замест канстант.
  • Для мэтавых платформаў x86_64-pc-windows-msvc, i686-pc-windows-msvc, x86_64-pc-windows-gnu, i686-pc-windows-gnu, x86_64-pc-windows-gnullvm-i зараз патрабуецца прынамсі версія Windows 686.
  • Рэалізаваны трэці ўзровень падтрымкі для платформаў wasm32-wasip2, arm64ec-pc-windows-msvc, armv8r-none-eabihf і loongarch64-unknown-linux-musl. Трэці ўзровень мае на ўвазе базавую падтрымку, але без аўтаматызаванага тэсціравання, публікацыі афіцыйных зборак і праверкі магчымасці зборкі кода.
  • Рэалізаваны другі ўзровень падтрымкі мэтавай платформы Add wasm32-wasip1. Другі ўзровень падтрымкі мае на ўвазе гарантыю зборкі.
  • Платформа wasm32-wasi-preview1-threads перайменавана ў wasm32-wasip1-threads.
  • Кампілятар пераведзены на выкарыстанне LLVM 18. Пры выкарыстанні LLVM 18 для архітэктур x86-32 і x86-64 зменены ABI, злучаны з тыпамі u128 і i128.
  • У пактам мэнэджару Cargo стабілізавана 4 версія файлаў-блакіровак (lockfile v4).
  • У Cargo стабілізаваны глабальны кэш з інфармацыяй аб апошнім выкарыстанні дадзеных. Кэш размяшчаецца ў файле $CARGO_HOME/.global-cache пры дапамозе SQLite, абнаўляецца аўтаматычна і адлюстроўвае апошнія змены, злучаныя з азначнікам, crate-файлам, каталогам з кодам, git clone і git checkout.

Дадаткова можна адзначыць мову праграмавання Borgo, які спрабуе быць больш выразным, чым мова Go, але менш складаным, чым мова Rust. Borgo камбінуе лепшыя рысы Go і Rust, папаўняючы недахопы кожнай з моў. Напрыклад, мова Go простая і зразумелая, але не дае пашыраных сродкаў для забеспячэння бяспекі пры працы з тыпамі. Мова Rust дае сродкі для бяспечнага праграмавання, але пераўскладнены. Праект развівае Marco Sampellegrini, аўтар кнігі "The Simple Haskell Handbook" і распрацоўшчык сістэмы бесперапыннай інтэграцыі Quad CI.

Выпуск Rust 1.78. Мова Borgo, які спалучае моцныя бакі Go і Rust

У Borgo выкарыстоўваецца статычная тыпізацыя, аналагічныя мове Go тыпы і сінтаксіс, падобны да Rust. Указанне кропак з коскі ў канцы радкоў у кодзе на Borgo не з'яўляецца абавязковым. Код на мове Borgo кампілюецца ў прадстаўленне на мове Go, якое цалкам сумяшчальна з існуючымі пакетамі для мовы Go. Код кампілятара напісаны на мове Rust і распаўсюджваецца пад ліцэнзіяй ISC. use fmt enum NetworkState { Loading, Failed(int), Success(T), } struct Response { title: string, duration: int, } fn main() { let res = Response { title: "Hello world", duration: 0, } let state = NetworkState.Success(res) let msg = match state { NetworkState.Loading => 'still loading', NetworkState.Failed(code) => fmt.Sprintf("Got error code: %d", code), NetworkState.Success (res) => res.title, } fmt.Println(msg) }

Крыніца: opennet.ru

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