Cum funcționează mașina virtuală ActionScript

Dacă sunteți implicat în dezvoltarea AS3, este posibil să fi auzit despre o mașină virtuală care trăiește în Flash Player sau despre așa-numitul octet codul în care se transformă codul. Dar exact ce sunt?

O parte semnificativă a Flash Player este AVM - mașina virtuală ActionScript. Când compilați codul AS3, acesta se transformă într-un set de instrucțiuni binare, numit bytecode, care este încorporat în SWF-ul produs. În timp ce un utilizator încarcă SWF în Flash Player, AVM analizează bytecode-ul și îl execută pas cu pas.

Să examinăm procesul într-un mod mai detaliat: Aruncați o privire la următoarea afirmație și imaginați-vă că vrem să o executăm (calculați rezultatul și alocați-l "foo"):

foo = 2 + 3 * 4;

Din punctul de vedere al omului, această linie înseamnă "Multiplicați 3 până la 4, adăugați 2 la rezultat și atribuiți-l unei variabile numite foo".

Pe de altă parte, dacă un computer citește această linie, ar stoca ca "caracter f, urmat de caracterul o, urmat de caracterul o, urmat de spațiul de caractere, urmat de caracter egal, urmat de". " Si asa mai departe. În această stare aceste informații sunt destul de inutile și trebuie luate măsuri suplimentare pentru a transforma declarația în ceva pe care o mașină o poate executa. Practic, ceea ce trebuie să facem este să compilam codul sursă.


Compilatorul

După cum am menționat anterior, afirmația de mai sus este codul sursă brut, o colecție de caractere care nu înseamnă nimic pentru un computer. Pentru a obține informații utile trebuie să executăm codul prin câteva proceduri. În primul rând, ar trebui să transformăm fluxul de caractere în cuvinte și al doilea, să transformăm cuvintele în propoziții.

Primul pas de a transforma caracterele în cuvinte este realizat de un tokenizor care practic efectuează o analiză lexicală a codului sursă. Acesta rulează personajele și le grupează în serii de "jetoane" (și determină, de asemenea, tipul lor - identificatori, operatori, constante?). După ce tokenizer-ul (numit și un lexer BTW) își termină treaba, obținem o matrice care poate fi ilustrată astfel:

[Identifier foo] [Operator egal] [Integer 2] [Operator plus] [Integer 3] [Operator multiplicat] [Integer 4]

Aceasta este o structură de nivel superior care conține "cuvinte" în locul caracterelor brute.

Jetoanele rezultate sunt introduse într-un parser. Efectuează analiza semantică a jetoanelor și le asamblează în instrucțiunile mașinii. Cuvintele mai simple construiesc propoziții din cuvintele (jetoanele) și înțeleg din ele (adică compilează instrucțiuni din ele). De exemplu, dacă parserului i se dă o declarație 2 + 3; i ++; ca jetoane parserul trebuie să separe mai întâi tocurile în "propoziții" (2 + 3 și i ++) și apoi să le înțeleagă (prima este operația de adăugare și a doua este o creștere). După ce înțelegem instrucțiunea, putem compila instrucțiuni către mașină din intrare.

După parsarea jetoanelor șirului nostru, primim următoarele instrucțiuni:

împingeți 2 împingeți 3 împingeți 4 multiplicați adăugați atribuiți "foo"

Acestea sunt instrucțiuni pe care un computer le poate executa. Comprimați-l într-un format binar și aveți un octet. Bytecode este o listă cu instrucțiunile că o mașină este foarte bună la procesare și când este procesată pentru a obține rezultatele dorite.


Interpretul

După ce am compilat codul sursă la octet, îl putem executa cu o mașină virtuală. VM este un software care execută instrucțiunea bytecode câte o instrucțiune, deci hai să trecem prin interpretarea afirmației noastre:

  1. împingeți 2 -- Comanda este de a împinge numărul 2 în teanc. VM menține o stivă în timpul execuției, pe care comenzile pot funcționa, adică pentru a împinge și a scoate valorile (http://en.wikipedia.org/wiki/Stack_(data_structure)). În prezent, stack-ul arată astfel: [2]
  2. împingeți 3 -- împingeți un alt număr întreg în teanc. Acum se pare că [2, 3];
  3. împingeți 4 -- împingeți încă un întreg în stivă. Acum se pare că [2, 3, 4];
  4. multiplica -- această comandă afișează 2 valori de pe teanc, îi înmulțește și împinge rezultatul în stivă. Se afișează valorile 3 și 4 (care sunt în prezent în partea superioară a teancului), le înmulțește și împinge rezultatul 12 în teanc. Aceasta afectează teancul de a arăta ca [2, 12];
  5. adăuga -- probabil că ați ghicit-o: Comanda pop 12 și 2 de pe teanc, le adaugă și împinge rezultatul 14 în stivă. Acum doar 14 rămân în interiorul stivei.
  6. atribuie "foo" -- Această comandă afișează o valoare din stivă și o atribuie unei variabile numite foo. Deci, acum variabila foo conține valoarea de 14 și stiva este goală.

Asta e! Acesta este un exemplu de o declarație extrem de simplă executată de o mașină virtuală extrem de simplă. Să examinăm un exemplu ușor mai complicat:

bar = 12 / (4 + 2) - (6 - 9) * 3

Acest lucru se poate compila la (spun "poate" deoarece există diferite moduri de a compila declarația):

împingeți 12 împingeți 4 împingeți 2 adăugați împărți împingeți 6 împingeți 9 scade împingeți 3 multiplicați scădeați atribuiți "bar"

Acest lucru va fi interpretat ca:

  1. Primele 3 împingeri vor fi adăugate la stack: [12, 4, 2]
  2. adăuga -- va însuma cele 2 valori din partea de sus a stivei: [12, 6]
  3. divide -- va pop 6, apoi pop 12, împărțiți 12 cu 6 și împingeți rezultatul la stivă: [2]
  4. Următoarele două comenzi vor împinge întregi în stivă: [2, 6, 9]
  5. scădea -- va scade cele 2 numere din partea de sus a stivei. Vor apărea 9, apoi 6, apoi scade 6 din 9 și împing rezultatul la stivă: [2, -3]
  6. Un alt număr întreg va fi împins la stack: [2, -3, 3]
  7. multiplica -- va afișa și multiplica cele două numere din partea superioară a teancului. -9, care este de 3 ori -3, va fi împins înapoi la stivă: [2, -9]
  8. scădea -- va scade -9 de la 2 și va împinge rezultatul în stivă: [11]
  9. atribui -- va afișa 11 și îi va atribui unei variabile numite "bar". Stack-ul este acum gol.

Rezultatul este acum stocat într-o variabilă numită "bar" și este 11. Yay!


Concluzie

Aceasta este cea mai de bază informație despre un VM, ar putea fi util atunci când începeți să învățați niște chestii Flash Player de nivel scăzut. VM-ul din Flash Player este, desigur, mult mai complex, dar baza este aceeași ca în exemplul prezentat mai sus.

Dacă doriți să aflați mai multe despre mașina virtuală ActionScript, puteți să consultați acest document PDF Adobe. Vă mulțumim pentru lectură!

Cod