2012-07-12 13 views
8

Ho integrato questa funzione nel mio linguaggio preferito OCaml, so che questa è la caratteristica sexy di D, ma qual è il caso d'uso per la valutazione del tempo di compilazione tranne alcune ottimizzazioni? più sono e meglio, il geeker i meglio :-)Qual è il caso d'uso per la valutazione del tempo di compilazione di D

+1

Cosa vuoi dire da te "integrato questa funzione" mio "linguaggio di programmazione preferito OCaml"? Perché l'hai fatto quando non hai casi d'uso per questo? – jmg

+0

è un effetto collaterale dei miei altri progetti. Come ho detto l'ottimizzazione è un caso d'uso. Ma penso che ci dovrebbe essere più – bobzhang

+1

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

risposta

12

L'ottimizzazione è, naturalmente, un caso di grande utilizzo. Cose come ctRegex funzionano meglio del loro equivalente regex compilato in runtime (generalmente). Anche i generatori di parser sono interessanti (vedi Pegged) e riceveranno sempre più attenzione. Le persone stanno appena iniziando a sfruttare ciò che può essere fatto.

Si potrebbe fare qualcosa come mixin(import_c("header.h")) per analizzare e creare un file di interfaccia D per intestazioni C arbitrarie (si dovrebbe, ovviamente, scrivere un parser per C in D per fare ciò).

La formattazione di stringhe estremamente veloce può essere eseguita poiché una stringa di formato (ad es., "%0.2f") è in genere nota al momento della compilazione. È possibile leggere la stringa di formato e generare solo il codice necessario per formattare, eliminando tutti i tipi di sezioni non necessarie.

vibe.d in realtà supporta la compilazione di templating. Il file modello (basato su Jade/HAML) può contenere codice D. Lo legge e genera un blocco personalizzato di codice D (pensalo come "" ~ title ~ "..."). Non credo che l'autore abbia fatto benchmark ma dovrebbe essere incredibilmente veloce.

In pratica ottieni il vantaggio di un codice specializzato ottimizzato a mano pur restando di alto livello. È difficile rispondere alla tua domanda perché non sappiamo per che cosa sarà usato. Mi ricorda i modelli C++. I progettisti di loro non hanno previsto le tecniche avanzate di metaprogrammazione abilitate.

+0

Ho trovato una limitazione importante nella valutazione del tempo di compilazione di D che tutte le fonti dovrebbero apparire in un file che rende molto difficile scrivere una potente funzione di valutazione del tempo di compilazione, dato che non è possibile utilizzare alcuna libreria. Come ci pensi – bobzhang

+0

Questa è fondamentalmente la stessa limitazione che i modelli C++ devono affrontare. Non c'è una soluzione facile per questo. Alcune persone vogliono incorporare l'origine nei file oggetto della libreria per aggirare questo problema, ma nessuno lo ha ancora provato. – eco

9

Alcuni suggerimenti:

  • ne dite di analisi una grammatica PEG, l'assemblaggio di un parser PEG, e quindi utilizzando detto parser, tutto in fase di compilazione ? Ecco il progetto Pegged.
  • Costruzione di tabelle di ricerca statiche di grandi dimensioni.
  • Generazione di codice nativo ottimale per un'espressione regolare: std.regex.StaticRegex
  • Implementazione di protobuf da un file di definizione.
  • Molte funzioni, se i loro input sono noti in fase di compilazione, possono essere valutate anziché in fase di runtime - il tutto senza modificare l'implementazione della funzione.
+0

Grazie per i vostri suggerimenti. Non ho dimestichezza con D, se la valutazione del tempo di compilazione restituisce una struttura di dati definita dall'utente, come gestirlo? vorresti far luce su questo? – bobzhang

+0

o essere più preciso, qual è il limite di D per la funzione che utilizza la valutazione del tempo di compilazione? – bobzhang

+0

Ecco la [lista completa delle restrizioni] (http://dlang.org/function.html#interpretation). – eco

5

Quando utilizzato con mixin, può fornire una grande flessibilità.

consideri il seguente esempio:

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)); 
    } 
} 

Questo crea una struttura che è membri sono le righe di un file di testo. Ora immagina di avere una tabella in un database e vuoi creare una struttura D per archiviare le righe da quella tabella. È possibile scrivere uno script di shell che legge lo schema di tale tabella e scriverlo su un file, quindi utilizzare StructFromFile per creare automaticamente una struttura che possa contenere le righe di tale tabella. Se si modifica lo schema, non si ha la modifica del codice della struct. Tuttavia, è necessario modificare qualsiasi codice che si basa sul vecchio schema, ma questa è una buona cosa, dal momento che trasforma i bug in fase di esecuzione per la compilazione degli errori.

Naturalmente, è anche possibile utilizzare questo metodo per aggiungere proprietà getter + setter e per utilizzarlo per XML DTD e servizi web.

4

Ecco l'applicazione più geek della valutazione del tempo di compilazione Mi viene in mente: Scrivi un compilatore per il tuo linguaggio di programmazione sotto forma di una funzione string f(string code) che prende il codice sorgente del tuo linguaggio di programmazione come argomento e sputa il codice D. Quindi scrivi qualcosa come

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

nel file main.d. In questo modo puoi abusare del compilatore D e del suo back-end per produrre un eseguibile per te. Se vuoi, puoi scrivere uno script di shell (o qualcosa di simile ad esso) che crea il file main.d ed eseguirlo su di esso. In questo modo ottieni un mezzo compilatore per la tua lingua. Almeno non ti devi preoccupare del back-end. ;)

Appart da quello, ho letto su un raytracer fase di compilazione in D.

Problemi correlati