Rust 1.45 Programlingvo-Eldono

eldonita eldono 1.45 de la sistema programlingvo rustiĝi, fondita de la projekto Mozilla. La lingvo temigas memorsekurecon, disponigas aŭtomatan memoradministradon, kaj disponigas ilojn por atingi altan taskan paralelecon sen uzado de rubkolektilo kaj rultempo.

La aŭtomata memoradministrado de Rust eliminas erarojn dum manipulado de montriloj kaj protektas kontraŭ problemoj ekestiĝantaj de malaltnivela memormanipulado, kiel ekzemple alirado de memorregiono post kiam ĝi estis liberigita, nulaj montriloj dereferences, bufrotranspasoj, ktp. Pakaĵmanaĝero estas evoluigita por distribui bibliotekojn, certigi kunigon kaj administri dependecojn per la projekto. kargo, permesante al vi akiri la bibliotekojn necesajn por la programo per unu klako. Deponejo estas subtenata por gastigi bibliotekojn kestoj.io.

Ĉefa novigoj:

  • Forigita delonge difekto kiam oni faras konvertiĝojn inter entjeroj kaj glitkomaj nombroj. Ĉar la Rust-kompililo uzas LLVM kiel backend, tipkonvertaj operacioj estis faritaj per LLVM-interaj kodinstrukcioj kiel ekzemple fptoui, kiuj havas unu signifan trajton - nedifinitan konduton se la rezulta valoro ne konvenas en la celspecon. Ekzemple, kiam oni konvertas la flosan valoron 300 kun tipo f32 al entjera tipo u8, la rezulto estas neantaŭvidebla kaj povas varii laŭ malsamaj sistemoj. La problemo estas, ke ĉi tiu funkcio aperas en kodo, kiu ne estas markita kiel "nesekura".

    Ekde Rust 1.45, la konduto de tipgranda superfluo estas strikte reguligita, kaj la "kiel" konverta operacio kontrolas por superfluo kaj devigas la valoron esti konvertita al la maksimuma aŭ minimuma valoro de la celspeco (por la supra ekzemplo, valoro de 300 estus konvertitaj al 255). Por malŝalti tiajn kontrolojn, aldonaj API-vokoj "{f64, f32}::to_int_unchecked" estas provizitaj, funkciante en nesekura reĝimo.

    fn cast(x: f32) -> u8 {
    x kiel u8
    }

    fn ĉefa () {
    lasu tro_granda = 300.0;
    lasu tro_malgranda = -100.0;
    let nan = f32::NAN;

    estu x: f32 = 1.0;
    lasu y: u8 = nesekura { x.to_int_unchecked () };

    println!("tro_granda_gisita = {}", rolanta(tro_granda)); // eligo 255
    println!("tro_malgranda_gisita = {}", rolanta(tro_malgranda)); // eligo 0
    println!("ne_a_numero_casted = {}", cast(nan)); // eligo 0
    }

  • Uzo stabiligita proceduraj makroojfunkcio-similaj esprimoj, ŝablonoj kaj deklaroj. Antaŭe, tiaj makrooj ne povis esti nomitaj ĉie, sed nur en certaj partoj de la kodo (kiel aparta voko, ne interplektita kun alia kodo). Pligrandigi la manieron kiel makrooj povas esti nomitaj, simile al funkcioj, estis unu el la postuloj por igi la retkadron funkcii raketo en stabilaj eldonoj de Rust. Antaŭe, atingi plian flekseblecon en difinado de prizorgantoj en Rocket postulis ebligi eksperimentan funkcion nomitan "proc_macro_hygiene", kiu ne estas havebla en stabilaj versioj de Rust. Ĉi tiu funkcio nun estas konstruita en stabilajn eldonojn de la lingvo.
  • Permesita uzi intervalojn kun tipo "char" por ripeti super intervalvaloroj (ops::{Range, RangeFrom, RangeFull, RangeInclusive, RangeTo}):

    por ch en 'a'..='z' {
    presi! ("{}", ch);
    }
    println!(); // Presos "abcdefghijklmnopqrstuvwxyz"

  • Nova parto de APIoj estis translokigita al la stabila kategorio, inkluzive de stabiligita
    Arc::as_ptr,
    BTreeMap::remove_entry,
    Rc::as_ptr,
    rc::Malforta::as_ptr,
    rc::Malforta::de_kruda,
    rc::Malforta::into_raw,
    str::strip_prefix,
    str::strip_sufix,
    sync::Malforta::as_ptr,
    sync::Malforta::de_kruda,
    sync::Malforta::into_raw,
    char::UNICODE_VERSION,
    Span::resolved_at,
    Span::lokita_ĉe,
    Span::mixed_site,
    unix::process::CommandExt::arg0.

  • La rustc-kompililo aldonis subtenon por superregado de diversaj celplatformfunkcioj uzante la flagon "target-feature", ekzemple "-C target-feature=+avx2,+fma". Novaj flagoj ankaŭ estis aldonitaj:
    "force-unwind-tables" por generi unwind voktabelojn, sendepende de la kraŝmanipula strategio; "embed-bitcode" por kontroli ĉu LLVM-bitkodo estas inkludita en generitaj rlibs. La flago "embed-bitcode" estas ebligita defaŭlte en Kargo por optimumigi konstrutempon kaj konsumon de diskspaco.

  • Tria nivelo de subteno estis provizita por la platformoj mipsel-sony-psp kaj thumbv7a-uwp-windows-msvc. La tria nivelo implikas bazan subtenon, sed sen aŭtomatigita testado kaj publikigo de oficialaj konstruoj.

Aldone, ĝi povas esti notita la rakonto pri kreado de la plej simpla apps en la Rust-lingvo, komencante uzi la sisteman ekŝargilon kaj preta memstara ŝarĝo anstataŭ la operaciumo.
La artikolo estas la unua en serio dediĉita al pruvo de teknikoj kiuj estas postulataj en malaltnivela programado kaj OS-disvolviĝo.

fonto: opennet.ru

Aldoni komenton