La máquina virtual Perl es una máquina virtual de proceso basada en pila implementada como un intérprete de códigos de operación que ejecuta programas compilados previamente escritos en el lenguaje Perl . El intérprete de códigos de operación es parte del intérprete de Perl, que también contiene un compilador ( lexer , analizador y optimizador ) en un archivo ejecutable, comúnmente / usr / bin / perl en varios sistemas similares a Unix o perl.exe en sistemas Microsoft Windows .
Implementación
Códigos de operación
El compilador de Perl genera un programa compilado en la memoria como una estructura interna que se puede representar como un gráfico de árbol en el que cada nodo representa un código de operación. Los códigos de operación se representan internamente mediante typedefs . Cada código de operación tiene punteros siguiente / otro y primero / hermano , por lo que el árbol de código de operación se puede dibujar como un árbol de OP básico comenzando desde el nodo raíz o como una lista de OP plana en el orden en que normalmente se ejecutarían desde el nodo de inicio. El árbol de códigos de operación se puede asignar al código fuente, por lo que es posible descompilarlo en código fuente de alto nivel. [1]
El intérprete de códigos de operación de Perl se implementa como un caminante de árbol que recorre el árbol de código de operación en orden de ejecución desde el nodo de inicio, siguiendo el siguiente u otros punteros. Cada código de operación tiene un puntero a una función pp_ opname función, es decir, la palabra de código de operación llama a la pp_say función de la API interna Perl.
La fase de compilación de un programa Perl está oculta al usuario final, pero puede exponerse con el módulo B Perl [2] u otros módulos especializados, como el módulo B :: Concise Perl. [3]
Un ejemplo de un programa Hello world compilado simple volcado en orden de ejecución (con el módulo B :: Concise Perl):
$ perl -MO = Concise, -exec -E 'say "Hello, world!"' 1 <0> ingrese 2 <;> nextstate (main 46 -e: 1) v:%, { 3 <0> pushmark s 4 <$> const [PV "¡Hola, mundo!"] s 5 <@> decir vK 6 <@> dejar [1 ref] vKP / REFC
Algunos códigos de operación (entereval, dofile, require) llaman a funciones del compilador de Perl que a su vez generan otros códigos de operación en la misma máquina virtual de Perl.
Variables
Las variables de Perl pueden ser globales, dinámicas ( palabra clave local ) o léxicas ( mis y nuestras palabras clave).
Las variables globales son accesibles a través del alijo y el correspondiente typeglob .
Las variables locales son las mismas que las variables globales, pero se genera un código de operación especial para guardar su valor en el savestack y restaurarlo más tarde.
Las variables léxicas se almacenan en la lista de pad .
Estructuras de datos
Las estructuras de datos de Perl VM están representadas internamente por typedefs .
Las estructuras de datos internas se pueden examinar con el módulo B Perl [2] u otras herramientas especializadas como el módulo Devel :: Peek Perl. [4]
tipos de datos
Perl tiene tres typedefs que manejan los tres tipos de datos principales de Perl: valor escalar ( SV ), valor de matriz ( AV ), valor hash ( HV ). Perl usa un typedef especial para el tipo de entero con signo simple ( IV ), enteros sin signo ( UV ), números de coma flotante ( NV ) y cadenas ( PV ).
Perl utiliza un mecanismo de recolección de basura controlado por recuento de referencias . Los SV, AV o HV comienzan su vida con un recuento de referencia de 1. Si el recuento de referencia de un valor de datos cae a 0, se destruirá y su memoria estará disponible para su reutilización.
Otras definiciones de tipos son Glob Value ( GV ) que contienen referencias con nombre a varios objetos, Code Value ( CV ) que contiene una referencia a una subrutina Perl, I / O Handler ( IO ), una referencia a una expresión regular ( REGEXP ; RV en Perl antes 5.11), referencia al formato compilado para registro de salida ( FM ) y referencia simple que es un tipo especial de escalar que apunta a otros tipos de datos ( RV ).
reserva
Special Hash Value es stash , un hash que contiene todas las variables definidas dentro de un paquete. Cada valor de esta tabla hash es un valor global ( GV ).
padlist
El valor de matriz especial es padlist, que es una matriz de matriz. Es el elemento 0 de un AV que contiene todos los nombres de variables léxicas (con símbolos de prefijo) utilizados dentro de esa subrutina. El primer elemento del padlist apunta a un scratchpad AV, cuyos elementos contienen los valores correspondientes a las variables léxicas nombradas en la fila 0. Otros elementos de padlist se crean cuando la subrutina se repite o se crea un nuevo hilo.
Pilas
Perl tiene varias pilas para almacenar cosas en las que está trabajando.
Pila de argumentos
Los argumentos se pasan al código de operación y se devuelven desde el código de operación utilizando la pila de argumentos. La forma típica de manejar los argumentos es sacarlos de la pila y luego empujar el resultado a la pila.
Pila de marcas
Esta pila guarda marcadores en ubicaciones en la pila de argumentos que cada función puede usar, por lo que las funciones no necesariamente obtienen toda la pila de argumentos para sí mismas.
Guardar pila
Esta pila se utiliza para guardar y restaurar valores de variables locales de ámbito dinámico .
Pila de alcance
Esta pila almacena información sobre el alcance real y se usa solo con fines de depuración.
Otras implementaciones
No hay estandarización para el lenguaje Perl y la máquina virtual Perl. La API interna se considera no estable y cambia de una versión a otra. La máquina virtual Perl está estrechamente vinculada al compilador.
La implementación más conocida y estable es el módulo B :: C Perl [5] que traduce el árbol de códigos de operación a una representación en el lenguaje de programación C y agrega su propio caminante de árbol.
Otra implementación es un módulo Perl Acme :: Perl :: VM [6] que es una implementación codificada en lenguaje Perl solamente, pero aún está vinculado con la máquina virtual Perl original a través de B :: módulos.
Ver también
Referencias
- ^ "B :: Deparse - Backend del compilador Perl para producir código Perl" .
- ^ a b "B - El backend del compilador de Perl" .
- ^ "B :: Conciso - Árbol de sintaxis Walk Perl, imprimiendo información concisa sobre operaciones" .
- ^ "Devel :: Peek - Una herramienta de depuración de datos para el programador XS" .
- ^ "B :: C - C backend del compilador de Perl" .
- ^ "Acme :: Perl :: VM - Una máquina virtual Perl5 en Pure Perl (APVM)" .
enlaces externos
- Los componentes internos de Perl: etapa de carrera
- Introducción a la API de Perl
- El árbol de operaciones "B".