Uitgave van de programmeertaal Rust 1.59 met ondersteuning voor montage-inzetstukken

De release van de algemene programmeertaal Rust 1.59, opgericht door het Mozilla-project, maar nu ontwikkeld onder auspiciën van de onafhankelijke non-profitorganisatie Rust Foundation, is gepubliceerd. De taal is gericht op geheugenveiligheid en biedt de middelen om een ​​hoog parallellisme te bereiken bij het uitvoeren van taken, terwijl het gebruik van een garbage collector en runtime wordt vermeden (runtime wordt beperkt tot basisinitialisatie en onderhoud van de standaardbibliotheek).

De geheugenbeheertechnieken van Rust bevrijden de ontwikkelaar van pointermanipulatiefouten en beschermen tegen problemen die voortkomen uit geheugenmanipulatie op laag niveau, zoals after-free toegang, null pointer-dereferenties, bufferoverruns en dergelijke. Om bibliotheken te distribueren, de assemblage te garanderen en afhankelijkheden te beheren, ontwikkelt het project de Cargo-pakketbeheerder. De kratten.io-repository wordt ondersteund voor het hosten van bibliotheken.

Geheugenveiligheid wordt in Rust afgedwongen tijdens het compileren door middel van referentiecontrole, het volgen van objecteigendom, overweging van de levensduur van objecten (scoping) en evaluatie van geheugentoegang tijdens runtime. Rust biedt ook bescherming tegen overflows van gehele getallen, vereist dat variabelewaarden vóór gebruik worden geïnitialiseerd, heeft een betere foutafhandeling in de standaardbibliotheek, gebruikt standaard het concept van onveranderlijke referenties en variabelen en biedt sterke statische typering om logische fouten te minimaliseren.

Belangrijkste innovaties:

  • Het is mogelijk om assembleertaalinvoegingen te gebruiken, waar veel vraag naar is in toepassingen die de uitvoering op een laag niveau moeten controleren of die gespecialiseerde machine-instructies moeten kunnen gebruiken. Montage-inzetstukken worden toegevoegd met behulp van de macro's "asm!" en "global_asm!" het gebruik van stringopmaaksyntaxis voor het benoemen van registers, vergelijkbaar met die gebruikt voor stringvervangingen in Rust. De compiler ondersteunt montage-instructies voor x86-, x86-64-, ARM-, AArch64- en RISC-V-architecturen. Invoegvoorbeeld: gebruik std::arch::asm; // Vermenigvuldig x met 6 met behulp van verschuivingen en voeg let mut x toe: u64 = 4; onveilig { asm!( "mov {tmp}, {x}", "shl {tmp}, 1", "shl {x}, 2", "add {x}, {tmp}", x = inout(reg ) x, tmp = uit(reg) _, ); } assert_eq!(x, 4 * 6);
  • Ondersteuning toegevoegd voor gedestructureerde (parallelle) toewijzingen, waarbij verschillende eigenschappen, segmenten of structuren aan de linkerkant van de uitdrukking worden gespecificeerd. Bijvoorbeeld: laat (a, b, c, d, e); (a, b) = (1, 2); [c, .., d, _] = [1, 2, 3, 4, 5]; Structuur { e, .. } = Structuur { e: 5, f: 3 }; assert_eq!([1, 2, 1, 4, 5], [a, b, c, d, e]);
  • Er is de mogelijkheid geboden om standaardwaarden voor const-generieke geneesmiddelen op te geven: struct ArrayStorage { arr: [T; N], } impl Arrayopslag {fn new(a: T, b: T) -> ArrayStorage { ArrayStorage { arr: [a, b], } } }
  • De Cargo-pakketbeheerder geeft waarschuwingen over het gebruik van ongeldige structuren in afhankelijkheden die worden verwerkt vanwege fouten in de compiler (door een fout mochten velden van ingepakte structuren bijvoorbeeld worden geleend in veilige blokken). Dergelijke constructies zullen niet langer worden ondersteund in een toekomstige versie van Rust.
  • Cargo en rustc hebben een ingebouwde mogelijkheid om uitvoerbare bestanden te genereren, ontdaan van foutopsporingsgegevens (strip = "debuginfo") en symbolen (strip = "symbols"), zonder de noodzaak om een ​​afzonderlijk hulpprogramma aan te roepen. De opschooninstelling wordt geïmplementeerd via de parameter “strip” in Cargo.toml: [profile.release] strip = “debuginfo”, “symbols”
  • Incrementele compilatie is standaard uitgeschakeld. De reden zou een tijdelijke oplossing zijn voor een bug in de compiler die tot crashes en deserialisatiefouten leidt. Er is al een bugfix voorbereid en deze zal in de volgende release worden opgenomen. Om een ​​incrementele compilatie te retourneren, kunt u de omgevingsvariabele RUSTC_FORCE_INCREMENTAL=1 gebruiken.
  • Een nieuw deel van de API is overgebracht naar de stabiele categorie, inclusief de methoden en implementaties van eigenschappen:
    • std::thread::available_parallelism
    • Resultaat::gekopieerd
    • Resultaat::gekloond
    • boog::asm!
    • arch::global_asm!
    • ops::ControlFlow::is_break
    • ops::ControlFlow::is_continue
    • TryFrom voor u8
    • char::TryFromCharError (klonen, debuggen, weergeven, PartialEq, kopiëren, Eq, fout)
    • iter::zip
    • NonZeroU8::is_power_of_two
    • NonZeroU16::is_power_of_two
    • NonZeroU32::is_power_of_two
    • NonZeroU64::is_power_of_two
    • NonZeroU128::is_power_of_two
    • DoubleEndedIterator voor ToLowercase-structuur
    • DoubleEndedIterator voor ToUppercase-structuur
    • TryFrom<&mut [T]> voor [T; N]
    • UnwindSafe voor de Once-structuur
    • RefUnwindSafe voor één keer
    • armv8 neon-ondersteuningsfuncties ingebouwd in de compiler voor aarch64
  • Het attribuut “const”, dat de mogelijkheid bepaalt om het in elke context te gebruiken in plaats van constanten, wordt gebruikt in de functies:
    • mem::MisschienUninit::as_ptr
    • mem::MisschienUninit::neem_init
    • mem::MisschienUninit::assume_init_ref
    • ffi::CStr::from_bytes_with_nul_unchecked

Bron: opennet.ru

Voeg een reactie