Rust 1.97.0 iznāca 9. jūlijā, un tas maina vienu lietu, ko lielākā daļa izstrādātāju nekad tieši neredz, kamēr programma neavārē: to, kā kompilators nosauc funkcijas gatavajā binārfailā. No šīs versijas pēc noklusējuma ir ieslēgta tā sauktā v0 simbolu kodēšana. Praktiskā atšķirība parādās steka izsekumā — ģenerisko tipu parametri tur tagad ir salasāmi, nevis paslēpti aiz jaucējkoda.
Līdz šim Rust izmantoja kodēšanas shēmu, kas balstīta uz Itanium ABI — to pašu, ko lieto C++. Tā tika izstrādāta cita valoda un citām vajadzībām, tāpēc Rust ģeneriskos tipus nespēja saglabāt tieši un tos noglabāja aiz jaucējvērtības. Kad kaut kas nogāja greizi, izsekumā redzēji šifrētu virkni, no kuras nebija skaidrs, ar kādu konkrētu tipu funkcija tika izsaukta.
Ko dara simbolu kodēšana
Kompilators katrai funkcijai bināfailā piešķir unikālu vārdu. Tas vajadzīgs saitētājam (linker), atkļūdotājam un steka izsekumiem, lai atšķirtu, piemēram, divas dažādas Vec::push instances dažādiem tipiem. Ģeneriskā koda gadījumā viena un tā pati funkcija kompilējas daudzās versijās, un katrai jādod atsevišķs vārds.
Vecajā shēmā tipa informācija tika saspiesta jaucējkodā. v0 shēmā tipa parametru vērtības tiek saglabātas pašā vārdā. Rust komanda raksta, ka ģenerisko parametru instancijas tagad saglabā savas vērtības, nevis tiek uzskaitītas tikai aiz jaucējkoda. Rezultātā rustc ģenerētos vārdus var atkodēt bez papildu triku, un atkļūdotājs parāda pilnu tipa parakstu.
Atšķirību vislabāk redz avārijas izsekumā. Ar veco shēmu Vec<MyStruct>::push izsaukums izsekumā parādījās ar jaucējsufiksu, kas beidzās, piemēram, ar 17h9c2f..., un konkrētais tips MyStruct tur nekur nebija redzams. Ar v0 tipa vārds paliek simbolā, tāpēc atkļūdotājs un profilētājs uzreiz rāda, ka izsaukta tieši MyStruct versija, nevis kāda cita push instancija. Tas ietaupa laiku, kad kodā ir desmitiem viena veida funkcijas dažādiem tipiem.
Astoņu gadu ceļš līdz noklusējumam
v0 shēma nav jauna. Priekšlikums RFC 2603 tika uzrakstīts 2018. gadā. Kā izvēles iespēju to varēja ieslēgt jau kopš Rust 1.59 (2022. gads) ar karogu -Csymbol-mangling-version=v0. Uz nightly būvējumiem tā kļuva par noklusējumu 2025. gada novembrī. 1.97 ir pēdējais solis — stabilajā laidienā.
Vecā shēma paliek pieejama, taču tikai uz nightly. Stabilajā Rust legacy kodēšanu vairs nevar padarīt par noklusējumu.
Portāls Linuxiac norāda, ka pāreja neietekmē uzrakstīto kodu — mainās tikai tas, kā kompilators nosauc simbolus izvadē. Instrumentiem, kas parsē binārfailu simbolus (profilētāji, perf, atkļūdotāji), var būt vajadzīga jaunāka versija, lai jaunos vārdus atkodētu pareizi.
Tik ilgais pārejas laiks skaidrojams ar to, ka simbolu vārdi ir daļa no rīku ekosistēmas. Būvēšanas sistēmas, saitētāji, atkļūdotāji un profilēšanas rīki visi lasa šos vārdus, un shēmas maiņa prasīja, lai tie visi prastu atkodēt v0. Tāpēc Rust komanda vispirms deva to kā izvēles karogu, tad ilgi turēja nightly būvējumos un tikai pēc tam pārslēdza stabilo laidienu. Kas turpina lietot veco shēmu ar -Csymbol-mangling-version=legacy, to var darīt tikai uz nightly.
Cargo tagad kontrolē brīdinājumus
1.97 pievieno arī build.warnings konfigurāciju. Tā nosaka, kā Cargo apstrādā brīdinājumus no vietējām pakotnēm, un tai ir trīs līmeņi: allow tos noklusē, warn tos rāda, nesabojājot būvējumu (noklusējums), un deny liek būvējumam izgāzties. To pašu var uzstādīt caur vides mainīgo CARGO_BUILD_WARNINGS=deny. Šis iestatījums neatspēko esošo būvējuma kešatmiņu, tāpēc to var ieslēgt un izslēgt bez pilnas pārkompilēšanas.
Praktiski tas noder CI konveijeros, kur komanda grib prasīt kodu bez brīdinājumiem, bet neuzspiest to katram izstrādātājam lokāli.
Labots kļūdains pin! makro
1.97 aizver arī vienu drošuma robu makro pin!. Kopš Rust 1.88.0 rakstot pin!(x), kur x ir tips &mut T, kompilators dažreiz atļāva deref piespiešanu (deref coercion), kas noveda pie nedrošas atmiņas piekļuves. No 1.97 tāds izsaukums dod Pin<&mut &mut T> un piespiešana vairs nenotiek. Kods, kas paļāvās uz veco uzvedību, tagad var nekompilēties, tāpēc pēc atjaunināšanas ir vērts pārbaudīt vietas, kur pin! tiek lietots ar atsauci.
Saitētāja ziņojumi kļūst redzami
Vēl viena maiņa: saitētāja izvade tagad pēc noklusējuma parādās kā brīdinājums zem lint nosaukuma linker_messages. Agrāk šie ziņojumi bieži pazuda. Ja tie traucē, tos var apklusināt, pievienojot Cargo.toml failam:
[lints.rust]
linker_messages = "allow"
Papildus stabilizēti daži nelieli API. Cipariem klāt nāca bitu operācijas isolate_highest_one, isolate_lowest_one, highest_one, lowest_one un bit_width, kā arī to NonZero varianti. char::is_control tagad strādā const kontekstā, un RepeatN ieguva Default implementāciju.
Kas jāatceras, atjauninoties: ja komanda izmanto ārējus rīkus binārfailu analīzei, pārbaudi, vai tie prot v0. Pretējā gadījumā steka izsekumā tipu vietā redzēsi neatkodētus simbolus. Rust 1.97 lejupielāde pieejama caur rustup update stable.
Komentāri
Šim rakstam vēl nav komentāru. Esi pirmais, kurš dalās ar savu viedokli.