Pregunta

Me estoy empezando a tratar de aprender más acerca de los fundamentos .Net VM, y estoy inmediatamente arrojado por algo. Sé que hay esta nueva cosa llamada el DLR que permite todas las cosas dinámica en C # y el funcionamiento de los idiomas IronX. Pero ahora estoy leyendo acerca de este lenguaje llamado Boo, y al parecer ha tenido capacidades dinámicas desde mucho antes de que existiera el DLR. Por lo tanto,

1) ¿Cómo es esto posible?

2) ¿Qué significa el complemento DLR a la ecuación?

3) ¿Un lenguaje como Boo de pie ganar nada por la reimplementación de sí misma en términos de la DLR?

Por lo que he tipo de recogido aquí y allá, parece que el DLR salió de IronPython, cuando un factor fuera todo lo que era necesario para el apoyo DL en .Net, y lo puso en forma reutilizable. Así que lo que supongo es que DLR es nada especial, sólo algunas bibliotecas que ayuda con objetos dinámicos en Microsoft.Scripting.dll, pero nada que no se podía salir y código por sí mismo si tuviera el tiempo, lo cual Supongo que es lo que sucedió para Boo? Y después de 2 y 3, creo que el carácter común y reutilización del DLR permitiría a cualquier mejora futura DLR a ser derechos adquiridos en forma automática, pero que no hay urgente "necesidad" para volver a implementar usando el DLR si ya ha hecho su propio tiempo de ejecución personalizada? ¿O es que el DLR tiene un poco de salsa secreta MS que hace que sea mejor que cualquier cosa que podríamos hacer en la parte superior de .Net?

4) ¿Es el DLR realmente un tiempo de ejecución o simplemente un conjunto de bibliotecas? (¿Qué es exactamente un tiempo de ejecución de todos modos? Probablemente necesita aprender más teoría compilador antes de que yo puedo entender una respuesta a esta pregunta, o si es aún una pregunta que significa algo. No haga caso de esta pregunta. O no lo hacen.)

5) ¿Cómo funciona la compilación IronPython? Qué se compila a una nueva versión dinámica del CIL, o es simplemente escriba un comando "ironpython.exe" a una cadena con el texto del programa en ella? Hmm, si bien dinámica es una palabra clave en C #, entonces debe haber una versión dinámica de la CIL, ¿verdad? Entonces, ¿cómo .Net sabe si va a utilizar el CLR o el DLR en el CIL?

6) ¿El proyecto Da Vinci para la JVM diferente? Parece que se trata de una re-implementación real de la misma JVM. ¿Cuáles son las implicaciones de este enfoque? Supongo que hay enormes mejoras en el rendimiento, pero todo lo demás? MS algún motivo no tomaron este camino?

7) ¿El DLR maquillaje Boo algo obsoleto para la fabricación de una SL?

¿Fue útil?

Solución

El DLR básicamente trae 3 cosas a la fiesta:

  • Un amplio conjunto de árboles de expresión (introducidos por primera vez w / LINQ) que permiten la compilación de programas completos. Estos proporcionan una forma mucho más fácil de generar el código de generar directamente IL - se deshace de muchos casos de ser capaz de generar inválida IL y se convierte en muchos más casos excepciones de tiempo de ejecución fácilmente depurables
  • .
  • Un construido en el mecanismo de almacenamiento en caché sitio llamado para que no se necesita para crear su propia (muy útil para un buen desempeño en los lenguajes dinámicos). Esto incluye cosas como una caché multinivel y el envejecimiento a cabo los elementos no utilizados.
  • Un protocolo meta objeto que permite que los lenguajes dinámicos a hablar unos con otros en tiempo de ejecución y negociar el resultado correcto para el idioma llamar (por ejemplo devolviendo undefined en JavaScript cuando no existe un miembro o lanzar un AttributeError en Python, independientemente de la el lenguaje del objeto dinámico fue escrito en).

El protocolo meta objeto es la única pieza que necesita absolutamente para ser compartida - todo lo que pueda crear por su cuenta.

IronPython se basa totalmente en la parte superior de la DLR - por lo que es modelo de compilación es en realidad para compilar a los árboles de expresión. La capa interior DLR que se incluye w / .NET 4.0 se utiliza para compilar los árboles de expresión y usamos el intérprete que es una pieza de la capa exterior de interpretar esos árboles de expresión. entonces podemos compilar perezosamente los árboles de expresión después de las versiones interpretadas han convertido en caliente. Esa compilación incluye la producción de sitios de llamadas que usamos para el envío dinámica de diversas operaciones (obtener, configurar miembros, llamando objetos, etc ...) y otra vez que utilizamos el DLR - en este caso del mecanismo de sitio de llamada. IronPython utiliza una combinación de ambos ligantes DLR estándar para estas operaciones, junto con carpetas de encargo que hacen acciones específicas IronPython (fluyen a través del contexto de código, soporte * args y ** args llamadas, etc ...), que luego caen nuevo a carpetas estándar para DLR Interop.

El proyecto Davinci añadirá "método" manijas de la JVM, que el CLR ya ha tenido en forma de delegados. También se añadirá un nuevo código de operación "invokedynamic", que el CLR no tiene y no ganó w / el trabajo DLR. En cambio, el DLR sólo utiliza las primitivas existentes (delegados, reificadas genéricos), además de las bibliotecas para definir el protocolo de interoperabilidad. Tanto añadir el concepto de sitios de llamadas y los que pueden ser bastante similares entre los dos.

Otros consejos

Muchas preguntas aquí! No estoy seguro de que pueda responder a todos de ellos, pero haré todo lo que puede:

  1. Boo no es dinámico en el mismo sentido que (hierro) Python es. Es sobre todo un lenguaje de tipos estáticos con una fuerte inferencia de tipos y la sintaxis Pythonic. Esto, junto con su tipificación de pato opcional, le dan un ambiente muy dinámico, pero ciertamente no es el mismo que Python. Boo es más similar (con excepción de sintaxis) para C # 4 de Python.

  2. DLR añade soporte dinámico para los ejecutores del idioma en la parte superior de el CLR, que está más orientado hacia las lenguas tipos estáticos (como VB.NET, C #, C #)

  3. En realidad, no en mi humilde opinión. Se convertiría en demasiado similar a IronPython. Precisamente una de las características de Boo es que está escrito de forma estática.

  4. Los tiempos de ejecución son bibliotecas que soportan algunas construcciones básicas en el idioma. VB.NET, C #, C #, Boo, todos ellos tienen las bibliotecas de tiempo de ejecución. Por lo general, nunca se ve VB.NET o C # tiempos de ejecución, ya que vienen con el marco .NET. Hubo una gran respuesta de SO sobre esto de Eric Lippert, pero no puedo encontrarlo.

  5. No se puede comentar sobre esto, no tenemos mucha experiencia práctica con IronPython.

  6. No sé sobre el proyecto DaVinci, no puedo comentar sobre esto.

  7. No. Por lo que yo sé macros de Boo y compilador extensible son únicas para un lenguaje .NET ( Nemerle tiene capacidades similares macro). Realmente no puedo decir si Boo DSL puede ser más o menos potente que IronPython DSL. Lo que puedo decir con certeza es que la aplicación de Boo DSL es muy diferentes en la implementació de Python DSL.

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