2009-02-24 10 views
6

Por ejemplo, en javascript¿Cómo se realiza la asignación de memoria para variables en lenguajes de scripting?

puedo decir

var x = 5; 

Más tarde me puedo hacer

x = 'a'; 

y luego

x = "hello"; 

Entonces, ¿cómo está la memoria asignada para las variables ? Tal como está, todas las variables tienen un tipo común 'var' y los valores de las variables pueden cambiar en el tiempo de ejecución como se ve arriba. ¿No es una tarea difícil asignar y administrar memoria para estas variables? Exactamente, ¿cómo se hace?

+0

Ver también este desbordamiento de pila [¿Cómo se asignan las variables a la memoria en Javascript?] (Http://stackoverflow.com/questions/2800463/how-variables-are-allocated-memory-in-javascript) especialmente un comentario que contiene un enlace a esta disertación [Tres modelos de implementación para el esquema] (http://www.cs.unm.edu/~williams/cs491/three-imp.pdf) por R. Kent Dybvig. –

Respuesta

3

Python usa una técnica llamada reference counting, que básicamente pone un contador en el valor. Cada vez que se crea una referencia a un valor, el contador se incrementa. Cuando se pierde una referencia al valor (por ejemplo, cuando asigna un nuevo valor a 'x'), el valor disminuye. Cuando el contador llega a cero, eso significa que no existe referencia al valor, y puede desasignarse. Esta es una explicación simplificada, pero al menos es lo básico.

+0

entonces ¿cómo se tratará x? cuando digo x = 5, ¿se tratará como un int o una cadena durante la asignación? y dónde se almacenará la información del tipo? –

+0

La forma en que se asigna la variable y se almacena la información de tipo será específica de la implementación. Si desea ver cómo lo hace una implementación, puede descargar Rhino: JavaScript for Java http://www.mozilla.org/rhino/. –

+0

Esto solo es cierto en CPython y también ignora la recolección de basura. Deberías arreglarlo. – Antimony

1

Tal vez esto link da más información, al menos por parte de javascript.

0

Bueno, esas variables son referencias a cadenas inmutables que se asignan en tiempo de compilación.

Por supuesto, depende de la máquina virtual, pero en general creo que la mayoría de los lenguajes de scripts asignan un gran bloque de memoria, expandiéndolo según sea necesario y haciendo su propia asignación dentro de eso, rara vez devolviendo algo al O/S. Especialmente en un lenguaje de ámbito léxico, que casi todos ellos son, todas las variables se asignan dinámicamente dentro de este bloque, no en algo análogo a una pila C, y se liberan con recuento de referencias o con un recolector de basura.

Si su lenguaje de scripting se ejecuta en la JVM, .NET o algo similar (¿Parrot?), Crear una variable es meramente la creación de algo así como un objeto de Java. Algún tiempo después de que no haya más referencias al objeto, el recolector de basura recuperará la memoria.

+0

Excepto que la máquina virtual puede hacer análisis de escape y, a veces, asignar objetos en la pila de todos modos. – Antimony

Cuestiones relacionadas