Rust 1.53 släppt. Google kommer att finansiera att lägga till Rust-stöd till Linux-kärnan

Utgivningen av systemprogrammeringsspråket Rust 1.53, grundat av Mozilla-projektet, men nu utvecklat i regi av den oberoende ideella organisationen Rust Foundation, har publicerats. Språket fokuserar på minnessäkerhet, ger automatisk minneshantering och ger möjlighet att uppnå hög uppgiftsparallellism utan att använda en skräpsamlare eller körtid (körtiden reduceras till grundläggande initiering och underhåll av standardbiblioteket).

Rusts automatiska minneshantering eliminerar fel vid manipulering av pekare och skyddar mot problem som uppstår från minnesmanipulation på låg nivå, som att komma åt en minnesregion efter att den har frigjorts, nollpekarereferenser, buffertöverskridanden, etc. För att distribuera bibliotek, säkerställa montering och hantera beroenden utvecklar projektet Cargo package manager. Crates.io-förvaret stöds för värdbibliotek.

Huvudsakliga innovationer:

  • För arrayer har IntoIterator-egenskapen implementerats, vilket gör att du kan organisera iterationen av arrayelement efter värden: för i i [1, 2, 3] { .. }

    Det är också möjligt att skicka arrayer till metoder som accepterar iteratorer, till exempel: let set = BTreeSet::from_iter([1, 2, 3]); för (a, b) i some_iterator.chain([1]).zip([1, 2, 3]) { .. }

    Tidigare implementerades IntoIterator endast för arrayreferenser, d.v.s. för att iterera över värden krävdes användning av referenser ("&[1, 2, 3]") eller "[1, 2, 3].iter()". Implementeringen av IntoIterator för arrayer försvårades av kompatibilitetsproblem orsakade av en tidigare kompilatorkonvertering från array.into_iter() till (&array).into_iter(). Dessa problem löstes med en lösning - kompilatorn kommer att fortsätta att konvertera array.into_iter() till (&array).into_iter() som om det inte fanns någon implementering av IntoIterator-egenskapen, utan bara när metoden anropas med hjälp av ".into_iter() )" syntax och utan att röra anropen i formen "i [1, 2, 3]", "iter.zip([1, 2, 3])", "IntoIterator::into_iter([1, 2, 3] )".

  • Det är möjligt att ange uttryck "|" (logisk ELLER-operation) i valfri del av mallen, till exempel istället för "Some(1) | Some(2)" kan du nu skriva "Some(1 | 2)": matchresultat { Ok(Some(1 | 2)) => { .. } Err(MyError { kind: FileNotFound | PermissionDenied, .. }) = > { .. } _ => { .. } }
  • Användning av icke-ASCII-tecken i identifierare är tillåten, inklusive alla nationella tecken som definieras i Unicode UAX 31-specifikationen, men exklusive emoji-tecken. Om du använder olika men liknande tecken kommer kompilatorn att utfärda en varning. const BLÅHAJ: &str = "🦈"; struct 人 { 名字: String, } låt α = 1; låtos = 2; varning: identifierarpar anses vara förväxlande mellan 's' och 's'
  • En ny del av API:er har överförts till den stabila kategorin, inklusive följande stabiliserade:
    • array::från_ref
    • array::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
    • Varaktighet::NOLL
    • Varaktighet::MAX
    • Duration::is_noll
    • Duration::saturating_add
    • Duration::saturating_sub
    • Duration::saturating_mul
    • f32::är_subnormal
    • f64::är_subnormal
    • IntoIterator för arrayer
    • {integer}::BITS
    • io::Error::Stöds inte
    • NonZero*::leading_zeros
    • NonZero*::trailing_zeros
    • Alternativ::insert
    • Beställning::is_eq
    • Beställning::is_ne
    • Beställning::is_lt
    • Beställning::is_gt
    • Beställning::is_le
    • Beställning::is_ge
    • OsStr::make_ascii_små bokstäver
    • OsStr::make_ascii_versaler
    • OsStr::to_ascii_små bokstäver
    • OsStr::to_ascii_versaler
    • OsStr::is_ascii
    • OsStr::eq_ignore_ascii_case
    • Peekable::peek_mut
    • Rc::increment_strong_count
    • Rc::decrement_strong_count
    • skiva::IterMut::som_skiva
    • AsRef<[T]> för skiva::IterMut
    • impl SliceIndex för (Bound , Inbunden )
    • Vec::extend_from_within
  • Den tredje nivån av stöd för plattformen wasm64-unknown-unknown har implementerats. Den tredje nivån innebär grundläggande support, men utan automatiserad testning, publicering av officiella builds eller kontroll av om koden kan byggas.
  • Cargo-pakethanteraren har flyttats till att använda namnet "main" för huvudgrenen av Git-förvaret (HEAD) som standard. Beroenden som finns i arkiv som använder namnet main istället för master kräver inte längre att branch = "main" konfigureras.
  • I kompilatorn höjs kraven för minimiversionen av LLVM till LLVM 10.

Dessutom kan vi notera tillhandahållandet av finansiering för utveckling av integration i Linux-kärnan av verktyg för att utveckla komponenter i Rust-språket. Arbetet kommer att utföras inom ramen för Prossimo-projektet i regi av ISRG-organisationen (Internet Security Research Group), som är grundare av Let's Encrypt-projektet och främjar HTTPS och utveckling av teknologier för att öka säkerheten för Internet. Medlen kommer att tillhandahållas av Google, som kommer att betala för arbetet av Miguel Ojeda, författaren till Rust-for-Linux-projektet. Tidigare har ISRG och Google redan finansierat skapandet av en alternativ HTTP-backend för curl-verktyget och utvecklingen av en ny TLS-modul för Apache http-servern.

Enligt Microsoft och Google orsakas cirka 70 % av sårbarheterna av osäker minneshantering. Det förväntas att användningen av Rust-språket för att utveckla kärnkomponenter som enhetsdrivrutiner kommer att minska risken för sårbarheter orsakade av osäker minneshantering och eliminera fel som att komma åt ett minnesområde efter att det har frigjorts och buffertgränser har överskridits.

Minnessäkerhet tillhandahålls i Rust vid kompileringstillfället genom referenskontroll, hålla reda på objektägande och objektlivslängd (scope), samt genom utvärdering av korrektheten av minnesåtkomst under kodexekvering. Rust ger också skydd mot heltalsspill, kräver obligatorisk initiering av variabelvärden innan användning, hanterar fel bättre i standardbiblioteket, tillämpar konceptet med oföränderliga referenser och variabler som standard, erbjuder stark statisk typning för att minimera logiska fel.

Källa: opennet.ru

Lägg en kommentar