2009-05-29 47 views
18

He estado investigando cómo funcionan los lenguajes de programación, y algunos de ellos tienen las denominadas 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 de la misma manera que se ejecutaría un lenguaje compilado, con una pila. ¿Lo entendí bien?¿Cómo funciona una máquina virtual?

Con la condición de que lo hice, lo que me engaña es que muchos idiomas no compilados permiten variables con sistemas de tipo "liberal". En Python, por ejemplo, puedo escribir esto:

x = "Hello world!" 
x = 2**1000 

Cuerdas y grandes números enteros son completamente ajenos y ocupan diferentes cantidades de espacio en la memoria, así que ¿cómo puede este código incluso estar representados en un entorno basado en la pila? ¿Qué pasa exactamente aquí? ¿X apunta a un nuevo lugar en la pila y los datos de la cadena anterior no se referenciaron? ¿Estos idiomas no usan una pila? Si no, ¿cómo representan las variables internamente?

+4

Gran primera pregunta! – samoz

+0

Pregunta relacionada: http://stackoverflow.com/questions/688803/how-does-a-register-based-virtual-machine-work – lothar

Respuesta

7

Probablemente, su pregunta debería titularse como "¿Cómo funcionan los lenguajes dinámicos ?"

Es simple, almacenan la información del tipo de 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 nativamente como Objective-C.

+0

Ajá, ya veo. Pero, ¿qué sucede durante la reasignación? Si los datos nuevos son más grandes que el anterior, ¿dónde se ubica y qué ocurre con los datos anteriores? – Martin

+2

El contenido real del objeto podría almacenarse en otra parte y solo se almacenaría una referencia en su lugar. Hay muchas técnicas para implementar un lenguaje dinámico. Lo que sucede realmente depende de la implementación particular de su idioma. –

+0

http://en.wikipedia.org/wiki/Dynamic_typing#Dynamic_typing –

2

En la mayoría de los lenguajes de máquina virtual, las variables se pueden conceptualizar como punteros (o referencias) a la memoria en el montón, incluso si la variable está en la pila. Para los idiomas que tienen tipos primitivos (int y bool en Java, por ejemplo), también se pueden almacenar en la pila, pero no se les pueden asignar nuevos tipos dinámicamente.

Ignorando 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 mediante algún algoritmo de recolección de basura), y el nuevo valor se asigna en un nuevo bit de memoria.

+0

¿Por qué se usa la pila en absoluto si solo contiene punteros al montón? ¿No sería más inteligente almacenar punteros internamente y omitir todo el enfoque de la pila? – Martin

+0

La pila es necesaria para llamadas recursivas. Cuando una función se llama a sí misma, necesita un nuevo conjunto de variables, o sobrescribirá las variables de la llamada externa a la misma función. Necesitas algún tipo de pila para que sepas que las últimas variables en ella son las de la operación actual. También es útil como un "espacio temporal" para mantener los resultados temporales de las expresiones. – uliwitness

1

La clave para muchos de los 'cómo las VM manejan variables como esta o esa' realmente se reduce a los metadatos ... La metainformación almacenada y luego actualizada le da a la VM un mejor manejo sobre cómo asignar y luego hacer lo correcto con las variables.

En muchos casos, este es el tipo de sobrecarga que puede interferir con el rendimiento. Sin embargo, las implementaciones modernas, etc. han recorrido un largo camino para hacer lo correcto.

En cuanto a sus preguntas específicas, el tratamiento de variables como objetos vainilla/etc ... se reduce a reasignar/reevaluar metainformación sobre asignaciones nuevas; por eso x puede verse de una manera y luego la siguiente.

1

Para responder a una parte de sus preguntas, recomendaría un google tech talk about python, donde se responden algunas de sus preguntas sobre los idiomas dinámicos; por ejemplo, qué es una variable (no es un puntero, ni una referencia, pero en el caso de una etiqueta python).

2

La VM no tiene nada que ver con el idioma. Cualquier idioma puede ejecutarse sobre una VM (Java VM ya tiene cientos de idiomas).

Una VM permite ejecutar un tipo diferente de "lenguaje ensamblador", uno que es más adecuado para adaptar un compilador. Todo lo que se hace en una VM se puede hacer en una CPU, así que piense en la VM como una CPU. (Algunos de hecho se implementan en hardware).

Tiene 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 relativas al puntero de la pila actual.

Con lenguajes compilados normales, se requieren muchas instrucciones para un solo paso. a + podría verse como "Toma el elemento de un punto relativo al puntero de pila en reg a, agarra otro en reg b. agrega reg a y b. pon reg a en un lugar relativo al puntero de pila.

VM hace todo esto con una instrucción única y corta, 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 último 86 de codificación fue en la era 80.286.)

Microsoft utiliza (probablemente todavía utiliza) máquinas virtuales en sus productos de oficina para reducir la cantidad de código.

El procedimiento para cr comer el código de VM es lo mismo que crear un lenguaje de máquina, básicamente un tipo de procesador diferente.

Las máquinas virtuales también pueden implementar su propia seguridad, recuperación de errores y mecanismos de memoria que están estrechamente relacionados con el idioma.

Parte de mi descripción aquí es resumen y de memoria. Si desea explorar la definición de código de bytes a sí mismo, es un poco divertido:

http://java.sun.com/docs/books/jvms/second_edition/html/Instructions2.doc.html

Cuestiones relacionadas