Välja antud Rust 1.53. Google rahastab Rusti toe lisamist Linuxi tuumale

Ilmus Mozilla projektiga rajatud, kuid nüüdseks sõltumatu mittetulundusühingu Rust Foundation egiidi all arendatud süsteemi programmeerimiskeele Rust 1.53 väljalase. Keel keskendub mälu ohutusele, pakub automaatset mäluhaldust ja pakub vahendeid ülesannete suure paralleelsuse saavutamiseks ilma prügikogujat või käitusaega kasutamata (käitusaeg taandub standardse teegi põhikäivitamise ja hoolduseni).

Rusti automaatne mäluhaldus välistab osutitega manipuleerimisel tekkivad vead ja kaitseb madala tasemega mäluga manipuleerimisest tulenevate probleemide eest, nagu mälupiirkonnale juurdepääs pärast selle vabastamist, null-osuti viited, puhvri ületamised jne. Teekide levitamiseks, komplekteerimise tagamiseks ja sõltuvuste haldamiseks arendatakse projektis Cargo paketihaldurit. Hoidlat crates.io toetatakse teekide majutamiseks.

Peamised uuendused:

  • Massiivide jaoks on rakendatud tunnust IntoIterator, mis võimaldab korraldada massiivi elementide iteratsiooni väärtuste järgi: i jaoks [1, 2, 3] { .. }

    Samuti on võimalik edastada massiive meetoditele, mis aktsepteerivad iteraatoreid, näiteks: let set = BTreeSet::from_iter([1, 2, 3]); for (a, b) in some_iterator.chain([1]).zip([1, 2, 3]) { .. }

    Varem oli IntoIterator realiseeritud ainult massiiviviidete jaoks, st. väärtuste kordamiseks oli vaja kasutada viiteid (“&[1, 2, 3]”) või “[1, 2, 3].iter()”. IntoIteratori rakendamist massiivide jaoks takistasid ühilduvusprobleemid, mille põhjustas kompilaatori varasem teisendamine massiivist array.into_iter() failiks (&massiiv).into_iter(). Need probleemid lahendati lahendusega – kompilaator jätkab massiivi.into_iter() teisendamist (&massiiv).into_iter()-ks, nagu polekski tunnust IntoIterator rakendatud, kuid ainult siis, kui kutsutakse meetodit ".into_iter(" abil. )" süntaks ja puudutamata kõnesid kujul "in [1, 2, 3]", "iter.zip([1, 2, 3])", "IntoIterator::into_iter([1, 2, 3]" )".

  • Võimalik on määrata väljendeid “|” (loogiline VÕI tehte) mis tahes malli osas, näiteks "Mõned(1) | Mõned(2)" saate nüüd kirjutada "Mõned(1 | 2)": vaste tulemus { Ok(Some(1 | 2)) => { .. } Err(MyError { kind: FileNotFound | PermissionDenied, .. }) = > { .. } _ => { .. } }
  • Mitte-ASCII-märkide kasutamine identifikaatorites on lubatud, sealhulgas kõik Unicode UAX 31 spetsifikatsioonis määratletud rahvuslikud märgid, kuid välja arvatud emotikonid. Kui kasutate erinevaid, kuid sarnaseid märke, annab kompilaator hoiatuse. const BLÅHAJ: &str = "🦈"; struct 人 { 名字: string, } olgu α = 1; letsos = 2; hoiatus: identifikaatoripaar peetakse segi ajatavaks "s" ja "s" vahel
  • Uus osa API-sid on üle viidud stabiilsesse kategooriasse, sealhulgas järgmised stabiliseeritud:
    • massiiv::from_ref
    • massiiv::from_mut
    • AtomicBool::fetch_update
    • AtomicPtr::fetch_update
    • BTreeSet::retain
    • BTreeMap::retain
    • BufReader::seek_relative
    • cmp::min_by
    • cmp::min_by_key
    • cmp::max_by
    • cmp::max_by_key
    • DebugStruct::finish_non_exhaustive
    • Kestus::NULL
    • Kestus::MAX
    • Kestus::on_null
    • Kestus::küllastav_lisa
    • Kestus::saturating_sub
    • Kestus::saturating_mul
    • f32::on_subnormal
    • f64::on_subnormal
    • IntoIterator massiivide jaoks
    • {täisarv}::BITS
    • io::Error::Toetamata
    • NonZero*:: juhtivad_nullid
    • NonZero*::trailing_zeros
    • Valik::sisesta
    • Tellimine::is_ekv
    • Tellimine::is_ne
    • Tellimine::is_lt
    • Tellimine::is_gt
    • Tellimine::is_le
    • Tellimine::is_ge
    • OsStr::make_ascii_lowercase
    • OsStr::make_ascii_uppercase
    • OsStr::to_ascii_madala tähega
    • OsStr::to_ascii_suurtähega
    • OsStr::is_ascii
    • OsStr::eq_ignore_ascii_case
    • Peekable::peek_mut
    • Rc::increment_strong_count
    • Rc::decrement_strong_count
    • slice::IterMut::as_slice
    • AsRef<[T]> slice::IterMut jaoks
    • impl SliceIndex for (Bound , Köidetud )
    • Vana::extend_from_inner
  • Rakendatud on wasm64-tundmatu-tundmatu platvormi kolmas tugitase. Kolmas tase hõlmab põhituge, kuid ilma automaatse testimiseta, ametlike järge avaldamise ja koodi koostatavuse kontrollimiseta.
  • Cargo paketihaldur on viidud Giti hoidla (HEAD) peaharu jaoks vaikimisi kasutama nime "main". Hoidlates hostitud sõltuvused, mis kasutavad master asemel nime main, ei vaja enam filiaali = "main" seadistamist.
  • Kompilaatoris tõstetakse LLVM-i miinimumversiooni nõuded tasemele LLVM 10.

Lisaks võime märkida rahalisi vahendeid Rust-keele komponentide arendamiseks mõeldud tööriistade Linuxi tuumaga integreerimise arendamiseks. Tööd tehakse projekti Prossimo raames ISRG organisatsiooni (Internet Security Research Group) egiidi all, mis on Let's Encrypt projekti alusepanija ning propageerib HTTPS-i ja tehnoloogiate arendamist, et tõsta turvalisust. Internet. Raha annab Google, kes tasub projekti Rust-for-Linux autori Miguel Ojeda töö eest. Varem on ISRG ja Google juba rahastanud alternatiivse HTTP-taustaprogrammi loomist curl-utiliidi jaoks ja uue TLS-mooduli väljatöötamist Apache http-serveri jaoks.

Microsofti ja Google'i andmetel on umbes 70% haavatavustest põhjustatud ebaturvalisest mälukäsitlusest. Eeldatakse, et Rust keele kasutamine tuumakomponentide (nt seadmedraiverid) väljatöötamiseks vähendab ebaturvalisest mälukäsitlusest põhjustatud haavatavuste ohtu ja kõrvaldab sellised vead nagu mälupiirkonnale juurdepääs pärast selle vabastamist ja puhvri piiride ületamine.

Mälu turvalisus on Rustis kompileerimise ajal tagatud viidete kontrollimise, objekti omandiõiguse ja objekti eluea (ulatuse) jälgimise, samuti koodi täitmise ajal mälu juurdepääsu õigsuse hindamise kaudu. Rooste pakub ka kaitset täisarvude ületäitumise eest, nõuab muutujate väärtuste kohustuslikku lähtestamist enne kasutamist, käsitleb standardteegi vigu paremini, rakendab vaikimisi muutumatute viidete ja muutujate kontseptsiooni, pakub tugevat staatilist tippimist loogiliste vigade minimeerimiseks.

Allikas: opennet.ru

Lisa kommentaar