stack - una - maquinas virtuales vmware
¿Cómo funciona una máquina virtual? (5)
En la mayoría de los lenguajes de máquinas virtuales, las variables se pueden conceptualizar como punteros (o referencias) a la memoria en el montón, incluso si la propia variable está en la pila. Para los idiomas que tienen tipos primitivos (int y bool en Java, por ejemplo), estos también pueden almacenarse en la pila, pero no se les pueden asignar nuevos tipos dinámicamente.
Al ignorar los tipos primitivos, todas las variables que existen en la pila tienen sus valores reales almacenados en el montón. Por lo tanto, si reasigna dinámicamente un valor a ellos, el valor original se abandona (y la memoria se limpia a través de algún algoritmo de recolección de basura), y el nuevo valor se asigna en un nuevo bit de memoria.
He estado investigando cómo funcionan los lenguajes de programación, y algunos de ellos tienen las llamadas máquinas virtuales. Entiendo que esta es una forma de emulación del lenguaje de programación dentro de otro lenguaje de programación, y que funciona como la forma en que se ejecutaría un lenguaje compilado, con una pila. ¿Conseguí eso bien?
Con la condición de que lo hice, lo que me desconcierta es que muchos lenguajes no compilados permiten variables con sistemas de tipo "liberales". En Python, por ejemplo, puedo escribir esto:
x = "Hello world!"
x = 2**1000
Las cadenas y los enteros grandes no tienen ninguna relación y ocupan diferentes cantidades de espacio en la memoria, entonces, ¿cómo puede este código ser representado en un entorno basado en la pila? ¿Qué sucede exactamente aquí? ¿Se apunta x a un nuevo lugar en la pila y no se hace referencia a los datos antiguos de la cadena? ¿Estos lenguajes no usan una pila? Si no, ¿cómo representan las variables internamente?
La clave de muchas de las "cómo las VM manejan variables como esta o aquella" realmente se reduce a los metadatos ... La información meta almacenada y luego actualizada le da a la VM un mejor manejo sobre cómo asignar y luego hacer lo correcto con variables
En muchos casos, este es el tipo de sobrecarga que realmente puede interferir en el rendimiento. Sin embargo, las implementaciones modernas, etc. han recorrido un largo camino para hacer lo correcto.
En cuanto a sus preguntas específicas, tratar las variables como objetos de vainilla / etc ... se reduce a reasignar / reevaluar la metainformación sobre nuevas asignaciones: es por eso que x puede mirar de una manera y luego a la siguiente.
La máquina virtual no tiene nada que ver con el lenguaje. Cualquier idioma puede ejecutarse sobre una máquina virtual (la máquina virtual Java ya tiene cientos de idiomas).
Una máquina virtual permite ejecutar un tipo diferente de "lenguaje ensamblador", que es más adecuado para adaptar un compilador. Todo lo que se hace en una máquina virtual se puede hacer en una CPU, así que piense en la máquina virtual como una CPU. (Algunos en realidad están implementados en hardware).
Es un nivel extremadamente bajo y, en muchos casos, muy basado en la pila: en lugar de registros, las matemáticas a nivel de máquina son todas relativas a las ubicaciones en relación con el puntero de pila actual.
Con los lenguajes compilados normales, se requieren muchas instrucciones para un solo paso. a + podría verse como "Agarre el elemento desde un punto relativo al puntero de pila en reg a, agarre otro en reg b. Añada reg a y b. Coloque reg a en un lugar relativo al puntero de pila.
La VM hace todo esto con una instrucción corta y sencilla, posiblemente uno o dos bytes en lugar de 4 u 8 bytes POR INSTRUCCIÓN en lenguaje de máquina (dependiendo de la arquitectura de 32 o 64 bits) que (adivinar) debería significar alrededor de 16 o 32 bytes de x86 Para 1-2 bytes de código de máquina. (Podría estar equivocado, mi última codificación x86 fue en la era 80286).
Microsoft usó (probablemente aún usa) máquinas virtuales en sus productos de oficina para reducir la cantidad de código.
El procedimiento para crear el código de la máquina virtual es el mismo que para crear un lenguaje de máquina, esencialmente un tipo de procesador diferente.
Las máquinas virtuales también pueden implementar sus propios mecanismos de seguridad, recuperación de errores y memoria que están muy estrechamente relacionados con el lenguaje.
Algunas de mis descripciones aquí son resumen y de memoria. Si desea explorar la definición de bytecode usted mismo, es algo divertido:
http://java.sun.com/docs/books/jvms/second_edition/html/Instructions2.doc.html
Para responder a una parte de sus preguntas, recomendaría una charla de google tech sobre python , donde se responden algunas de sus preguntas sobre lenguajes dinámicos; por ejemplo, qué es una variable (no es un puntero, ni una referencia, pero en el caso de python una etiqueta).
Probablemente, su pregunta debería titularse como "¿Cómo funcionan los lenguajes dinámicos ?"
Eso es simple, almacenan la información de tipo variable junto con ella en la memoria. Y esto no solo se hace en lenguajes interpretados o compilados JIT, sino también en lenguajes compilados de forma nativa como Objective-C.