2012-06-02 45 views
14

escaneando Internet, estoy teniendo problemas para entender de una manera simple - el término call-site (@dlr). He estado leyendo here que CallSite es:¿Explicación del sitio de llamada?

un sitio dice

La ubicación en la que se llama al método.

un libro decir: sitio

llamada. Este es el tipo de átomo del DLR: la pieza más pequeña de código que se puede considerar como una sola unidad. Una expresión puede contener muchos sitios de llamadas, pero el comportamiento se genera en el forma natural, evaluando un sitio de llamada a la vez. Para el resto de la discusión , solo consideraremos un solo sitio de llamada a la vez. Es va a ser útil tener un pequeño ejemplo de un sitio llamado para referirse a , así que aquí es muy simple, donde d es por supuesto una variable de tipo dinámico

d.Foo (10); El sitio de llamada se representa en el código como System.Runtime.CompilerServices.CallSite.

otro libro dice:

el compilador emite código que finalmente resulta en un árbol de expresión que describe la operación, dirigida por un sitio de llamada que el DLR se unen en tiempo de ejecución. El sitio de llamadas esencialmente actúa como un intermediario entre quien llama y quien llama.

lo siento, no puede ver donde esos 3 explicaciones están combinando en una sola explicación sencilla.

voy a estar feliz de conseguir una explicación simple:

¿Cómo puedo explicar mi esposa -lo que son llamadas sitios?

Respuesta

11

La primera explicación no tiene nada que ver con el dlr o el tipo dinámico: simplemente hablando, un sitio de llamada es una ubicación (o sitio) en el código fuente donde se llama un método.

Al implementar el tipo dinámico, es necesario almacenar información sobre las llamadas al método dinámico contenidas en el código, para que puedan invocarse en tiempo de ejecución (el dlr necesita buscar el método, resolver sobrecargas, etc.). Parece natural que el objeto que representa esta información también se llame "sitio de llamada".

4

Ok así es como lo veo.

Para este ejemplo, la llamada es simplemente como un método o función que ejecuta algún código y lo devuelve.

Para un programa de tiempo de ejecución de lenguaje estático (C, o CLR, etc.), un sitio de llamada es esencialmente donde tiene lugar una llamada a función. Es la ubicación a la que volverá la llamada en un flujo normal (no excepcional). Como este es un programa estático, el sitio de llamada es simplemente una ubicación de memoria, empujada en la pila.

Para un programa de lenguaje dinámico (Ruby, Python, etc.), el código que está llamando no se resuelve hasta el tiempo de ejecución. Esto significa que se necesita alguna forma de lógica para administrar el proceso de hacer la llamada a la función correcta y luego limpiarla después de la llamada (si es necesario). Si el programa de lenguaje dinámico está en .NET 4 esto se hace usando objetos dlr (lenguaje de ejecución dinámico) de tipo System.Runtime.CompilerServices.CallSite.Entonces, la llamada volverá a un método dentro del objeto CallSite y luego a la ubicación de la llamada original.

Así que la respuesta es que depende de cómo se realiza la llamada y, por lo tanto, qué plataforma está utilizando.