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
risposta
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.
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
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
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.
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
o essere più preciso, qual è il limite di D per la funzione che utilizza la valutazione del tempo di compilazione? – bobzhang
Ecco la [lista completa delle restrizioni] (http://dlang.org/function.html#interpretation). – eco
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.
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.
- 1. Qual è il miglior IDE per la programmazione DigitalMars D?
- 2. Qual è la differenza tra "tempo di compilazione" e "tempo di esecuzione"?
- 3. Ricompilazione e condizionali del tempo di compilazione
- 4. Riflessione del tempo di compilazione in C#
- 5. Il runtime generics o il polimorfismo del tempo di compilazione?
- 6. opDispatch e parametri di compilazione del tempo
- 7. Determinazione del tipo di tempo di compilazione in C++
- 8. g ++ 6,1 regressione del tempo di compilazione?
- 9. qual è l'equivalente di :: operator in D?
- 10. Ottenere il tempo di compilazione JAR
- 11. Come monitorare e registrare il tempo di compilazione (compilazione/test)?
- 12. Qual è stato il motivo per cui la valutazione dell'assegnazione Swift è stata annullata?
- 13. Qual è il posto standard defacto per le librerie D
- 14. Qual è la motivazione per l'assegnazione di Scala alla valutazione dell'unità piuttosto che il valore assegnato?
- 15. Contatore del tempo di compilazione nella classe template
- 16. Qual è il trasporto sottostante per D-Bus?
- 17. Qual è lo scopo di questa condizione di valutazione?
- 18. Qual è il modo D per scrivere questo?
- 19. tempo di compilazione trigonometria in C
- 20. Qual è il tempo di scadenza predefinito per la cache di Rails?
- 21. D profilo del compilatore
- 22. Qual è il processo eseguito durante la compilazione Objective-C
- 23. GHC Valutazione parziale e compilazione separata
- 24. Misurazione del tempo di esecuzione nel linguaggio D
- 25. Qual è il livello PIC nella compilazione del programma?
- 26. qual è il tempo di installazione di CMake?
- 27. Il conteggio del tempo di sospensione è previsto per il tempo limite di esecuzione?
- 28. Qual è il modo corretto per confrontare il caso che ignora il caso?
- 29. Qual è la complessità di tempo di .NET list.sort()
- 30. Qual è il caso d'uso di questa idiosincrasia ereditaria?
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
è un effetto collaterale dei miei altri progetti. Come ho detto l'ottimizzazione è un caso d'uso. Ma penso che ci dovrebbe essere più – bobzhang
Domanda simile: http://stackoverflow.com/questions/3555456/examples-of-what-ds-templates-can-be-used-for –