2008-12-02 17 views
12

Yo estaba pensando en hacer algo así como LINQ para LUA, y tengo una idea general de cómo funciona LINQ, pero me preguntaba si había un buen artículo o si alguien podría explicar cómo C# hace LINQ posible¿Cómo funciona Linq (detrás de escena)?

Nota: me refiero entre bastidores, por ejemplo, cómo genera enlaces de código y todo eso, no la sintaxis del usuario final.

+0

¿Quiere decir cómo se traduce la consulta en la sintaxis/árboles subyacente o cómo funciona LINQ en el sentido de ejecución? – JaredPar

+0

En lo que más me preocupan es en los sistemas de tiempo de compilación –

Respuesta

18

Es difícil responder a la pregunta porque LINQ es tantas cosas diferentes. Por ejemplo, apegándose a C#, las siguientes cosas están involucradas:

  • Las expresiones de consulta son "pre-procesadas" en "C# sin expresiones de consulta" que luego se compila normalmente. La parte de expresión de la consulta de la especificación es realmente corta, básicamente es una traducción mecánica que no asume nada sobre el significado real de la consulta, más allá de que "order by se traduce en OrderBy/ThenBy/etc".
  • Los delegados se utilizan para representar acciones arbitrarias con una firma particular, como código ejecutable.
  • Los árboles de expresiones se utilizan para representar lo mismo, pero como datos (que se pueden examinar y traducir en una forma diferente, por ejemplo SQL)
  • Las expresiones Lambda se utilizan para convertir el código fuente en delegados o árboles de expresiones.
  • La mayoría de los proveedores de LINQ utilizan métodos de extensión para encadenar llamadas de métodos estáticos. Esto permite que una interfaz simple (por ejemplo, IEnumerable<T>) gane efectivamente mucha más potencia.
  • Los tipos anónimos se utilizan para las proyecciones: cuando tiene una colección de datos dispareja y quiere bits de cada aspecto de esos datos, un tipo anónimo le permite agruparlos.
  • Las variables locales implícitamente tipadas (var) se usan principalmente cuando se trabaja con tipos anónimos, para mantener un lenguaje estáticamente tipado donde no se puede "hablar" explícitamente el nombre del tipo.
  • Los bloques iteradores se usan generalmente para implementar consultas en proceso, p. para LINQ to Objects.
  • La inferencia de tipo se utiliza para hacer que todo sea mucho más sencillo: hay muchos métodos genéricos en LINQ, y sin inferencia de tipo sería realmente doloroso.
  • generación de código se utiliza para activar un modelo (por ejemplo DBML) en código
  • tipos parciales se utilizan para proporcionar extensibilidad a código generado
  • atributos se utilizan para proporcionar metadatos a los proveedores de LINQ

Obviamente una muchos de estos no son solo utilizados por LINQ, pero las diferentes tecnologías LINQ dependerán de ellos.

Si puede dar más indicaciones sobre los aspectos que le interesan, podremos proporcionarle más detalles.

Si está interesado en implementar efectivamente LINQ to Objects, le podría interesar una charla que di en DDD en Reading hace un par de semanas, básicamente implementando la mayor cantidad posible de LINQ to Objects en una hora. No estábamos completos al final, pero debería dar una buena idea del tipo tipo de lo que necesita hacer (y almacenamiento en búfer/transmisión en tiempo real, bloques de iteradores, traducción de expresiones de consulta, etc.). Los videos aún no han terminado (y aún no he puesto el código para su descarga) pero si está interesado, envíeme un correo electrónico a [email protected] y le avisaré cuando estén disponibles. . (Probablemente también lo publicaré en el blog.)

+0

Son tantas cosas que ni siquiera entraron en el lado de la ejecución. Incluso más detalles peludos viven allí. – JaredPar

+0

Bueno, un día, si el tiempo lo permite, sería genial tener un sistema LINQ completo para Lua, pero si mencionas que todo es tan complejo, por el momento estoy pensando en comenzar con la fruta baja y trabajar mi Dirigirte. –

+0

No estoy familiarizado con LUA, ¿admite iteradores? Esa es realmente la base sobre la cual se construye la mayoría de LINQ. – JaredPar

3

Mono (parcialmente?) Implementa LINQ, y es de código abierto. Tal vez podrías ver su implementación?

+0

suena como un buen comienzo –

2

Tal vez mi LINQ for R6RS Scheme proporcionará algunas ideas.

Es 100% semántico, y casi 100% sintácticamente lo mismo que LINQ, con la notable excepción de los parámetros de clasificación adicionales que usan 'then' en lugar de ','.

Algunas reglas/supuestos:

  • Sólo se trata de listas, no hay proveedores de la consulta.
  • No es flojo, sino que tiene una gran comprensión.
  • No hay tipos estáticos, ya que Scheme no los usa.

Mi aplicación depende de algunos procedimientos básicos:

  • mapa - utilizado para 'Seleccionar'
  • filtro - se utiliza para 'Dónde'
  • aplanar - se utiliza para 'SelectMany'
  • ordenación: un procedimiento de clasificación multi-clave
  • groupby - para agrupar constructos

El resto de la estructura está construida utilizando una macro.

Los enlaces se almacenan en una lista etiquetada con identificadores vinculados para garantizar la higiene. El enlace se extrae y rebota localmente donde se produce una expresión.

Hice un seguimiento del progreso en mi blog, que puede proporcionar una idea de los posibles problemas.

+0

Esto debería ser útil de hecho. Gracias –

2

Para ideas de diseño, echar un vistazo a c omega, el proyecto de investigación que dio a luz LINQ . Linq es una versión más pragmática o diluida de c omega, según su perspectiva.

Cuestiones relacionadas