Izlaista Rust 1.78. Borgo valoda, kas apvieno Go un Rust stiprās puses

Publicēts vispārējas nozÄ«mes programmēŔanas valodas Rust 1.78 izlaidums, kas dibināts ar Mozilla projektu, bet tagad izstrādāts neatkarÄ«gās bezpeļņas organizācijas Rust Foundation paspārnē. Valoda koncentrējas uz atmiņas droŔību un nodroÅ”ina lÄ«dzekļus, lai sasniegtu augstu darba paralēlismu, vienlaikus izvairoties no atkritumu savācēja un izpildlaika izmantoÅ”anas (izpildlaiks tiek samazināts lÄ«dz standarta bibliotēkas pamata inicializēŔanai un uzturēŔanai).

Rust atmiņas apstrādes metodes pasargā izstrādātāju no kļūdām, manipulējot ar rādÄ«tājiem, un aizsargā pret problēmām, kas rodas zema lÄ«meņa atmiņas apstrādes dēļ, piemēram, piekļūŔana atmiņas apgabalam pēc tā atbrÄ«voÅ”anas, nulles rādÄ«tāju atsauču atcelÅ”ana, bufera pārtēriņi utt. Lai izplatÄ«tu bibliotēkas, nodroÅ”inātu bÅ«vējumus un pārvaldÄ«tu atkarÄ«bas, projekts izstrādā Cargo pakotņu pārvaldnieku. Crates.io repozitorijs tiek atbalstÄ«ts bibliotēku mitināŔanai.

Atmiņas droŔība tiek nodroÅ”ināta Rust kompilēŔanas laikā, pārbaudot atsauces, sekojot lÄ«dzi objekta Ä«paÅ”umtiesÄ«bām, sekojot lÄ«dzi objektu kalpoÅ”anas laikam (tvērumam) un novērtējot atmiņas piekļuves pareizÄ«bu koda izpildes laikā. RÅ«sa arÄ« nodroÅ”ina aizsardzÄ«bu pret veselu skaitļu pārpildīŔanu, pieprasa obligātu mainÄ«go vērtÄ«bu inicializāciju pirms lietoÅ”anas, labāk apstrādā kļūdas standarta bibliotēkā, pēc noklusējuma piemēro nemainÄ«gu atsauču un mainÄ«go jēdzienu, piedāvā spēcÄ«gu statisko rakstīŔanu, lai samazinātu loÄ£iskās kļūdas.

Galvenie jauninājumi:

  • Ir ierosināta jauna atribÅ«ta nosaukumvieta "#[diagnostic]", kas nodroÅ”ina lÄ«dzekli, lai ietekmētu kompilatora radÄ«tos kļūdu ziņojumus. Pirmais jaunajā telpā ir atribÅ«ts "#[diagnostic::on_unimplemented]", ko var izmantot, lai pielāgotu kļūdu ziņojumus, kas tiek izmesti situācijā, kad ir jāizmanto pazÄ«me, kas nav ieviesta Å”im tipam. #[diagnostic::on_unimplemented( message = "Mans ziņojums par `ImportantTrait<{A}>` nav ieviests `{Self}`", label = "Mana etiÄ·ete", note = "1. piezÄ«me", note = "PiezÄ«me 2" )] iezÄ«me ImportantTrait {} fn use_my_trait(_: impl ImportantTrait ) {} fn main() { use_my_trait(String::new()); } error[E32]: Mans ziņojums par `ImportantTrait ` nav ieviests `String` —> src/main.rs:0277:32 | 12 | use_my_trait(String::new()); | ———— ^^^^^^^^^^^^^ Mana etiÄ·ete | | | prasa saite, kas ieviesta ar Å”o aicinājumu | = palÄ«dzÄ«ba: Ä«paŔība `SvarÄ«gaÄŖpaŔība ` nav ieviests virknei = piezÄ«me: 18. piezÄ«me = piezÄ«me: 12. piezÄ«me
  • Pārbaudes pirms apstiprinājuma, kas tiek piemērotas nedroŔām funkcijām, tagad var atlikt lÄ«dz koda Ä£enerēŔanai, ļaujot veikt Ŕīs pārbaudes bez nepiecieÅ”amÄ«bas izveidot standarta bibliotēku režīmā "#[cfg(debug_assertions)]". Lai aktivizētu pārbaudes, tagad ir pietiekami iespējot atkļūdoÅ”anas apgalvojumus jÅ«su koda testēŔanas vai atkļūdoÅ”anas bÅ«vējumiem.
  • Standarta bibliotēkas funkciju darbÄ«ba, kas ietekmē rādÄ«tāju un slāņu izlÄ«dzināŔanu, tagad ir paredzama izpildlaikā un ir atkarÄ«ga no ievades datiem. Funkcija pointer::align_offset, kas aprēķina nobÄ«di rādÄ«tāja lÄ«dzināŔanai, tagad atgriež use::MAX tikai tad, ja darbÄ«ba neizdodas. Funkcijas slice::align_to un slice::align_to_mut, kas pārveido Ŕķēles attēlojumā ar izlÄ«dzinātu vidējo Ŕķēli un sākotnējām sākuma un beigu daļām, tagad vienmēr atgriež lielāko vidējo daļu.
  • Uz stabilo kategoriju tika pārcelti:
    • impl LasÄ«t &Stdin
    • Dažām std::error::error implementācijām atļaut izmantot nestatisku (nestatisku) kalpoÅ”anas laiku.
    • Impl ievieÅ”ana ?Izmēra vērtÄ«ba ir atļauta.
    • impl No io::Error
  • Funkcija Barrier::new() ir stabilizēta, lai to varētu izmantot ar atribÅ«tu "const" jebkurā kontekstā, nevis konstantes.
  • MērÄ·a platformām x86_64-pc-windows-msvc, i686-pc-windows-msvc, x86_64-pc-windows-gnu, i686-pc-windows-gnu, x86_64-pc-windows-gnullvm un i686-gnullvm tagad ir nepiecieÅ”ama vismaz Windows 10 versija.
  • TreÅ”ais atbalsta lÄ«menis ir ieviests platformām wasm32-wasip2, arm64ec-pc-windows-msvc, armv8r-none-eabihf un lolongarch64-unknown-linux-musl. TreÅ”ais lÄ«menis ietver pamata atbalstu, taču bez automatizētas testēŔanas, oficiālu bÅ«vējumu publicēŔanas vai pārbaudes, vai kodu var izveidot.
  • Ir ieviests otrais atbalsta lÄ«menis mērÄ·a platformai Add wasm32-wasip1. Otrais atbalsta lÄ«menis ietver montāžas garantiju.
  • Platforma wasm32-wasi-preview1-threads ir pārdēvēta par wasm32-wasip1-threads.
  • Kompilators ir pārslēgts uz LLVM 18 izmantoÅ”anu. Izmantojot LLVM 18 x86-32 un x86-64 arhitektÅ«rām, ir mainÄ«ts ar u128 un i128 tipiem saistÄ«tais ABI.
  • Kravas paktu pārvaldniekā ir stabilizēta bloķēŔanas failu 4. versija (lockfile v4).
  • Cargo ir stabilizēta globālā keÅ”atmiņa ar informāciju par jaunāko datu lietojumu. KeÅ”atmiņa tiek mitināta mapē $CARGO_HOME/.global-cache, izmantojot SQLite, un tiek automātiski atjaunināta, lai atspoguļotu jaunākās izmaiņas indeksā, kastes failā, koda direktorijā, git klonā un git checkout.

Turklāt Borgo programmēŔanas valoda cenÅ”as bÅ«t izteiksmÄ«gāka nekā Go valoda, bet mazāk sarežģīta nekā Rust valoda. Borgo apvieno Go un Rust labākās Ä«paŔības, kompensējot katras valodas trÅ«kumus. Piemēram, Go ir vienkārÅ”s un saprotams, taču tas nenodroÅ”ina uzlabotas tipa droŔības funkcijas. Rust valoda nodroÅ”ina rÄ«kus droÅ”ai programmēŔanai, taču tā ir pārāk sarežģīta. Projektu izstrādā Marko Sampelgrini, rokasgrāmatas The Simple Haskell autors un nepārtrauktās integrācijas sistēmas Quad CI izstrādātājs.

Izlaista Rust 1.78. Borgo valoda, kas apvieno Go un Rust stiprās puses

Borgo izmanto statisko rakstīŔanu, Go lÄ«dzÄ«gus veidus un Rust lÄ«dzÄ«gu sintaksi. Semikoli nav obligāti Borgo koda rindu beigās. Borgo kods ir apkopots Go attēlojumā, kas ir pilnÄ«bā savietojams ar esoÅ”ajām Go pakotnēm. Kompilatora kods ir rakstÄ«ts Rust un tiek izplatÄ«ts saskaņā ar ISC licenci. izmantojiet fmt enum NetworkState { Loading, Failed(int), Success(T), } struct Response { virsraksts: virkne, ilgums: int, } fn main() { let res = Atbilde { virsraksts: "Sveika pasaule", ilgums: 0, } let state = NetworkState.Success(res) let msg = atbilst statusam { NetworkState.Loading => ā€œjoprojām tiek ielādētsā€, NetworkState.Failed(code) => fmt.Sprintf(ā€œIegÅ«ts kļūdas kods: %dā€, kods), NetworkState.Success (res) => res.title, } fmt.Println(msg)}

Avots: opennet.ru

Pievieno komentāru