Rust 1.34 programmeertaal release

De systeemprogrammeertaal Rust 1.34, ontwikkeld door het Mozilla-project, is vrijgegeven. De taal richt zich op geheugenveiligheid, biedt automatisch geheugenbeheer en biedt een manier om een ​​hoge taakparallelliteit te bereiken zonder gebruik te maken van een garbage collector of runtime.

Het automatische geheugenbeheer van Rust bevrijdt de ontwikkelaar van pointermanipulatie en beschermt tegen problemen die voortkomen uit geheugenmanipulatie op laag niveau, zoals after-free geheugentoegang, null pointer-dereferenties, bufferoverruns en dergelijke. Om bibliotheken te distribueren, assemblage te garanderen en afhankelijkheden te beheren, ontwikkelt het project de Cargo-pakketbeheerder, waarmee u met één klik de bibliotheken kunt verkrijgen die nodig zijn voor het programma. De kratten.io-repository wordt ondersteund voor het hosten van bibliotheken.

Belangrijkste innovaties:

  • De Cargo-pakketbeheerder heeft tools toegevoegd om te werken met alternatieve pakketregisters die naast het openbare kratten.io-register kunnen bestaan. Ontwikkelaars van propriëtaire applicaties kunnen nu bijvoorbeeld hun eigen privéregister gebruiken, dat kan worden gebruikt bij het weergeven van afhankelijkheden in Cargo.toml, en een versiemodel toepassen dat vergelijkbaar is met kratten.io voor hun producten, en afhankelijkheden naar beide kratten verwijzen. io en naar uw eigen register.

    Om een ​​extern register toe te voegen aan ~/.cargo/config
    er is een nieuwe optie “mijn-register” voorzien in de “[registers]” sectie, en een “other-crate” optie is toegevoegd om het externe register te vermelden in afhankelijkheden in Cargo.toml in de “[dependencies]” sectie. Om verbinding te maken met een extra register, plaatst u eenvoudigweg het authenticatietoken in het bestand ~/.cargo/credentials en voert u de opdracht uit
    "cargo login --registry=my-registry" en om een ​​pakket te publiceren -
    "vracht publiceren -registry=mijn-register";

  • Volledige ondersteuning toegevoegd voor het gebruik van de operator “?”. in doctests, waarmee u voorbeeldcode uit de documentatie als tests kunt gebruiken. Voorheen exploitant
    "?" kan alleen worden gebruikt om fouten tijdens de testuitvoering af te handelen in de aanwezigheid van de functie “fn main()” of in de functies “#[test]”;

  • In aangepaste attributen die zijn gedefinieerd met behulp van procedurele macro's, is het mogelijk om willekeurige sets tokens te gebruiken (“#[attr($tokens)]”, “#[attr[$tokens]] en #[attr{$tokens}]”) . Voorheen konden elementen alleen worden gespecificeerd in een boom/recursieve vorm met behulp van letterlijke tekenreeksen, bijvoorbeeld “#[foo(bar, baz(quux, foo = “bar”))]”, maar nu is het mogelijk om opsommingen te gebruiken (' #[range(0. .10)]') en constructies zoals “#[bound(T: MyTrait)]”;
  • De eigenschappen TryFrom en TryInto zijn gestabiliseerd, waardoor typeconversies met foutafhandeling mogelijk zijn. Methoden als from_be_bytes met integer-typen gebruiken bijvoorbeeld arrays als invoer, maar de gegevens zijn vaak van het Slice-type, en het handmatig converteren tussen arrays en slices is problematisch. Met behulp van nieuwe eigenschappen kan de opgegeven bewerking direct worden uitgevoerd door een aanroep van .try_into(), bijvoorbeeld: "let num = u32::from_be_bytes(slice.try_into()?)". Voor conversies die altijd slagen (bijvoorbeeld van type u8 naar u32) is een fouttype Onfeilbaar toegevoegd om transparant gebruik van
    TryFrom voor alle bestaande implementaties van "From";

  • De functie CommandExt::before_exec is verouderd, waardoor uitvoering van een handler vóór exec mogelijk was die werd uitgevoerd in de context van een onderliggend proces dat werd gevorkt na de aanroep fork(). Onder dergelijke omstandigheden kunnen sommige bronnen van het bovenliggende proces, zoals bestandsdescriptors en toegewezen geheugengebieden, worden gedupliceerd, wat zou kunnen leiden tot ongedefinieerd gedrag en onjuiste werking van bibliotheken.
    In plaats van before_exec wordt aanbevolen om de onveilige functie CommandExt::pre_exec te gebruiken.

  • Gestabiliseerde atomaire gehele typen met en zonder teken, variërend in grootte van 8 tot 64 bits (bijvoorbeeld AtomicU8), evenals ondertekende typen NonZeroI[8|16|32|54|128].
  • Een nieuw deel van de API is verplaatst naar de stabiele categorie, inclusief Any::type_id, Error::type_id, slice::sort_by_cached_key, str::escape_*, str::split_ascii_whitespace, Instant::checked_[add|sub ] en SystemTime methoden zijn gestabiliseerd ::checked_[add|sub]. De functies iter::from_fn en iter::opvolgers zijn gestabiliseerd;
  • Voor alle typen gehele getallen zijn de methoden checking_pow, saturating_pow, packing_pow en overflowing_pow geïmplementeerd;
  • De mogelijkheid toegevoegd om optimalisaties in de koppelingsfase mogelijk te maken door de build-optie "-C linker-plugin-lto" te specificeren (rustc compileert Rust-code in LLVM-bitcode, waardoor LTO-optimalisaties kunnen worden toegepast).

Bron: opennet.ru

Voeg een reactie