2012-06-09 21 views
6

Durante mucho tiempo he querido diseñar un lenguaje de programación que combine la extensibilidad con la eficiencia (y la seguridad, la facilidad de uso, etc.) Recientemente redescubrí D y me pregunto si D 2.0 es más o menos el lenguaje que quería hacerme. Lo que más me gusta es el potencial de la metaprogramación; en teoría, ¿podría el sistema D's traits habilitar las siguientes características en tiempo de compilación?¿Es D lo suficientemente potente para estas funciones?

  1. tiempo de ejecución de la reflexión: ¿Está el tiempo de compilación reflexión rasgos suficientes para construir un sistema de reflexión en tiempo de ejecución a la de Java/.NET?

  2. Conversión de código: utilizando un metaprograma, cree C#/C++/etc. versiones de su programa D cada vez que lo compila (punto de bonificación si los comentarios del documento pueden propagarse).

  3. Rasgos. No me refiero al metaprogramming traits integrado en D, me refiero a object-oriented traits for class composition. Un programa D indicaría un conjunto de rasgos para componer, y un metaprograma los integraría.

  4. Motor de inferencia de unidades: dada alguna notación para indicar opcionalmente unidades, p. unit(value), ¿podría un metaprograma D examinar el siguiente código, inferir las unidades correctas y emitir un mensaje de error en la última línea? (Escribí una cosa para boo así que puedo asegurar que esto es posible, en general, el programa-ancho):

    auto mass = kg(2.0); 
    auto accel = 1.0;      // units are strictly optional 
    auto force = mass*accel; 
    accel += metresPerSecondSquared(9.81); // units of 'force' and 'accel' are now known 
    force += pounds(3.0);     // unit mismatch detected 
    

Respuesta

7

tiempo de ejecución de la reflexión: ¿Es el tiempo de compilación reflexión características suficientes para construir un sistema de reflexión en tiempo de ejecución a la Java/.NET?

Sí. Puede obtener toda la información que necesita en tiempo de compilación utilizando __traits y generar las estructuras de datos de tiempo de ejecución que necesita para la reflexión en tiempo de ejecución.

Conversión de código: Utilizando un metaprograma, cree C#/C++/etc. versiones de su programa D cada vez que lo compila (punto de bonificación si los comentarios del documento pueden propagarse).

No, simplemente no es posible sin importar cuán poderoso sea D. Algunas características simplemente no se transfieren. Por ejemplo, D tiene un ensamblador en línea, que es 100% imposible de convertir a C#. Ningún idioma puede convertirse sin pérdida a todos los demás idiomas.

Rasgos. No me refiero a los rasgos de metaprogramación integrados en D, me refiero a los rasgos orientados a objetos para la composición de clases. Un programa D indicaría un conjunto de rasgos para componer, y un metaprograma los integraría.

Puede usar template mixins para esto, aunque no proporcionan la exclusión del método.

Motor de inferencia de unidades: dada alguna notación para indicar opcionalmente las unidades, p. unidad (valor), ¿podría un metaprograma D examinar el siguiente código, inferir las unidades correctas y emitir un mensaje de error en la última línea? (Escribí tal cosa por boo, así que puedo asegurarle que esto es posible en general, a nivel de programa):

Sí, esto es sencillo en D.Ya está at least one implementation.

+0

No quise sugerir que el convertidor debería admitir todas las características, incluido el lenguaje de ensamblaje :), pero solo la idea de que D podría inspeccionar el código lo suficiente como para * intentar * una conversión. – Qwertie

+0

De esta manera uno podría escribir un programa en D, C++ y C# simultáneamente al limitarse a un cierto subconjunto de D. Naturalmente, tendría que, por ejemplo, convierta los argumentos de la plantilla lambda en argumentos de tiempo de ejecución o replique automáticamente las plantillas con diferentes argumentos, de acuerdo con las limitaciones del idioma de destino. Tal herramienta de conversión podría hacer que D sea más atractivo para escribir ciertas bibliotecas, especialmente algoritmos y estructuras de datos exóticas, aunque reconozco que no necesariamente se debe lograr con la metaprogramación. – Qwertie

+0

Es posible, creo, pero eso requeriría un traductor de idiomas en tiempo de compilación ... Sería un proyecto enorme ... – DejanLekic

Cuestiones relacionadas