Pregunta

He estado buscando en el funcionamiento de los lenguajes de programación, y algunos de ellos tienen una de las llamadas máquinas virtuales. Entiendo que esto es algún tipo de emulación del lenguaje de programación dentro de otro lenguaje de programación, y que funciona como cómo sería ejecutado un lenguaje compilado, con una pila. He llegado hasta ese derecho?

Con la condición de que lo hiciera, lo que me embauca es que muchas lenguas no permiten compilado variables con sistemas de tipo "liberales". En Python, por ejemplo, puedo escribir esto:

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

Las cadenas 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 ser representados en un entorno basado en la pila? ¿Qué es exactamente que pasa aquí? Es x señaló a un nuevo lugar en el los viejos datos de cadena que dejan sin referencias pila y? ¿Los idiomas no utilizan una pila? Si no, ¿cómo hacer que representan variables internamente?

¿Fue útil?

Solución

Probablemente, su pregunta debe ser titulado como "Cómo hacer dinámicas idiomas trabajo ?."

Eso es simple, que almacenan la información de tipo variable a lo largo con él en la memoria. Y esto no sólo se realiza en los lenguajes interpretados o compilados JIT idiomas, sino también de forma nativa compilados como Objective-C.

Otros consejos

En la mayoría de los lenguajes de máquina virtual, las variables pueden ser conceptualizados 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) los que se pueden almacenar en la pila también, pero que no se pueden asignar dinámicamente nuevos tipos.

Haciendo caso omiso de los tipos primitivos, todas las variables que existen en la pila tienen sus valores reales almacenados en el montón. Por lo tanto, si se reasigna dinámicamente un valor para ellos, se abandona el valor original (y la memoria limpiado a través de algún algoritmo de recolección de basura), y el nuevo valor se asigna en un nuevo bit de memoria.

La máquina virtual no tiene nada que ver con el lenguaje. Cualquier lenguaje puede ejecutar en la parte superior de una máquina virtual (VM tiene el Java cientos de idiomas ya).

Una máquina virtual permite a un tipo diferente de "lenguaje ensamblador" para ser ejecutado, uno que es más apto para la adaptación de un compilador. Todo lo hecho en una máquina virtual se podría hacer en una CPU, por lo que pensar de la máquina virtual como una CPU. (Algunos realmente se implementan en el hardware).

Es muy bajo nivel, y en muchos casos fuertemente pila basado - en lugar de registros, matemáticas a nivel de máquina es relativo a ubicaciones en relación con el puntero de pila actual

.

Con los lenguajes compilados normales, se requieren muchas instrucciones de un solo paso. a + podría ser como "Arrastrar el elemento desde un punto en relación con el puntero de pila en un registro, agarra otra en reg b. reg añadir a y b. reg poner una en un lugar en relación con el puntero de pila.

El VM hace todo esto con una sola, la instrucción corto, posiblemente uno o dos bytes en lugar de 4 o 8 bytes por instrucción en lenguaje de máquina (en función de 32 o 64 arquitectura bit) que (adivinar) deben 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 x 86 estaba en la era 80.286.)

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

El procedimiento para crear el código VM es la misma que la creación de lenguaje de máquina, sólo un tipo de procesador diferente esencialmente.

VM también puede implementar sus propios mecanismos de seguridad, recuperación de errores y de memoria que están muy estrechamente relacionados con el lenguaje.

Algunos de mi descripción aquí es resumen y de la 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

La clave para muchos de los 'cómo manejar máquinas virtuales variables como tal o que' realmente se reduce a los metadatos ... La meta información almacenada y luego actualiza la máquina virtual da un mejor manejo de cómo asignar y luego hacer lo lo correcto con variables.

En muchos casos este es el tipo de sobrecarga que realmente puede ponerse en el camino de la actuación. Sin embargo, las implementaciones de hoy en día, etc han recorrido un largo camino para hacer lo correcto.

En cuanto a sus preguntas específicas - tratamiento de variables como objetos de vainilla / etc ... se reduce a la reasignación / reevaluar meta información sobre nuevas asignaciones - es por eso que x puede mirar a un lado ya otro.

Para responder a una parte de sus preguntas, me gustaría recomendar un de google charla técnica sobre el pitón , donde algunas de sus preguntas referentes a los lenguajes dinámicos son contestadas; por ejemplo lo que una variable es (no es un puntero, ni una referencia, pero en caso de pitón una etiqueta).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top