Rust 1.45 programmeertaal release

gepubliceerd release 1.45 van de systeemprogrammeertaal Roest, opgericht door het Mozilla-project. De taal richt zich op geheugenveiligheid, biedt automatisch geheugenbeheer en biedt hulpmiddelen voor het bereiken van hoge taakparallelliteit zonder gebruik te maken van een garbage collector en runtime.

Het automatische geheugenbeheer van Rust elimineert fouten bij het manipuleren van pointers en beschermt tegen problemen die voortkomen uit geheugenmanipulatie op laag niveau, zoals toegang tot een geheugengebied nadat het is vrijgegeven, null pointer-dereferenties, bufferoverruns, enz. Er wordt een pakketbeheerder ontwikkeld om bibliotheken te distribueren, de assemblage te garanderen en de afhankelijkheden van het project te beheren. Cargo, zodat u met één klik de bibliotheken kunt verkrijgen die nodig zijn voor het programma. Er wordt een repository ondersteund om bibliotheken te hosten kratten.io.

De belangrijkste innovaties:

  • Al lang bestaande geëlimineerd defect bij het uitvoeren van conversies tussen gehele getallen en getallen met drijvende komma. Omdat de Rust-compiler LLVM als backend gebruikt, werden typeconversiebewerkingen uitgevoerd via LLVM-tussencode-instructies zoals fptoui, die één belangrijk kenmerk hebben: ongedefinieerd gedrag als de resulterende waarde niet in het doeltype past. Wanneer u bijvoorbeeld de float-waarde 300 met type f32 converteert naar het gehele getal u8, is het resultaat onvoorspelbaar en kan dit op verschillende systemen variëren. Het probleem is dat deze functie voorkomt in code die niet als ‘onveilig’ is gemarkeerd.

    Vanaf Rust 1.45 is het gedrag van overflow van typegrootte strikt gereguleerd, en de "as"-conversiebewerking controleert op overflow en dwingt de waarde te converteren naar de maximale of minimale waarde van het doeltype (in het bovenstaande voorbeeld is een waarde van 300 zou worden omgezet in 255). Om dergelijke controles uit te schakelen, zijn aanvullende API-aanroepen “{f64, f32}::to_int_unchecked” beschikbaar, die in onveilige modus werken.

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

    fn hoofd() {
    laat too_big = 300.0;
    laat too_small = -100.0;
    laat nan = f32::NAN;

    stel x: f32 = 1.0;
    laat y: u8 = onveilig { x.to_int_unchecked() };

    println!("too_big_casted = {}", cast(too_big)); // uitvoer 255
    println!("too_small_casted = {}", cast(too_small)); // uitvoer 0
    println!("not_a_number_casted = {}", cast(nan)); // uitvoer 0
    }

  • Gebruik gestabiliseerd procedurele macro'sfunctie-achtige expressies, sjablonen en instructies. Voorheen konden dergelijke macro's niet overal worden aangeroepen, maar alleen in bepaalde delen van de code (als een afzonderlijke aanroep, niet verweven met andere code). Het uitbreiden van de manier waarop macro's kunnen worden aangeroepen, vergelijkbaar met functies, was een van de vereisten om het webframework te laten werken Raket in stabiele releases van Rust. Voorheen vereiste het bereiken van extra flexibiliteit bij het definiëren van handlers in Rocket het inschakelen van een experimentele functie genaamd “proc_macro_hygiene”, die niet beschikbaar is in stabiele versies van Rust. Deze functionaliteit is nu ingebouwd in stabiele releases van de taal.
  • Toegestaan ​​om bereiken met het type “char” te gebruiken om bereikwaarden te herhalen (ops::{Range, RangeFrom, RangeFull, RangeInclusive, RangeTo}):

    voor ch in 'a'..='z' {
    print!("{}", ch);
    }
    println!(); // Zal "abcdefghijklmnopqrstuvwxyz" afdrukken

  • Een nieuw deel van de API's is overgebracht naar de stabiele categorie, inclusief gestabiliseerd
    Boog::as_ptr,
    BtreeMap::remove_entry,
    Rc::as_ptr,
    rc::Zwak::as_ptr,
    rc::Zwak::van_raw,
    rc::Zwak::into_raw,
    str::strip_voorvoegsel,
    str::strip_achtervoegsel,
    sync::Zwak::as_ptr,
    sync::Zwak::from_raw,
    sync::Zwak::into_raw,
    char::UNICODE_VERSION,
    Span::resolved_at,
    Span::located_at,
    Span::gemengde_site,
    unix::process::CommandExt::arg0.

  • De rustc-compiler heeft ondersteuning toegevoegd voor het overschrijven van verschillende doelplatformfuncties met behulp van de vlag "target-feature", bijvoorbeeld "-C target-feature=+avx2,+fma". Er zijn ook nieuwe vlaggen toegevoegd:
    "force-unwind-tabellen" om afwikkel-oproeptabellen te genereren, ongeacht de strategie voor crashafhandeling; "embed-bitcode" om te bepalen of LLVM-bitcode is opgenomen in gegenereerde rlibs. De vlag "embed-bitcode" is standaard ingeschakeld in Cargo om de bouwtijd en het schijfruimteverbruik te optimaliseren.

  • Er is een derde niveau van ondersteuning geboden voor de platforms mipsel-sony-psp en thumbv7a-uwp-windows-msvc. Het derde niveau omvat basisondersteuning, maar zonder geautomatiseerd testen en publiceren van officiële builds.

Bovendien kan worden opgemerkt het verhaal over het creëren van de eenvoudigste приложения in de Rust-taal, beginnend met het gebruik van de systeembootloader en klaar voor zelfstandig laden in plaats van het besturingssysteem.
Het artikel is het eerste in een serie gewijd aan het demonstreren van technieken waar veel vraag naar is bij programmeren op laag niveau en bij de ontwikkeling van besturingssystemen.

Bron: opennet.ru

Voeg een reactie