Rust 1.97.0 iznāca 9. jūlijā un maina to, kā kompilators kodē funkciju nosaukumus gatavajā binārajā failā. Jaunā v0 simbolu kodēšanas shēma tagad ir noklusējums stabilajā Rust versijā. Vecā, uz Itanium ABI balstītā shēma paliek pieejama tikai ar atsevišķu karodziņu. Pilns saraksts ir oficiālajā laidiena pierakstā.
Pāreja sākās 2018. gadā ar Rust 1.59, kad izstrādātāji pievienoja izvēles karodziņu -Csymbol-mangling-version=v0. 2025. gada novembrī v0 kļuva par noklusējumu nightly kanālā. Ar versiju 1.97 tā nonāk stabilajā kanālā. Kopā tas ir astoņus gadus ilgs process.
Kāpēc simbolu kodēšana ir svarīga
Kompilators katram funkcijas nosaukumam piešķir unikālu simbolu, ko linkeris un atkļūdotāji izmanto binārajā failā. Rust ģeneriskās funkcijas rada problēmu. Viena ģeneriska funkcija var eksistēt daudzās variācijās atkarībā no tipa, ar kuru to izsauc. Vecajā shēmā ģeneriskā tipa informācija bija paslēpta aiz jaucējkoda. Kad programma avarēja, atkļūdotājs steka izdrukā rādīja neko nesakošu simbolu virkni.
v0 shēma saglabā ģenerisko parametru vērtības tieši simbolā. Steka izdrukā, profilētāja rezultātos vai perf atskaitē tagad redzams pilns tipa paraksts tur, kur agrāk bija tikai jaucējkods. Rust komanda norāda vēl vienu iemeslu: vecajā shēmā ne visas daļas izmantoja Itanium ABI, kas radīja nekonsekvenci starp dažādiem rīkiem.
Ģenerisko parametru instances tagad saglabā savas vērtības simbolā, nevis tiek izsekotas tikai aiz jaucējkoda.
Atšķirību redz uzreiz. Funkcija core::ptr::drop_in_place, izsaukta ar tipu Vec<String>, vecajā shēmā binārajā failā parādījās kā _ZN4core3ptr13drop_in_place17h4a2f9c...E ar jaucējkodu beigās. Divas dažādas instances atšķīrās tikai ar šo jaucējkodu, tāpēc profilētājā tās nebija iespējams atšķirt bez atsevišķas atkodēšanas tabulas. v0 shēmā tas pats simbols nes redzamu tipa parakstu, tāpēc perf vai flamegraph uzreiz parāda, kurš konkrētais tips patērē procesora laiku.
Kāpēc pāreja ilga astoņus gadus
Kavēšanās iemesls bija rīki, nevis pati shēma. Simbolus atkodē vesela rīku saime: Rust kompilators, GDB, LLDB, Valgrind, addr2line un dažādi profilētāji, kas nāk no plašākas Linux ekosistēmas. Katram no tiem bija jāiegūst v0 atkodētājs, pirms Rust to varēja ieslēgt pēc noklusējuma. Ja shēmu būtu nomainījuši ātrāk, daudzu izstrādātāju steka izdrukas būtu kļuvušas nelasāmas. Rust komanda gaidīja, līdz atbalsts nonāca stabilajās šo rīku versijās.
Kas var salūzt
Vecāki atkļūdotāji un profilētāji, kas nepazīst v0 formātu, simbolus vairs nespēs atkodēt un parādīs neapstrādātu virkni. Praksē tas skar senas GDB, LLDB vai profilēšanas rīku versijas. Risinājums ir atjaunināt rīku. Ja tas nav iespējams, projektu var atgriezt vecajā shēmā ar RUSTFLAGS="-Csymbol-mangling-version=legacy". Lielākajai daļai izstrādātāju nekas nav jādara, jo mūsdienu rīki v0 saprot jau vairākus gadus.
Cargo iegūst kontroli pār brīdinājumiem
Versija 1.97 stabilizē build.warnings konfigurāciju. Tagad var iestatīt, kā Cargo apstrādā kompilatora brīdinājumus: klusēt (allow), rādīt bez kļūdas (warn, noklusējums) vai uzskatīt par kļūdām (deny). To pašu var darīt ar vides mainīgo CARGO_BUILD_WARNINGS.
Šis iestatījums neatceļ būves kešatmiņu. Refaktorēšanas laikā var palaist CARGO_BUILD_WARNINGS=allow cargo check, lai īslaicīgi apslēptu brīdinājumus bez pilnas pārbūves. CI plūsmā komanda CARGO_BUILD_WARNINGS=deny kopā ar --keep-going savāc visas kļūdas vienā piegājienā, nevis apstājas pie pirmās.
Linkera ziņojumi vairs nav paslēpti
Līdz šim rustc pēc veiksmīgas saites klusēja linkera izvadi. Rust blogs atzīst, ka tas var noslēpt reālas problēmas. No versijas 1.97 linkera ziņojumi parādās kā brīdinājumi. Ja izvade traucē, to var apklusināt ar linker_messages lint iestatījumu failā Cargo.toml.
Jaunas bitu operāciju metodes
Standartbibliotēka pievieno vairākas bitu manipulācijas metodes visiem veseliem skaitļiem un to NonZero variantiem. Pilnu sarakstu ar stabilizētajām API uzskaita releases.rs izmaiņu pieraksts:
highest_oneunlowest_oneatgriež augstāko vai zemāko iestatīto bitu kā skaitliisolate_highest_oneunisolate_lowest_oneatstāj skaitlī tikai vienu bitubit_widthatgriež bitu skaitu, kas vajadzīgs skaitļa attēlošanai
Agrāk šīs operācijas nācās rakstīt manuāli ar bitu nobīdēm un leading_zeros izsaukumiem. Tagad tās ir standartbibliotēkā. Papildus char::is_control tagad darbojas const kontekstā, tāpēc simbolu var pārbaudīt jau kompilēšanas laikā.
Kā pāriet uz jauno versiju
Jaunināšana notiek ar vienu komandu: rustup update stable. Rust izdod jaunu stabilo versiju ik pēc sešām nedēļām, tāpēc 1.97 iznāca precīzi pēc grafika. Projektos, kas piesaistīti konkrētai versijai caur rust-toolchain.toml, pāreja uz v0 nenotiks, kamēr faila versija netiks paaugstināta. Vislielāko labumu no lasāmajiem simboliem gūst lielas kodu bāzes ar dziļām ģeneriskām hierarhijām, kur vecais jaucējkods padarīja avāriju izdrukas praktiski nelietojamas. Mazākos projektos izmaiņa paliek nemanāma līdz pirmajai reizei, kad kaut kas avarē profilēšanas laikā.
Pārējie sīkumi
Cargo iegūst -m saīsni --manifest-path vietā un stabilizē resolver.lockfile-path konfigurāciju pielāgotam bloķēšanas faila ceļam. Rustdoc stabilizē --emit un --remap-path-prefix karodziņus. Nākamā versija, 1.98, beta statusā ir jau tagad un stabilajā kanālā gaidāma 20. augustā.
Komentāri
Šim rakstam vēl nav komentāru. Esi pirmais, kurš dalās ar savu viedokli.