Rilaxx tal-lingwa ta 'programmar Rust 1.59 b'appoġġ għal inserzjonijiet ta' assemblaġġ

Ġiet rilaxxata l-lingwa ta 'programmar għal skopijiet ġenerali Rust 1.59, imwaqqfa mill-proġett Mozilla iżda issa żviluppat taħt l-awspiċi tal-organizzazzjoni indipendenti mingħajr skop ta' qligħ Rust Foundation. Il-lingwa tiffoka fuq is-sikurezza tal-memorja u tipprovdi l-mezzi biex tikseb paralleliżmu għoli tax-xogħol filwaqt li tevita l-użu ta 'ġbir ta' żibel u runtime (runtime huwa mnaqqas għal inizjalizzazzjoni bażika u manutenzjoni tal-librerija standard).

Il-metodi tal-immaniġġjar tal-memorja ta 'Rut isalvaw lill-iżviluppatur minn żbalji meta jimmanipula l-indikazzjonijiet u jipproteġu kontra problemi li jinqalgħu minħabba t-tqandil tal-memorja ta' livell baxx, bħall-aċċess għal żona tal-memorja wara li tkun ġiet meħlusa, dereferencing null pointers, buffer overruns, eċċ. Biex iqassam il-libreriji, jipprovdi bini u jimmaniġġja d-dipendenzi, il-proġett jiżviluppa l-maniġer tal-pakkett tat-Tagħbija. Ir-repożitorju crates.io huwa appoġġjat għall-hosting tal-libreriji.

Is-sikurezza tal-memorja hija pprovduta f'Rut fil-ħin tal-kompilazzjoni permezz ta 'verifika ta' referenza, iżżomm kont tal-pussess tal-oġġett, iżżomm kont tal-ħajja tal-oġġetti (ambiti), u tivvaluta l-korrettezza tal-aċċess għall-memorja waqt l-eżekuzzjoni tal-kodiċi. Rust jipprovdi wkoll protezzjoni kontra overflows integer, jeħtieġ inizjalizzazzjoni obbligatorja ta 'valuri varjabbli qabel l-użu, jimmaniġġja l-iżbalji aħjar fil-librerija standard, japplika l-kunċett ta' referenzi immutabbli u varjabbli b'mod awtomatiku, joffri tajpjar statiku qawwi biex jimminimizza l-iżbalji loġiċi.

Innovazzjonijiet ewlenin:

  • Huwa possibbli li tuża inserzjonijiet tal-lingwa tal-assemblaġġ, li huma fid-domanda f'applikazzjonijiet li jeħtieġu jikkontrollaw l-eżekuzzjoni f'livell baxx jew ikunu jistgħu jużaw struzzjonijiet speċjalizzati tal-magni. Inserzjonijiet ta 'assemblaġġ huma miżjuda bl-użu ta' macros "asm!" u "global_asm!" bl-użu tas-sintassi tal-ifformattjar tal-istring għall-ismijiet tar-reġistri simili għal dak użat għas-sostituzzjonijiet tal-istring f'Rut. Il-kompilatur jappoġġja struzzjonijiet ta 'assemblaġġ għal arkitetturi x86, x86-64, ARM, AArch64 u RISC-V. Eżempju ta' inserzjoni: uża std::arch::asm; // Immoltiplika x b'6 billi tuża shifts u żidiet let mut x: u64 = 4; mhux sigur {asm!( "mov {tmp}, {x}", "shl {tmp}, 1", "shl {x}, 2", "żid {x}, {tmp}", x = inout (reg ) x, tmp = out(reg) _, ); } assert_eq!(x, 4 * 6);
  • Appoġġ miżjud għal assenjazzjonijiet destrutturati (paralleli), li fihom diversi karatteristiċi, slices jew strutturi huma speċifikati fuq in-naħa tax-xellug tal-espressjoni. Per eżempju: ejja (a, b, c, d, e); (a, b) = (1, 2); [ċ, .., d, _] = [1, 2, 3, 4, 5]; Struttura {e, .. } = Struttura {e: 5, f: 3}; assert_eq!([1, 2, 1, 4, 5], [a, b, c, d, e]);
  • Huwa possibbli li jiġu speċifikati valuri default għal ġeneriċi const: struct ArrayStorage {arr: [T; N], } impl ArrayStorage { fn new(a: T, b: T) -> ArrayStorage { ArrayStorage { arr: [a, b], } } }
  • Il-maniġer tal-pakkett tal-Merkanzija jipprovdi twissijiet dwar l-użu ta 'strutturi invalidi f'dipendenzi li huma pproċessati minħabba żbalji fil-kompilatur (per eżempju, minħabba żball, oqsma ta' strutturi ppakkjati tħallew jissellfu fi blokki sikuri). Kostruzzjonijiet bħal dawn mhux se jibqgħu jiġu appoġġjati f'verżjoni futura ta' Rust.
  • Il-merkanzija u r-rustc għandhom kapaċità integrata li jiġġeneraw fajls eżekutibbli mqaxxra minn data ta 'debugging (strixxa = "debuginfo") u simboli (strixxa = "simboli"), mingħajr il-ħtieġa li ssejjaħ utilità separata. L-issettjar tat-tindif huwa implimentat permezz tal-parametru "strixxa" f'Cargo.toml: [profile.release] strip = "debuginfo", "simboli"
  • Il-kumpilazzjoni inkrementali hija diżattivata awtomatikament. Ir-raġuni jingħad li hija soluzzjoni temporanja għal bug fil-kompilatur li twassal għal ħabtiet u żbalji ta 'deserialization. Soluzzjoni tal-bug diġà ġiet ippreparata u se tkun inkluża fir-rilaxx li jmiss. Biex tirritorna kumpilazzjoni inkrementali, tista' tuża l-varjabbli ambjentali RUSTC_FORCE_INCREMENTAL=1.
  • Porzjon ġdid tal-API ġie mċaqlaq għall-kategorija ta 'stabbli, inklużi l-metodi u l-implimentazzjonijiet tal-karatteristiċi ġew stabbilizzati:
    • std::thread::disponibbli_paralleliżmu
    • Riżultat::ikkupjat
    • Riżultat::ikklonat
    • arch::asm!
    • arch::global_asm!
    • ops::ControlFlow::is_break
    • ops::ControlFlow::is_continue
    • Ipprova minn għal u8
    • char::TryFromCharError (Clone, Debug, Display, PartialEq, Kopja, Eq, Żball)
    • 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 għall-istruttura ToLowercase
    • DoubleEndedIterator għall-istruttura ToUppercase
    • TryFrom għal [T; N]
    • UnwindSafe għall-istruttura Once
    • RefUnwindSafe għal Darba
    • Armv8 neon funzjonijiet ta 'appoġġ mibnija fil-kompilatur għal aarch64
  • L-attribut "const", li jiddetermina l-possibbiltà li jintuża fi kwalunkwe kuntest minflok kostanti, jintuża fil-funzjonijiet:
    • mem::MaybeUninit::as_ptr
    • mem::MaybeUninit::assume_init
    • mem::MaybeUninit::assume_init_ref
    • ffi::CStr::from_bytes_with_nul_unchecked

Sors: opennet.ru

Żid kumment