Rust 1.78 lage. Borgo lang ki konbine fòs Go ak Rust

Yo te pibliye piblikasyon langaj pwogramasyon jeneral Rust 1.78, ki te fonde pa pwojè Mozilla, men kounye a devlope sou ejid òganizasyon endepandan ki pa pou pwofi Rust Foundation. Lang la konsantre sou sekirite memwa epi li bay mwayen pou reyalize gwo paralèl nan ekzekisyon travay, pandan y ap evite itilizasyon yon pèseptè fatra ak tan exécute (se redui tan an nan inisyalizasyon debaz ak antretyen nan bibliyotèk la estanda).

Teknik jesyon memwa Rust yo libere pwomotè a soti nan erè manipilasyon konsèy epi pwoteje kont pwoblèm ki rive nan manipilasyon memwa ki ba-nivo, tankou aksè apre-gratis, dereferans pointer nil, depase tanpon, ak lòt bagay. Pou distribye bibliyotèk, asire asanble ak jere depandans, pwojè a ap devlope manadjè pake kago. Repozitwa crates.io sipòte pou hosting bibliyotèk.

Sekirite memwa aplike nan Rust nan moman konpile atravè chèk referans, swiv pwopriyetè objè, konsiderasyon pou tout lavi objè (delimitasyon) ak evalyasyon aksè memwa nan tan exécution. Rust tou bay pwoteksyon kont debòde nonb antye relatif, mande pou valè varyab yo dwe inisyalize anvan yo itilize, gen pi bon manyen erè nan bibliyotèk estanda a, sèvi ak konsèp nan referans imuiabl ak varyab pa default, epi li ofri fò sezisman estatik pou minimize erè lojik.

Prensipal inovasyon:

  • Yo pwopoze yon nouvo espas non atribi "#[dyagnostik]", ki bay yon mwayen pou enfliyanse mesaj erè ki te pwodwi pa du a. Premye a nan nouvo espas la se "#[diagnostic::on_unimplemented]" atribi, ki ka itilize pou personnaliser mesaj erè yo jete nan yon sitiyasyon kote ou bezwen sèvi ak yon karakteristik ki pa aplike pou kalite a. #[diagnostic::on_unimplemented( message = "Mesaj mwen an pou `ImportantTrait<{A}>` pa aplike pou `{Self}`", label = "Label mwen", nòt = "Nòt 1", nòt = "Remak 2" )] trait ImportantTrait {} fn use_my_trait(_: impl ImportantTrait ) {} fn main() { use_my_trait(String::new()); } erè[E32]: Mesaj mwen pou `ImportantTrait ` pa aplike pou `String` —> src/main.rs:0277:32 | 12 | use_my_trait(String::new()); | ———— ^^^^^^^^^^^^^ My Label | | | obligatwa pa yon limit prezante pa apèl sa a | = èd: karakteristik la `ImportantTrait ` pa aplike pou `String` = nòt: Nòt 18 = nòt: Nòt 12
  • Chèk pre-afime aplike nan fonksyon ki pa an sekirite kounye a ka difere jiskaske jenerasyon kòd, sa ki pèmèt chèk sa yo dwe fèt san yo pa bezwen bati bibliyotèk estanda a nan mòd "#[cfg(debug_assertions)]". Pou deklanche chèk, kounye a li ase pou pèmèt debug afimasyon pou tès oswa debug bati nan kòd ou a.
  • Konpòtman an nan fonksyon nan bibliyotèk la estanda ki afekte aliyman nan endikasyon ak tranch se kounye a previzib nan ègzekutabl epi li depann de done yo antre. Fonksyon pointer::align_offset, ki kalkile konpanse a pou aliman pointer la, kounye a retounen use::MAX sèlman si operasyon an echwe. Fonksyon slice::align_to ak slice::align_to_mut tou de, ki transfòme tranch nan yon reprezantasyon ak yon tranch mitan ki aliyen ak tranch orijinal yo kòmanse ak fen, kounye a toujou retounen pi gwo pati mitan an.
  • Sa ki annapre yo te transfere nan kategori ki estab:
    • impl Li pou &Stdin
    • Pèmèt itilizasyon yon lavi ki pa estatik (ki pa estatik) pou kèk aplikasyon std::error::Error ki gen rapò.
    • Impl aplikasyon ?Valè gwosè yo pèmèt.
    • impl Soti nan pou io::Erè
  • Fonksyon Barrier::new() te estabilize pou itilize ak atribi "const" nan nenpòt kontèks olye pou yo konstan.
  • Pou platfòm sib x86_64-pc-windows-msvc, i686-pc-windows-msvc, x86_64-pc-windows-gnu, i686-pc-windows-gnu, x86_64-pc-windows-gnullvm ak i686_10-pc-windows-gnullvm-scgnu-windowm kounye a mande pou omwen Windows XNUMX vèsyon.
  • Yo te aplike twazyèm nivo sipò pou platfòm wasm32-wasip2, arm64ec-pc-windows-msvc, armv8r-none-eabihf ak loongarch64-unknown-linux-musl. Twazyèm nivo a enplike sipò debaz, men san yo pa tès otomatik, pibliye bati ofisyèl, oswa tcheke si kòd la ka bati.
  • Dezyèm nivo sipò pou platfòm sib Add wasm32-wasip1 te aplike. Dezyèm nivo sipò enplike yon garanti asanble.
  • Yo te chanje non platfòm wasm32-wasi-preview1-threads pou wasm32-wasip1-threads.
  • Konpilatè a te chanje pou itilize LLVM 18. Lè w ap itilize LLVM 18 pou achitekti x86-32 ak x86-64, ABI ki asosye ak kalite u128 ak i128 yo te chanje.
  • Nan manadjè kago pak la, vèsyon 4 nan dosye fèmen (lockfile v4) te estabilize.
  • Kago gen yon kachèt mondyal estabilize ak enfòmasyon sou dènye itilizasyon done yo. Kachèt la akomode nan $CARGO_HOME/.global-cache lè l sèvi avèk SQLite epi li mete ajou otomatikman pou reflete dènye chanjman ki fèt nan endèks la, fichye kès, anyè kòd, script git, ak git kesye.

Anplis de sa, lang nan pwogram Borgo eseye gen plis ekspresyon pase lang Go a, men mwens konplèks pase lang nan Rust. Borgo konbine pi bon karakteristik Go ak Rust, pou fè fas ak enpèfeksyon chak lang. Pou egzanp, Go se senp epi dwat, men li pa bay karakteristik sekirite avanse kalite. Lang Rust bay zouti pou pwogramasyon an sekirite, men li twò konplike. Pwojè a ap devlope pa Marco Sampellegrini, otè de The Simple Haskell Handbook ak pwomotè Quad CI sistèm entegrasyon kontinyèl la.

Rust 1.78 lage. Borgo lang ki konbine fòs Go ak Rust

Borgo sèvi ak sezisman estatik, kalite Go-tankou, ak sentaks tankou Rust. Pwent-virgul yo opsyonèl nan fen liy nan kòd Borgo. Kòd Borgo konpile nan yon reprezantasyon Go ki konplètman konpatib ak pakè Go ki deja egziste. Kòd konpilatè a ekri nan Rust epi li distribye anba lisans ISC. itilize fmt enum NetworkState { Loading, Failed(int), Success(T), } struct Response { title: string, duration: int, } fn main() { let res = Response { title: "Bonjou mond", dire: 0, } let state = NetworkState.Success(res) kite msg = matche ak eta { NetworkState.Loading => "toujou chaje", NetworkState.Failed(kòd) => fmt.Sprintf("Gen kòd erè: %d", kòd), NetworkState.Success (res) => res.title, } fmt.Println(msg) }

Sous: opennet.ru

Add nouvo kòmantè