2009-07-16 15 views
5

¿Hay un compilador o preprocesador independiente que toma archivos C++ y ejecuta un pase de expansión de plantilla, generando un nuevo código de C++ con instancias de plantillas expandidas?Herramienta de preprocesador de plantilla C++

Recuerdo una herramienta de este tipo a mediados de los 90 cuando las plantillas aún eran nuevas y experimentales, y el preprocesador era una forma de hacer plantillas de programación con compiladores sin compatibilidad con plantillas nativas.

Esto es mucho más complicado que un paso de macroprocesamiento, ya que probablemente requiera analizar y poner en simbología el código para comprender los contextos.

Mi esperanza es utilizar una herramienta de este tipo al escribir código OpenCL. OpenCL es C++, pero no admite plantillas. Espero poder escribir plantillas, incluso simples como con enteros o bool solo argumentos, y tener alguna herramienta de pre-analizar el archivo y buscar y encontrar el uso de las plantillas y expandir las invocaciones y darme un nuevo código de C++ que el compilador de OpenCL puede entender.

Incluso una herramienta muy limitada podría ser útil, no necesita admitir todos los caprichos de la plantilla, ni siquiera admite múltiples módulos o algo.

La alternativa: #define macros en todas partes ... más feo, inseguro, menos eficiente y menos versátil.

+1

lenguaje de OpenCL se basa en la sintaxis C99, no en C++ de acuerdo a la página que vinculó. –

+0

AMD realiza una cierta extensión para openCL, podría desarrollar códigos de plantilla si apunta solo a los dispositivos AMD. Es un fastidio que no podamos usar la plantilla para desarrollar nuestros algoritmos. – StereoMatching

Respuesta

9

Comeau C++ puede "compilar" C++ a C. Esto parece estar cerca de su objetivo, como OpenCL no soporta C++ – Es mucho más cerca de C.

+0

¡Sí! ¡Esta es la herramienta que utilicé hace 15 años por la misma razón! Excelente, gracias. – SPWorley

+3

"por la misma razón": ¿tenía OpenCL hace 15 años? ¡Guauu! ;-) – ephemient

+0

Ahora, este sitio no funciona, y según tengo entendido, Comeau C++ ahora no se está desarrollando, ¿no es así? – Alex

0

No existe una herramienta de este tipo: las plantillas son parte del lenguaje, no un pase de preprocesador; el compilador las procesa, como cualquier otro código.

+0

Sí ... una herramienta así tendría que analizar el C++. Es por eso que es más complicado que un macroprocesador. – SPWorley

+0

Bueno, como digo, no existe tal cosa, que yo sepa. No veo cómo podría procesar las plantillas y dejar intacto el código "sin plantilla". –

+0

@Neil: los primeros compiladores de C++ simplemente convirtieron el código de C++ en c válido y lo compilaron utilizando un compilador de c. Ciertamente, este ya no es el caso, pero solía ser bastante habitual. –

-2

¿Por qué no echar un vistazo al compilador C++ de GCC? Estoy seguro de que con un poco de esfuerzo puede secuestrar el proceso de compilación y simplemente volcar las plantillas "expandidas" en sus propios archivos de código. Sin embargo, escribir esto usted mismo sería bastante simple, me imagino. No veo por qué necesita un compilador "completo" para lograr esto en absoluto. Desde mi experiencia, las plantillas solo conocen el contexto en casos en que el compilador quiere darle un error. Si valida el código de su plantilla de antemano con un compilador real y luego lo ejecuta a través de una herramienta de "búsqueda/reemplazo", obtendrá un código válido; Estoy seguro.

+0

Es mejor que vaya con http://www.gccxml.org si va por esta ruta; ya han hecho el trabajo duro de arrancar el front-end de GCC. – ephemient

+0

Si con "un poco de esfuerzo" quiere decir "más esfuerzo que escribir un nuevo backend de arquitectura", entonces seguro. Desafortunadamente, no se pueden expandir las plantillas sin la información del tipo, lo que significa que no se hace como un preprocesador, sino que se hace en la mitad de la generación de AST. El resultado neto es que para cuando las plantillas C++ se expanden, no estás cerca del código original y necesitas un backend real que pueda trasladar de AST a C (se cree que puede ser transitivo con cualquier cosa que los AST puedan usar, entonces en GCC podría hacerlo desde GIMPLE o TreeSSA). –

+0

@ephemient: gccxml tiene soporte de plantilla deficiente –