Tratați legăturile Wasm ca pe un contract binar cu versiune
Corectarea ABI C pentru Wasm în Rust arată de ce modulul și codul de legătură trebuie livrate împreună. Verificați compatibilitatea cu versiunea compilatorului.
Codul de legătură generat face parte din contractul binar al unui modul Wasm. Când compilatorul schimbă felul în care valorile trec această limită, păstrarea funcției sursă nu dovedește compatibilitatea. Livrați și păstrați modulul împreună cu acel cod care știe să îl apeleze și includeți asocierea în evidența lansării.
Privind retrospectiv din noiembrie 2026, anunțul Rust din 4 aprilie 2025 prezenta o corecție viitoare a ABI C pentru wasm32-unknown-unknown. Nu anunța că schimbarea fusese deja livrată în versiunea stabilă. Rust 1.89.0, lansat pe 7 august 2025, a confirmat ulterior conformitatea ABI cu standardul. O descriere a migrării are nevoie de ambele date.
Organizarea datelor nu stabilește tot apelul
O interfață binară între aplicații, numită ABI, descrie reprezentarea argumentelor și a rezultatelor când un cod apelează alt cod. Înțelegerea comună a câmpurilor unei structuri este doar o parte a acordului. Codul apelant și cel apelat trebuie să convină și dacă structura circulă prin valori separate sau prin memorie.
Anunțul din aprilie ilustrează diferența cu o structură care conține două câmpuri întregi. Convenția Rust anterioară separa argumentul în două argumente Wasm; convenția C standard îl transmitea indirect, prin memoria liniară. Operația din sursă putea rămâne o adunare în ambele cazuri, în timp ce gazda avea nevoie de altă secvență de apelare.
De aceea, o declarație repr(C) nu poate dovedi singură că legătura JavaScript scrisă manual este corectă. Organizarea în memorie și transformarea semnăturii funcției sunt părți separate ale limitei. O integrare care fixează în cod forma veche a apelului poate eșua chiar dacă sursa Rust și calculul dorit par neschimbate la citire.
Articolul privește limita dintre compilator și codul de legătură generat. Nu compară medii de execuție Wasm, nu prescrie permisiuni pentru extensii și nu evaluează dacă un compilator mic este potrivit pentru producție. Aceste decizii sunt diferite și cer alte dovezi.
Avertismentele pregăteau schimbarea
Modificarea care adăuga avertismentul de compatibilitate viitoare a fost integrată pe 26 martie 2025. Rolul ei era să identifice apelurile și definițiile afectate înainte de tranziție. Integrarea unui avertisment în depozitul compilatorului dovedește pregătirea, nu adoptarea noului ABI într-un compilator stabil.
Articolul din aprilie descria testarea migrării cu un compilator nightly potrivit și modul conform specificației. Era un sfat pentru starea tranziției de atunci. Pentru o intervenție de mentenanță în noiembrie 2026, porniți de la compilatorul folosit efectiv de produs și de la comportamentul versiunii sale. Repetarea instrucțiunilor istorice pentru nightly, fără verificarea contextului, ar transforma o dovadă utilă într-o îndrumare operațională învechită.
Distincția se aplică și codului de legătură generat. Anunțul spune că wasm-bindgen își schimbase deja modul de generare spre sfârșitul anului 2023. Asta nu stabilește versiunea folosită de o anumită aplicație. O dependență indirectă sau un fișier generat păstrat poate conține încă presupuneri vechi. Examinați versiunile rezolvate și fișierele generate, nu vă bazați pe numele bibliotecii.
Unitatea de livrare include codul apelant
Să luăm o aplicație web ilustrativă care servește un fișier Wasm și un înveliș JavaScript generat. Reconstruirea doar a modulului poate lăsa codul vechi să apeleze o interfață nouă. Chiar și reconstruirea ambelor fișiere poate produce combinații nepotrivite dacă sunt păstrate independent în cache. Sunt scenarii de compatibilitate, nu defecțiuni observate într-un produs instalat.
Evidența propusă pentru lansare ar trebui să identifice compilatorul, generatorul legăturilor și cele două fișiere rezultate. Folosiți o livrare care păstrează codul apelant asociat cu modulul pentru care a fost generat. Numele bazate pe conținut pot ajuta la identificarea asocierii, dar aplicația trebuie tot să încarce perechea potrivită și să păstreze perechile necesare revenirii la o versiune anterioară.
O verificare de acceptare ar trebui să folosească interfața publică prin codul de legătură real. Compilarea Rust reușită verifică doar o parte. Simpla creare a instanței modulului poate rata și ea o nepotrivire care apare la apelarea unei funcții afectate. Alegeți apeluri reprezentative care folosesc forma schimbată a semnăturii și verificați rezultatele față de contractul agreat.
Pentru o interfață cu gazda întreținută manual, documentați responsabilitatea pentru memorie și durata ei de viață alături de reprezentarea argumentelor. Înlocuirea unei structuri transmise prin valoare cu un pointer poate muta muncă în codul apelant, inclusiv pregătirea memoriei și menținerea ei validă pe durata apelului. Schimbarea cere proiectarea integrării; nu ar trebui prezentată ca o simplă înlocuire de text.
Fixarea versiunii poate câștiga timp
Cel mai puternic contraargument este operațional: un produs existent poate avea un compilator și o pereche generată care funcționează, fără un motiv imediat de reconstruire. Fixarea versiunii compilatorului poate amâna tranziția și poate evita combinarea presupunerilor incompatibile într-o lansare fără legătură. Chiar anunțul din aprilie prezenta fixarea versiunii drept un posibil răspuns temporar.
Costul este migrarea amânată. Fixarea nu face interfața veche conformă cu standardul, iar o actualizare viitoare a compilatorului are în continuare nevoie de un responsabil. Păstrați motivul fixării, funcțiile exportate afectate și condiția eliminării restricției. Evitați să prezentați înghețarea pe termen nelimitat drept o strategie de compatibilitate încheiată.
Și domeniul schimbării este restrâns. Anunțul privește extern "C" pe wasm32-unknown-unknown; nu spune că toate platformele Rust sau toate aplicațiile Rust Wasm s-au schimbat la fel. O aplicație care nu traversează limita afectată nu ar trebui să preia muncă de migrare doar fiindcă folosește WebAssembly.
În dezvoltarea de software la comandă, cereți dovezi că modulul și codul apelant livrate respectă același contract, plus o pereche recuperabilă pentru revenire. Pentru acest articol nu s-a făcut nicio compilare și niciun experiment de compatibilitate. Corecția istorică oferă motivul verificării; fișierele produsului trebuie să ofere dovada că următoarea lansare încă funcționează.
Paul