Si está involucrado con el desarrollo de AS3, es posible que haya oído hablar de una máquina virtual que vive dentro de Flash Player o del llamado bytecode en el que su código se transforma. Pero que son exactamente?
Una parte significativa de Flash Player es el AV M - La máquina virtual de ActionScript. Cuando compila su código AS3, se transforma en un conjunto de instrucciones binarias, llamado código de bytes, que se incrusta en el SWF producido. A medida que un usuario carga el SWF en Flash Player, el AVM analiza el bytecode y lo ejecuta paso a paso.
Examinemos el proceso con un poco más de detalle: Eche un vistazo a la siguiente declaración e imagine que queremos ejecutarla (calcular el resultado y asignarlo a "foo"):
foo = 2 + 3 * 4;
Desde el punto de vista de un humano, esta línea significa "Multiplica 3 por 4, agrega 2 al resultado y asigna eso a una variable llamada foo".
Por otro lado, si una computadora lee esta línea, la almacenará como "carácter f, seguido de carácter o, seguido de carácter o, seguido de espacio de carácter, seguido de igual a carácter, seguido de?." Y así. En este estado, esta información es bastante inútil y se deben tomar pasos adicionales para convertir la declaración en algo que una máquina pueda ejecutar. Básicamente, lo que tenemos que hacer es compilar el código fuente.
Como señalé antes, la declaración anterior es un código fuente en bruto, una colección de caracteres que no significan nada para una computadora. Para obtener información útil tenemos que ejecutar el código a través de unos pocos procedimientos. Primero, debemos convertir el flujo de caracteres en palabras y, segundo, convertir las palabras en oraciones.
El primer paso para convertir los caracteres en palabras se realiza mediante un tokenizador que básicamente realiza un análisis léxico del código fuente. Recorre los caracteres y los agrupa en series de "tokens" (y también determina su tipo: ¿identificadores, operadores, constantes?). Después de que el tokenizer (también llamado lexer BTW) finalice su trabajo, obtenemos una matriz que se puede ilustrar así:
[Identifier foo] [Operator es igual a] [Integer 2] [Operator plus] [Integer 3] [Operator multiply] [Integer 4]
Esta es una estructura de nivel superior que contiene "palabras" en lugar de los caracteres en bruto.
Los tokens resultantes se introducen en un analizador. Realiza un análisis semántico de los tokens y los ensambla en instrucciones de la máquina. En palabras más simples, construye oraciones a partir de las palabras (tokens) y da sentido a ellas (es decir, recopila instrucciones a partir de ellas). Por ejemplo, si al analizador se le da una declaración 2 + 3; i ++; como tokens, el analizador primero debe separar los tokens en "oraciones" (2 + 3 e i ++) y luego entenderlos (la primera es la operación de agregar y la segunda es un incremento). Después de que entendamos las instrucciones, podemos compilar instrucciones de la máquina a partir de la entrada.
Después de analizar los tokens de nuestra cadena, obtenemos las siguientes instrucciones:
empujar 2 empujar 3 empujar 4 multiplicar agregar asignar "foo"
Estas son instrucciones que una computadora puede ejecutar. Comprímalo en un formato binario y ya tiene un código de bytes. Bytecode es una lista de instrucciones que una máquina es muy buena para procesar y cuando se procesa para obtener los resultados deseados.
Después de compilar el código fuente a bytecode, podemos ejecutarlo con una máquina virtual. La máquina virtual es un software que ejecuta el bytecode una instrucción a la vez, así que simplemente analicemos la interpretación de nuestra declaración:
empujar 2
-- El comando es empujar el número 2 en la pila. La máquina virtual mantiene una pila durante la ejecución en la que los comandos pueden operar, es decir, empujar dentro y fuera de los valores (http://en.wikipedia.org/wiki/Stack_(data_structure)). Actualmente la pila se ve así: [2]empujar 3
-- empujar otro entero en la pila. Ahora parece que [2, 3];empujar 4
-- empuje otro entero más en la pila. Ahora parece que [2, 3, 4];multiplicar
-- este comando saca 2 valores de la pila, los multiplica y devuelve el resultado a la pila. Muestra los valores 3 y 4 (que actualmente están en la parte superior de la pila), los multiplica y empuja los 12 resultantes a la pila. Afecta a la pila a parecerse a [2, 12];añadir
-- probablemente lo haya adivinado: el comando saca 12 y 2 de la pila, los agrega y empuja los 14 resultantes en la pila. Ahora solo quedan 14 dentro de la pila..asignar "foo"
-- Este comando saca un valor de la pila y lo asigna a una variable llamada foo. Así que ahora la variable foo contiene un valor de 14 y la pila está vacía.¡Eso es! Este es un ejemplo de una declaración extremadamente simple ejecutada de una máquina virtual extremadamente simple. Examinemos un ejemplo un poco más complicado:
barra = 12 / (4 + 2) - (6 - 9) * 3
Esto puede compilar para (digo "puede" porque hay diferentes maneras de compilar la declaración):
empujar 12 empujar 4 empujar 2 agregar dividir empujar 6 empujar 9 restar empujar 3 multiplicar restar asignar "barra"
Esto será interpretado como:
añadir
-- sumará los 2 valores en la parte superior de la pila: [12, 6]dividir
-- emergerá 6, luego pop 12, dividirá 12 por 6 y empujará el resultado a la pila: [2]sustraer
-- restará los 2 números en la parte superior de la pila. Hará pop 9, luego 6, luego restará 6 de 9 y empujará el resultado a la pila: [2, -3]multiplicar
-- aparecerá y multiplicará los 2 números en la parte superior de la pila. -9, que es 3 veces -3, será devuelto a la pila: [2, -9]sustraer
-- restará -9 de 2 y empujará el resultado a la pila: [11]asignar
-- abrirá 11 y lo asignará a una variable llamada "barra". La pila ahora está vacía.El resultado ahora está almacenado dentro de una variable llamada "barra" y es 11. Yay!
Esa es la información más básica sobre una VM, podría ser útil cuando empiece a aprender algunas cosas de Flash Player de bajo nivel. La VM dentro del Flash Player es, por supuesto, mucho más compleja, pero la base es la misma que en el ejemplo presentado anteriormente..
Si desea obtener más información sobre la Máquina Virtual ActionScript, puede echar un vistazo a este documento PDF de Adobe. Gracias por leer!