Հրապարակվել է Rust 1.78 ընդհանուր նշանակության ծրագրավորման լեզվի թողարկումը, որը հիմնադրվել է Mozilla նախագծի կողմից, սակայն այժմ մշակվել է Rust Foundation անկախ ոչ առևտրային կազմակերպության հովանու ներքո: Լեզուն կենտրոնանում է հիշողության անվտանգության վրա և ապահովում է աշխատանքի բարձր զուգահեռականության հասնելու միջոցներ՝ միաժամանակ խուսափելով աղբահանող սարքից և գործարկման ժամանակից (աշխատանքի ժամանակը կրճատվում է մինչև ստանդարտ գրադարանի հիմնական սկզբնավորումը և պահպանումը):
Rust-ի հիշողության մշակման մեթոդները ծրագրավորողին փրկում են ցուցիչները մանիպուլյացիայի ժամանակ սխալներից և պաշտպանում են խնդիրներից, որոնք առաջանում են ցածր մակարդակի հիշողության հետ աշխատելու պատճառով, ինչպիսիք են հիշողության տարածք մուտք գործելը այն ազատվելուց հետո, չվերաբերվող ցուցիչները, բուֆերի գերակատարումները և այլն: Գրադարաններ բաշխելու, կառուցումներ տրամադրելու և կախվածությունները կառավարելու համար նախագիծը մշակում է Cargo փաթեթի կառավարիչը: Crates.io պահոցն աջակցվում է գրադարանների հոսթինգի համար:
Հիշողության անվտանգությունն ապահովվում է Rust-ում կոմպիլյացիայի ժամանակ՝ հղումների ստուգման, օբյեկտի սեփականության մասին հաշվառման, օբյեկտների կյանքի ժամկետների (շրջանակների) հետևելու և կոդի կատարման ընթացքում հիշողության հասանելիության ճշգրտության գնահատման միջոցով: Rust-ը նաև ապահովում է պաշտպանություն ամբողջ թվերի արտահոսքից, պահանջում է փոփոխական արժեքների պարտադիր սկզբնավորում նախքան օգտագործումը, ստանդարտ գրադարանում ավելի լավ է լուծում սխալները, լռելյայն կիրառում է անփոփոխ հղումների և փոփոխականների հայեցակարգը, առաջարկում է ուժեղ ստատիկ մուտքագրում՝ տրամաբանական սխալները նվազագույնի հասցնելու համար:
Հիմնական նորամուծությունները.
- Առաջարկվել է նոր հատկանիշ անվանատարածք «#[diagnostic]», որն ապահովում է կոմպիլյատորի կողմից արտադրված սխալ հաղորդագրությունների վրա ազդելու միջոց: Առաջինը նոր տարածության մեջ «#[diagnostic::on_unimplemented]» հատկանիշն է, որը կարող է օգտագործվել՝ հարմարեցնելու սխալի հաղորդագրությունները, որոնք ուղարկվում են այնպիսի իրավիճակում, երբ դուք պետք է օգտագործեք հատկանիշ, որը չի ներդրված տեսակի համար: #[diagnostic::on_unimplemented( message = "My Message for `ImportantTrait<{A}>` is not implemented for `{Self}`", label = "My Label", note = "Note 1", note = "Note 2" )] trait ImportantTrait {} fn ImportantTe_rait: ) {} fn main() {use_my_trait(String::new()); } սխալ[E32]. Իմ հաղորդագրությունը `Կարևոր հատկանիշի համար «String»-ի համար չի իրականացվում —> src/main.rs:0277:32 | 12 | use_my_trait(String::new()); | ———— ^^^^^^^^^^^^^ My Label | | | պահանջվում է սույն կոչով սահմանված սահմանափակումով | = օգնություն. «Կարևոր հատկանիշ «Տողերի» համար չի իրականացվում = նշում. Ծանոթագրություն 18 = նշում. Ծանոթագրություն 12
- Անվտանգ գործառույթների նկատմամբ կիրառվող նախնական ստուգումները այժմ կարող են հետաձգվել մինչև կոդերի ստեղծումը, ինչը թույլ կտա այս ստուգումները կատարել առանց ստանդարտ գրադարանը «#[cfg(debug_assertions)]» ռեժիմում կառուցելու անհրաժեշտության: Ստուգումներ գործարկելու համար այժմ բավական է միացնել վրիպազերծման հաստատումները ձեր կոդի փորձարկման կամ վրիպազերծման համար:
- Ստանդարտ գրադարանի գործառույթների վարքը, որոնք ազդում են ցուցիչի և հատվածի հավասարեցման վրա, այժմ կանխատեսելի է գործարկման ժամանակ և կախված է մուտքային տվյալներից: Ֆունկցիայի ցուցիչը::align_offset, որը հաշվարկում է օֆսեթը ցուցիչը հավասարեցնելու համար, այժմ վերադարձնում է usize::MAX միայն այն դեպքում, եթե գործողությունը ձախողվի: Երկուսն էլ slice::align_to և slice::align_to_mut ֆունկցիաները, որոնք վերափոխում են կտորները հավասարեցված միջին շերտով և սկզբնական սկզբնական և վերջի հատվածներով ներկայացման, այժմ միշտ վերադարձնում են ամենամեծ միջին մասը:
- Հետևյալները տեղափոխվել են կայուն կատեգորիա.
- impl Read for &Stdin
- Թույլատրել ոչ ստատիկ (ոչ ստատիկ) ժամկետի օգտագործումը որոշ std::error::Error-ի հետ կապված իրագործումների համար:
- Impl իրականացում Չափի արժեքը թույլատրվում է:
- impl From io-ի համար::Սխալ
- Barrier::new() ֆունկցիան կայունացվել է, որպեսզի օգտագործվի «const» հատկանիշով ցանկացած համատեքստում՝ հաստատունների փոխարեն:
- Թիրախային պլատֆորմները x86_64-pc-windows-msvc, i686-pc-windows-msvc, x86_64-pc-windows-gnu, i686-pc-windows-gnu, x86_64-pc-windows-gnullvm և i686vullm-ի առնվազն Windows-ի տարբերակը այժմ-c-ն է պահանջում: 10.
- Աջակցության երրորդ մակարդակն իրականացվել է wasm32-wasip2, arm64ec-pc-windows-msvc, armv8r-none-eabihf և loongarch64-unknown-linux-musl հարթակների համար: Երրորդ մակարդակը ներառում է հիմնական աջակցություն, բայց առանց ավտոմատացված թեստավորման, պաշտոնական կառուցումների հրապարակման կամ ստուգելու, թե արդյոք կոդը կարելի է կառուցել:
- Իրականացվել է Add wasm32-wasip1 թիրախային հարթակի աջակցության երկրորդ մակարդակը: Աջակցության երկրորդ մակարդակը ներառում է հավաքման երաշխիք:
- Wasm32-wasi-preview1-threads հարթակը վերանվանվել է wasm32-wasip1-threads:
- Կազմողն անցել է LLVM 18-ի օգտագործման: LLVM 18-ը x86-32 և x86-64 ճարտարապետությունների համար օգտագործելիս փոխվել է U128 և i128 տեսակների հետ կապված ABI-ը:
- Cargo pact manager-ում կողպեքի ֆայլերի 4-րդ տարբերակը (lockfile v4) կայունացվել է:
- Cargo-ն ունի կայունացված գլոբալ քեշ՝ տվյալների վերջին օգտագործման մասին տեղեկություններով: Քեշը տեղակայված է $CARGO_HOME/.global-cache-ում՝ օգտագործելով SQLite-ը և ինքնաբերաբար թարմացվում է՝ արտացոլելու ինդեքսի, տուփի ֆայլի, կոդի գրացուցակի, git clone-ի և git checkout-ի վերջին փոփոխությունները:
Բացի այդ, Borgo ծրագրավորման լեզուն փորձում է ավելի արտահայտիչ լինել, քան Go լեզուն, բայց ավելի քիչ բարդ, քան Rust լեզուն: Borgo-ն համատեղում է Go-ի և Rust-ի լավագույն հատկանիշները՝ լրացնելով յուրաքանչյուր լեզվի թերությունները: Օրինակ, Go-ն պարզ և պարզ է, բայց չի ապահովում առաջադեմ տիպի անվտանգության առանձնահատկություններ: Rust լեզուն ապահովում է անվտանգ ծրագրավորման գործիքներ, բայց չափազանց բարդ է: Նախագիծը մշակում է Մարկո Սամպելեգրինին՝ The Simple Haskell Handbook-ի հեղինակը և Quad CI շարունակական ինտեգրման համակարգի մշակողը:

Borgo-ն օգտագործում է ստատիկ մուտքագրում, Go-ի նման տիպեր և Rust-ի շարահյուսություն: Բորգո կոդի տողերի վերջում կետը պարտադիր չէ: Borgo կոդը կազմվում է Go ներկայացուցչության մեջ, որը լիովին համատեղելի է գոյություն ունեցող Go փաթեթների հետ: Կազմողի կոդը գրված է Rust-ով և տարածվում է ISC լիցենզիայի ներքո: օգտագործել fmt enum NetworkState { Loading, Failed(int), Success(T), } struct Response { title: string, duration: int, } fn main() {let res = Response { title: “Hello world”, duration: 0, } let state = NetworkState.Success(res) let msg = match state { NetworkState.stillloading NetworkState.Failed(code) => fmt.Sprintf("Got error code. %d", code), NetworkState.Success(res) => res.title, } fmt.Println(msg) }
Source: opennet.ru
