2009-07-16 13 views
5

Esiste un compilatore o un preprocessore indipendente che preleva i file C++ ed esegue un passaggio di espansione del modello, generando un nuovo codice C++ con istanze di modello espanse?Strumento di preprocessore per il modello C++

Ricordo uno strumento simile a metà degli anni '90 quando i modelli erano ancora nuovi e sperimentali e il preprocessore era un modo per programmare template con compilatori senza supporto di modelli nativi.

Questo è molto più complicato di un passaggio di macro-elaborazione poiché richiederebbe probabilmente l'analisi e la tokenizzazione del codice per comprendere i contesti.

La mia speranza è quella di utilizzare tale strumento quando si scrive codice OpenCL. OpenCL è C++, ma non supporta i modelli. Spero di poter scrivere modelli, anche semplici come con argomenti interi o bool e avere qualche strumento per analizzare il file e passare e trovare l'uso dei modelli ed espandere le invocazioni e darmi un nuovo codice C++ che il compilatore OpenCL può comprendere.

Anche uno strumento molto limitato può essere utile, non ha bisogno di supportare ogni stranezza del modello, e nemmeno di supportare più moduli o altro.

L'alternativa: #define macro ovunque .. più brutti, non sicuri, meno efficienti e meno versatili.

+1

linguaggio OpenCL si basa sulla sintassi C99, non C++ secondo alla pagina che hai collegato. –

+0

AMD crea un'estensione per aprireCL, potresti sviluppare i codici di modello se miri solo ai dispositivi AMD. È un problema che non possiamo usare il modello per sviluppare i nostri algoritmi. – StereoMatching

risposta

9

Comeau C++ può "compilazione" C++ per C. Questo sembrerebbe essere vicino al vostro obiettivo, come OpenCL non supporta C++ – E 'molto più vicino a C.

+0

Sì! Questo è lo strumento che ho usato 15 anni fa per lo stesso motivo! Eccellente grazie. – SPWorley

+3

"per lo stesso motivo" - hai avuto OpenCL 15 anni fa? Wow! ;-) – ephemient

+0

Ora questo sito non funziona, e come ho capito Comeau C++ ora non si sta sviluppando, non è vero? – Alex

0

Non esiste uno strumento di questo tipo: i modelli fanno parte del linguaggio, non un passaggio di pre-processore, vengono elaborati dal compilatore, proprio come gli altri codici.

+0

Sì .. un tale strumento avrebbe infatti bisogno di analizzare il C++. Ecco perché è più complicato di un preprocessore macro. – SPWorley

+0

Beh, come ho detto, nessuna cosa del genere esiste per quanto ne so. Non riesco a vedere come potrebbe elaborare i template e lasciare intatto il codice "non-template". –

+0

@Neil: i primi compilatori C++ hanno semplicemente convertito il codice C++ in c valido e lo hanno compilato usando un compilatore c. Certamente non è più così, ma era abbastanza normale. –

-2

Perché non dare un'occhiata al compilatore C++ di GCC? Sono sicuro che con un po 'di sforzo si può sequestrare il processo di compilazione e semplicemente scaricare i modelli "espansi" nei propri file di codice. Tuttavia, scrivere questo te stesso sarebbe abbastanza semplice, immagino. Non vedo perché tu abbia bisogno di un compilatore "completo" per poterlo realizzare. Dalla mia esperienza, i modelli sono a conoscenza del contesto solo nei casi in cui il compilatore vuole darti un errore. Se si convalida il codice del modello in anticipo con un compilatore reale, quindi eseguirlo tramite uno strumento "cerca/sostituisci", si otterrà codice valido; Sono sicuro.

+0

Si potrebbe anche andare con http://www.gccxml.org se si sta andando questa rotta; hanno già fatto il duro lavoro di strappare il front-end di GCC. – ephemient

+0

Se con "un po 'di sforzo" intendi "più sforzo che scrivere un nuovo back-end di architettura", allora sicuramente. Sfortunatamente non è possibile espandere i modelli senza informazioni di tipo, il che significa che non lo si fa come un preprocessore, lo si fa in parte attraverso la generazione di AST. Il risultato netto è che quando i modelli C++ si espandono non sei affatto vicino al codice originale e hai bisogno di un vero backend che possa tradurre da AST a C (pensavo che possa essere transitabile con qualsiasi altra cosa a cui gli AST possono andare, quindi in GCC tu potrebbe farlo da GIMPLE o TreeSSA). –

+0

@ephemient: gccxml ha un supporto modello scadente –