Un compilator mic face vizibilă limita dintre sursă și Wasm
Urmăriți o expresie aritmetică ilustrativă până la modulul Wasm. Înțelegeți validarea și codificarea fără să transformați codul foarte scurt într-o regulă.
Valoarea unui compilator foarte mic este că puteți vedea trecerea de la un limbaj sursă la un modul executabil. Lungimea codului reprezintă o constrângere interesantă pentru un material didactic. Este însă un criteriu slab pentru alegerea instrumentelor de compilare pe care o firmă trebuie să le întrețină.
Tutorialul Wasm from the Ground Up, datat 24 ianuarie 2025, prezintă un compilator JavaScript compact pentru expresii aritmetice în notație poloneză inversă. Privit din noiembrie 2026, exemplul arată ce îi promite fiecare etapă celei următoare. Expresia de mai jos este explicit ilustrativă; nu relatează rularea compilatorului autorilor sau un experiment AL+.
Porniți de la un limbaj pe care îl puteți descrie complet
Folosiți 2 3 +. În notația poloneză inversă, operanzii precedă operația. Împărțirea acestui șir deliberat simplu la spații produce trei elemente, numite aici tokenuri. Primele două reprezintă numere întregi, iar ultimul reprezintă adunarea. Nu apare o problemă de prioritate a operatorilor, deoarece operația consumă cele două valori deja disponibile.
Simplitatea este o alegere de limbaj. Evită definirea parantezelor, a priorității din notația obișnuită și a căutării variabilelor. Nu justifică acceptarea oricărui șir ca program. Un exercițiu didactic util este să precizați exact ce tokenuri sunt permise și ce se întâmplă dacă secvența nu poate produce un singur rezultat.
De exemplu, implementarea are nevoie de o regulă pentru operanzi lipsă sau valori suplimentare. Trebuie și să distingă un număr scris greșit de o operație neacceptată. Respingerea intrării la această limită poate oferi o explicație mai bună decât trimiterea unui rezultat incorect către mediul de execuție, cu speranța că eroarea va arăta problema inițială. Acestea sunt cerințe propuse pentru extinderea exemplului didactic.
Din tokenuri se formează instrucțiuni, apoi un modul
Pentru acest exemplu, secvența conceptuală pune pe stivă întregul 2, pune întregul 3 și le adună. Descrierea stivei explică dependența: după primul token există o valoare, după al doilea există două, iar adunarea le consumă și lasă una. Rezultatul urmărit este 5, dedus aici prin calcul, nu observat prin execuție.
Modulul mai are nevoie de structura exterioară. Specificația formatului binar WebAssembly separă tipurile funcțiilor, declarațiile, exporturile și corpurile de cod în secțiuni. Pentru această variantă didactică, descrieți o funcție fără parametri, cu un rezultat întreg. Asociați declarația cu acel tip și puneți secvența de instrucțiuni în corpul funcției. Antetul modulului identifică formatul înainte de citirea secțiunilor.
Un export face legătura cu programul gazdă. O funcție poate exista în modul fără să fie disponibilă codului JavaScript sub numele ales de apelant. Exportul asociază un nume cu indicele funcției. Documentarea acestei legături face interfața externă explicită, în loc să lase apelantul dependent de un șir de octeți neexplicat.
Specificația indicată se poate modifica și afișează în prezent o revizie din noiembrie 2026. Explică formatul; nu dovedește că toate funcționalitățile reviziei aparțineau tutorialului din ianuarie 2025. Exemplul de aici folosește doar interfața restrânsă a unei funcții cu rezultat întreg, necesară argumentului.
Lungimea în octeți ține de corectitudine
Specificația valorilor binare descrie codificările numerelor întregi, inclusiv LEB128. Un număr reprezentat ca valoare JavaScript nu este automat reprezentarea sa binară corectă. Lungimile secțiunilor, numărul elementelor și constantele întregi au reguli de codificare pe care generatorul trebuie să le respecte.
Valorile din 2 3 + simplifică explicația, fiind mici. Un compilator didactic care emite o constantă printr-un singur octet imediat nu devine general doar pentru că acceptă șiruri zecimale mai lungi. Constantele întregi cu semn și lungimile fără semn trebuie codificate după regulile lor. O intrare mai mare poate mări și lungimea codificată a secțiunii; corectarea constantelor nu ar fi suficientă.
Aici codul scurt poate ascunde o presupunere amplă. O expresie comprimată poate funcționa într-un interval restrâns, deși pare un traducător aritmetic general. Explicați intervalul acceptat înainte să încurajați reutilizarea. Respingerea explicită a valorilor din afara lui ajută mai mult decât o implementare compactă a cărei gramatică aparentă promite prea mult.
Validarea are un rol separat
Regulile de validare a instrucțiunilor impun condiții asupra tipurilor operanzilor și rezultatelor. Octeții corect formați nu ajung dacă instrucțiunile nu respectă cerințele stivei sau corpul funcției nu corespunde rezultatului declarat. Verificările limbajului sursă și validatorul modulului protejează limite diferite.
Pentru expresia ilustrativă, raționamentul este simplu: adunarea întreagă propusă are cei doi operanzi necesari și lasă tipul de rezultat urmărit. Acest raționament nu certifică un compilator general. Nu spune cum tratează analiza sursei toate șirurile, toate limitele întregilor sau operatorii neașteptați.
Dacă extindeți exercițiul, păstrați separat erorile sursei și erorile construirii modulului. Dacă un program sursă acceptat produce un modul invalid, investigați generatorul. Dacă programul încalcă gramatica restrânsă, explicați problema apelantului. Un singur mesaj generic pentru ambele situații îngreunează mentenanța ulterioară.
În producție contează instrumentele întreținute
Cel mai puternic contraargument este practic: majoritatea produselor ar trebui să folosească un generator sau compilator întreținut, în loc să construiască manual secțiunile binare. O parte importantă a muncii asupra formatului ajunge astfel la o implementare cu obiective mai largi. Rămân necesare limite clare ale limbajului sursă și un comportament util la eroare, dar scurtarea extremă a codului nu mai devine obligație de mentenanță.
Un compilator demonstrativ își justifică locul când scopul este înțelegerea transformării. Gramatica, intervalul numeric și funcționalitățile absente trebuie explicate lângă exemplu. În dezvoltarea software la comandă, folosiți această înțelegere pentru a verifica interfața modulului și erorile sale posibile. Alegeți instrumentele de producție după corectitudine, suport și costul schimbărilor viitoare; numărul de caractere poate rămâne constrângerea tutorialului.
Paul