2011-02-28 16 views
7

Estoy bastante familiarizado con la teoría de compiladores en general, y con los entornos de tiempo de ejecución de los lenguajes tradicionales procesales y orientados a objetos como C, Pascal y Java. Estoy buscando obtener una comprensión detallada de cómo se implementa la estructura de tiempo de ejecución de un lenguaje como JavaScript, específicamente en relación con los cierres: cómo se gestiona el almacenamiento, cuándo se asignan los cierres, cómo decide cuándo liberar el almacenamiento de cierre. Sin excavar a través del código fuente para V8 o Rhino, ¿me pueden señalar documentos, libros o tutoriales que puedan proporcionar esa descripción?¿Dónde encontraría información detallada sobre la implementación de cierres (como en JavaScript o Scheme)?

Gracias.

+0

[Este artículo] (http://mrale.ph/blog/2012/09/23/grokking-v8-closures-for-fun.html) es un clásico. –

Respuesta

1

su bastante simple, se trata de un clon de un espacio de nombres anidados, por lo que su tipode lo contrario de la teoría del compilador en que es tiempo de ejecución asignado espacio de nombres, que se utiliza para resolver las búsquedas de símbolos, en comparación con el lenguaje compilado que recoge símbolos en los desplazamientos estáticos.

pero básicamente todo lo que significa es que la búsqueda de símbolos se produce en una lista vinculada de los espacios de nombres, empezando por el espacio de nombres local, hasta los espacios de nombres incluidos (los cierres).

y en javascript el espacio de nombres es sólo un objeto con un recuento de referencia de cualquier función abiertas con una referencia a ese espacio de nombres

por ejemplo

var links = //a list of links identified set somehwere else 
for(var i = 0, l = 3; l--; i++){ 
    (function(n){ 
     links[i].onclick = function(){ alert(n); } 
    })(i) 
} 

en el código anterior, enlaces [i] se utiliza para acceder a la matriz, pero en el momento en que se hace clic en el enlace, i se habrá incrementado y por lo tanto no el mismo número que el enlace. por lo tanto, n se configura en un espacio de nombres principal, de modo que cuando se activa la alerta (n) sea precisa.

global 
| 
|\ 
| +-- function(n=0) <- link0.onclick = function() 
|\ 
| +-- function(n=1) <- link1.onclick = function() 
\ 
    +-- function(n=2) <- link2.onclick = function() 

esto se bifurca en 3 marcos de pila, uno para cada iteración de i. y la función en el lado derecho de la expresión hte 'onclick =' tiene una referencia al marco de la pila ya que es un elemento léxico principal, donde comienza su búsqueda de símbolos.

finalmente terminarán mirando el mismo espacio de nombres porque comparten un abuelo.

algunos enlaces:

https://developer.mozilla.org/en/a_re-introduction_to_javascript

este esquema mínimo es mucho más fácil de leer que las fuentes V8:

http://code.google.com/p/chibi-scheme/

+0

¿No es Scheme un lenguaje compilado? Y, como JavaScript tiene un alcance léxico hasta cierto punto, no es del todo necesario hacer las búsquedas de tiempo de ejecución allí también. –

1

Esta técnica se llama lambda lifting, es totalmente estática (por lo , sin costosas búsquedas en el espacio de nombre de tiempo de ejecución).

1

This article explica la implementación de cierres en javascript.

+0

Excelente enlace, no estoy seguro de por qué fue downvoted? – 0fnt

+0

@ user247077: gracias! las respuestas directas son preferibles sobre los enlaces a las respuestas, de modo que una página SO será independiente. y luego está el problema de los enlaces rotos también. Esa es la filosofía SO – rahulmohan

Cuestiones relacionadas