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

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

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

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

  • Дададзены рэжым канвеернай кампіляцыі (pipelined), пры якой зборка залежнага crate-пакета пачынаецца адразу як толькі становяцца даступныя метададзеныя залежнасці, не чакаючы завяршэнні яе кампіляцыі. Пры кампіляцыі пакета не трэба, каб залежнасці былі сабраны цалкам, дастаткова толькі вызначэння метададзеных, якія ўключаюць спісы тыпаў, залежнасцяў і экспартуемых элементаў. Метададзеныя становяцца даступныя на пачатковым этапе кампіляцыі, таму звязаныя пакеты зараз можна пачаць кампіляваць значна раней. Пры зборцы адзіночных пакетаў прапанаваны рэжым не адбіваецца на прадукцыйнасці, але калі зборка ахапляе пакеты з разгалінаванымі залежнасцямі, агульны час зборкі можа скараціцца на 10-20%;
  • Забяспечана выяўленне некарэктнага прымянення функцый std::mem::uninitialized и std::mem::zeroed. Напрыклад, std::mem::uninitialized зручны для хуткага стварэння масіваў, але ўводзіць кампілятар у памылку, бо ствараюць бачнасць выканання ініцыялізацыі, а ў рэчаіснасці значэнне застаецца неініцыялізаваным. Функцыя mem::uninitialized ужо пазначана як састарэлая і замест яе рэкамендуецца выкарыстоўваць прамежкавы тып MaybeUninit. Што да mem::zeroed, то дадзеная функцыя можа прыводзіць да праблем з тыпам, якія не могуць прымаць нулявыя значэнні.

    Для выяўлення выкліканых нявызначаных паводзін у новым выпуску ў кампілятар дададзеная lint-праверка, якая выяўляе некаторыя праблемы з mem::uninitialized або mem::zeroed. Напрыклад, зараз выводзіцца памылка пры спробе выкарыстання mem::uninitialized ці mem::zeroed з тыпамі &T і Box‹T›, уяўлялымі аб'екты-паказальнікі, якія не могуць прымаць нулявыя значэнні;

  • Пашыраны магчымасці прымянення атрыбуту "#[deprecated]", які дазваляе пазначыць crate-пакеты састарэлымі і намечанымі для выдалення ў будучыні. Пачынальна з версіі Rust 1.38 дадзены атрыбут таксама можна ўжываць для макрасаў;
  • Дададзена магчымасць прымянення атрыбута "#[global_allocator]" у субмодулях;
  • Дададзена функцыя std::any::type_name, Якая дазваляе даведацца імя тыпу, што можа быць карысна ў адладкавых мэтах. Напрыклад, падчас выкананняў праграмы можна пазнаць для якога тыпу была выкліканая функцыя:

    fn gen_value‹T: Default>() -› T {
    println!(«Initializing an instance of {}», std::any::type_name::‹T›());
    Default::default()
    }

    fn асноўны() {
    let _: i32 = gen_value(); # будзе выведзена «i32»
    let _: String = gen_value(); # будзе выведзена "alloc::string::String"
    }

  • Пашыраны функцыі стандартнай бібліятэкі:
    • slice::{concat, connect, join} зараз можа прымаць значэнне &[T] апроч &T;
    • *const T і mut T зараз рэалізуюць marker::Unpin;
    • «Arc‹[T]›» і «Rc‹[T]›» зараз рэалізуюць FromIterator‹T›;
    • iter::{StepBy, Peekable, Take} зараз рэалізуюць DoubleEndedIterator.
    • ascii::EscapeDefault рэалізуе Clone і Display.
  • У разрад стабільных пераведзена новая порцыя API, у тым ліку стабілізаваны метады
    • ‹*const T›::cast, ‹*mut T›::cast,
    • Duration::as_secs_f{32|64},
    • Duration::div_duration_f{32|64},
    • Duration::div_f{32|64},
    • Duration::from_secs_f{32|64},
    • Duration::mul_f{32|64},
    • аперацыі дзялення з астачай
      div_euclid і rem_euclid для ўсіх цэлалікавых прымітываў;

  • У пакетны мэнэджар cargo дададзена падтрымка ўказання опцыі «-features» некалькі разоў для ўключэння розных магчымасцяў;
  • У кампілятары забяспечаны трэці ўзровень падтрымкі для мэтавых платформаў aarch64-uwp-windows-msvc, i686-uwp-windows-gnu, i686-uwp-windows-msvc, x86_64-uwp-windows-gnu, x86_64-uwp-windows-un -gnueabi, armv7-unknown-linux-musleabi, hexagon-unknown-linux-musl і riscv7i-unknown-none-elf. Трэці ўзровень мае на ўвазе базавую падтрымку, але без аўтаматызаванага тэсціравання і публікацыі афіцыйных зборак.

Крыніца: opennet.ru

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