2012-07-12 19 views
8

He integrado esta característica en mi lenguaje favorito OCaml, sé que esta es la característica sexy en D, pero ¿cuál es el caso de uso para la evaluación en tiempo de compilación excepto algunas optimizaciones? cuanto más mejor, la GeeKeR los mejores :-)Cuál es el caso de uso para la evaluación de tiempo de compilación de D'0

+1

¿Qué quiere decir que por su "lenguaje de programación favorito OCaml" "esta característica en integrado"? ¿Por qué lo hiciste cuando no tienes casos de uso para eso? – jmg

+0

es un efecto secundario de mis otros proyectos. Como dije, la optimización es un caso de uso. Pero creo que debería haber más – bobzhang

+1

Pregunta similar: http://stackoverflow.com/questions/3555456/examples-of-what-ds-templates-can-be-used-for –

Respuesta

12

La optimización es, por supuesto, un gran caso de uso. Cosas como ctRegex funcionan mejor que su equivalente en expresiones regulares compilado en tiempo de ejecución (en general). Los generadores de analizadores también son interesantes (ver Pegged) y van a recibir cada vez más atención. La gente acaba de comenzar a aprovechar lo que se puede hacer.

Puede hacer algo como mixin(import_c("header.h")) para analizar y construir un archivo de interfaz D para encabezados C arbitrarios (por supuesto, necesita escribir un analizador para C en D para hacerlo).

El formato de cadena extremadamente rápido se puede realizar dado que una cadena de formato (por ejemplo, "%0.2f") se conoce normalmente en tiempo de compilación. Puede leer la cadena de formato y solo generar el código necesario para formatear, eliminando todo tipo de secciones innecesarias.

vibe.d realmente admite plantillas de tiempo de compilación. El archivo de plantilla (basado en Jade/HAML) puede contener código D. Lo lee y genera un bloque personalizado de código D (piénselo como "" ~ título ~ "..."). No creo que el autor haya hecho puntos de referencia, pero debería ser increíblemente rápido.

Básicamente, obtendrá el beneficio de un código especializado optimizado a mano mientras se mantiene en alto nivel. Es difícil responder a su pregunta porque simplemente no sabemos para qué se usará. Me recuerda a las plantillas C++. Los diseñadores de ellos no anticiparon las técnicas avanzadas de metaprogramación que habilitó.

+0

He encontrado una limitación importante en D La evaluación del tiempo de compilación indica que todas las fuentes deben aparecer en un archivo lo que hace que sea muy difícil escribir una función de evaluación de tiempo de compilación muy potente, ya que entonces no puede usar ninguna biblioteca. ¿Cómo lo piensas? – bobzhang

+0

Esa es básicamente la misma limitación que enfrentan las plantillas de C++. No hay una solución fácil para eso. Algunas personas desean insertar el código fuente en los archivos de objetos de la biblioteca para evitar esto, pero nadie lo ha intentado todavía. – eco

9

Algunas sugerencias:

  • ¿Qué hay de analizar una gramática PEG, el montaje de un analizador de PEG, y luego usando dicho analizador, todo en tiempo de compilación ? Aquí está el proyecto Pegged.
  • Construcción de grandes tablas de búsqueda estáticas.
  • Generación de código nativo óptimo para una expresión regular: std.regex.StaticRegex
  • Implementación de protobufs a partir de un archivo de definición.
  • Muchas funciones, si sus entradas son conocidas en tiempo de compilación, pueden evaluarse entonces en lugar de en tiempo de ejecución, todo sin cambiar la implementación de la función.
+0

Gracias por sus sugerencias. No estoy familiarizado con D, si la evaluación del tiempo de compilación devuelve una estructura de datos definida personalizada, ¿cómo maneja D esto? ¿Podrías arrojar algo de luz sobre esto? – bobzhang

+0

o para ser más precisos, ¿cuál es la limitación de D para la función haciendo uso de la evaluación de tiempo de compilación? – bobzhang

+0

Aquí está la [lista completa de restricciones] (http://dlang.org/function.html#interpretation). – eco

5

Cuando se usa con mixin, puede proporcionar una gran flexibilidad.

Consideremos el siguiente ejemplo:

template StructFromFile(string fileName){ 
    string makeStructMembersCode(string[] s){ 
     if(0==s.length){ 
      return null; 
     } 
     string memberName=s[0].strip; 
     return q{ 
      string }~memberName~q{; 
      }~makeStructMembersCode(s[1..$]); 
    } 
    struct StructFromFile{ 
     mixin(makeStructMembersCode(import(fileName).splitLines)); 
    } 
} 

Esto crea una estructura que es miembros son las líneas de un archivo de texto. Ahora imagine que tiene una tabla en una base de datos y desea crear una estructura D para almacenar las filas de esa tabla. Puede escribir un script de shell que lea el esquema de esa tabla y lo escriba en un archivo, y luego use StructFromFile para crear automáticamente una estructura que pueda contener las filas de esa tabla. Si cambia el esquema, no tiene el cambio del código de la estructura. Sin embargo, tiene que cambiar cualquier código que se base en el esquema anterior, pero eso es bueno, ya que convierte errores en tiempo de ejecución para compilar errores.

Por supuesto, también puede usar este método para agregar propiedades getter + setter, y para usarlo en XML DTD y servicios web.

4

Aquí está la aplicación más geek de la evaluación del tiempo de compilación que puedo pensar: escriba un compilador para su propio lenguaje de programación en forma de una función string f(string code) que toma el código fuente de su lenguaje de programación como argumento y escupe código D. Luego escriba algo como

mixin(f(import("my_code_file"))); 

en su archivo main.d. De esta manera puede abusar del compilador D y su back-end para producir un ejecutable para usted. Si lo desea, puede escribir un script de shell (o algo similar) que crea el archivo main.d y ejecuta el compilador D sobre él. De esta forma obtendrás medio compilador para tu idioma. Al menos no necesita preocuparse por el back-end. ;)

Aparte de eso, he leído acerca de un trazador de rayos en tiempo de compilación D.

Cuestiones relacionadas