Slik fungerer ActionScript Virtual Machine

Hvis du er involvert i AS3-utvikling, kan det hende du har hørt om en virtuell maskin som bor i Flash Player eller den såkalte bytecodeen som koden din blir forvandlet til. Men hva er de egentlig?

En betydelig del av Flash Player er AVM - ActionScript Virtual Machine. Når du kompilerer AS3-koden, blir den omdannet til et binært instruksjonssett, kalt bytecode, som er innebygd i den produserte SWF-en. Som bruker laster SWF inn i Flash Player, analyserer AVM bytekoden og utfører den trinnvis.

La oss undersøke prosessen litt mer detaljert: Ta en titt på følgende setning og forestill deg at vi vil utføre det (beregne resultatet og tildele det til "foo"):

foo = 2 + 3 * 4;

Fra et menneskes synspunkt betyr denne linjen "Multiply 3 by 4, add 2 til resultatet og tilordne det til en variabel som heter foo".

På den annen side, hvis en datamaskin leser denne linjen, vil den lagre den som "tegn f, etterfulgt av tegn o, etterfulgt av tegn o, etterfulgt av tegnrom, etterfulgt av tegn likestillet, etterfulgt av?." Og så videre. På denne måten er denne informasjonen ganske ubrukelig, og det må trekkes ytterligere skritt for å gjøre setningen til noe som en maskin kan utføre. I utgangspunktet hva vi trenger å gjøre er å kompilere kildekoden.


Kompilatoren

Som jeg nevnte tidligere, er setningen ovenfor rå kildekode, en samling av tegn som betyr ingenting for en datamaskin. For å få nyttig informasjon må vi løpe koden gjennom noen få prosedyrer. Først bør vi vende strømmen av tegn til ord og for det andre, slå ordene til setninger.

Det første trinnet for å slå tegnene til ord er gjort av en tokenizer som i utgangspunktet utfører leksikalanalyse av kildekoden. Den løper over tegnene og grupperer dem i serie av "tokens" (og det bestemmer også deres typeidentifikatorer, operatører, konstanter?). Etter tokenizer (det kalles også en lexer BTW) fullfører jobben sin, får vi en matrise som kan illustreres slik:

[Identifikator foo] [Operatør er lik] [Integer 2] [Operatør pluss] [Integer 3] [Operatør multipliserer] [Integer 4]

Dette er en høyere nivå struktur som inneholder "ord" i stedet for de raske tegnene.

De resulterende tokens blir matet inn i en parser. Det utfører semantisk analyse av tokens og monterer dem i maskininstruksjoner. I enklere ord konstruerer det setninger ut av ordene (tokens) og gir mening ut av dem (dvs. kompilerer instruksjoner ut av dem). For eksempel hvis parseren er gitt en setning 2 + 3; i ++; Som tokens skal parseren først skille tokens i "setninger" (2 + 3 og i ++) og så forstår de faktisk (den første er add operasjon og den andre er et inkrement). Etter at vi har forstått instruksjonen, kan vi faktisk lage instruksjoner til maskinen ut av inngangen.

Etter å ha analysert tokens av vår streng, får vi følgende instruksjoner:

push 2 push 3 push 4 multiply add tilordne "foo"

Dette er instruksjoner som en datamaskin kan utføre. Komprimer det til et binært format og du har bytecode. Bytecode er en liste over instruksjoner om at en maskin er veldig god til behandling og når den behandles i rekkefølge gir de ønskede resultatene.


Tolken

Etter at vi har samlet kildekoden til bytecode, kan vi utføre den med en virtuell maskin. VM er programvare som utfører bytecode en instruksjon om gangen, så la oss bare gå gjennom tolkningen av vår erklæring:

  1. trykk 2 -- Kommandoen er å skyve nummer 2 inn i stakken. VM opprettholder en stabel under utførelse som kommandoene kan operere på, det vil si å presse inn og pop-off verdier (http://en.wikipedia.org/wiki/Stack_(data_structure)). Foreløpig ser stabelen ut slik: [2]
  2. trykk 3 -- skyv et helt tall i stakken. Nå ser det ut som [2, 3];
  3. trykk 4 -- Trykk enda et heltall i stakken. Nå ser det ut som [2, 3, 4];
  4. multiplisere -- Denne kommandoen poperer 2 verdier fra stakken, multipliserer dem og skyver resultatet tilbake til stakken. Det popper verdiene 3 og 4 (som for øyeblikket er på toppen av stabelen), multipliserer dem og skyver den resulterende 12 til stabelen. Det påvirker stabelen til å ligne [2, 12];
  5. Legg til -- du har sikkert gjettet det: Kommandoen pop 12 og 2 av stabelen, legger til dem og skyver den resulterende 14 i stakken. Nå er bare 14 igjen inne i stabelen.
  6. tilordne "foo" -- Denne kommandoen popper en verdi fra stakken og tilordner den til en variabel som heter foo. Så nå inneholder variabelen foo verdien av 14 og stakken er tom.

Det er det! Dette er et eksempel på en ekstremt enkel setning utført av en ekstremt enkel virtuell maskin. La oss undersøke et litt mer komplisert eksempel:

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

Dette kan kompilere til (jeg sier "kanskje" fordi det finnes forskjellige måter å kompilere på setningen):

push 12 push 4 push 2 add divide trykk 6 push 9 subtract push 3 multiply subtract tilordne "bar"

Dette vil bli tolket som:

  1. De første tre pushes vil bli lagt til stabelen: [12, 4, 2]
  2. Legg til -- vil summere de 2 verdiene øverst i stabelen: [12, 6]
  3. dele opp -- vil pop 6, deretter pop 12, del 12 med 6 og skyv resultatet til stabelen: [2]
  4. De neste 2 kommandoene vil skyve heltall i stakken: [2, 6, 9]
  5. trekke fra -- vil trekke de 2 tallene oppe på stakken. Vil pop 9, deretter 6, deretter trekke 6 fra 9 og trykk resultatet til bunken: [2, -3]
  6. Et annet heltall vil bli skjøvet til stabelen: [2, -3, 3]
  7. multiplisere -- vil pop og multiplisere de 2 tallene på toppen av stabelen. -9, som er 3 ganger -3, vil bli presset tilbake til stabelen: [2, -9]
  8. trekke fra -- vil trekke fra -9 fra 2 og skyve resultatet til stabelen: [11]
  9. tildele -- vil pop 11 og tilordne den til en variabel som heter "bar". Stakken er nå tom.

Resultatet er nå lagret i en variabel som heter "bar" og det er 11. Yay!


Konklusjon

Det er den mest grunnleggende informasjonen om en VM, det kan komme til nytte når du begynner å lære litt lavt nivå Flash Player ting. VM inne i Flash Player er selvsagt mye mer komplisert, men basen er den samme som i eksemplet som presenteres ovenfor.

Hvis du vil lære mer om ActionScript Virtual Machine, kan du se på dette PDF-dokumentet av Adobe. Takk for at du leste!