Un compilador consta de dos bloques principales: el 'front-end' y el 'back-end'. El front-end de un compilador analiza el código fuente y construye alguna forma de 'representación intermediaria' de dicho código fuente que es mucho más fácil de analizar mediante un algoritmo de máquina que el código fuente (es decir, mientras que el código fuente para ayudar al programador humano a escribir el código, el formulario intermedio está diseñado para ayudar a simplificar el algoritmo que analiza dicha forma intermediaria más fácil). El back-end de un compilador toma el formulario intermediario y luego lo convierte en un "idioma de destino".
Ahora, el lenguaje de destino para compiladores de uso general son lenguajes de ensamblador para varios procesadores, pero no hay nada que prohíba a un compilador realizar código en otro idioma, siempre que dicho idioma de destino sea (al menos) tan flexible como un ensamblador general de CPU.
Ahora, como se puede imaginar, C es definitivamente tan flexible como el ensamblador de una CPU, de modo que un compilador de C++ a C realmente no es un problema para implementar desde un punto de vista técnico.
Así que tienes: C++ --- --- frontend> someIntermediaryForm --- --- backend> C
Es posible que desee comprobar estos chicos: http://www.edg.com/index.php?location=c_frontend (el enlace anterior es sólo informativo para lo puede se haga, que la licencia de sus extremos frontales para decenas de miles de dólares)
PS por lo que yo sé, no hay una C tal ++ para el compilador C de GNU, y esto me pega por completo (si estoy en lo cierto acerca de esto). Como el lenguaje C es bastante pequeño y sus mecanismos internos son bastante rudimentarios, un compilador de C requiere algo así como un trabajo de un año-hombre (puedo decirte esto de primera mano porque escribí tal compilador hace años, y produce un [compilador]). virtual] stack intermediate code), y poder tener un compilador C++ mantenido y actualizado, mientras que solo tener que escribir un compilador de C una vez sería una gran cosa tener ...
@MSalters: Gracias por el puntero sobre el compilador Comeaus. Pero lamentablemente eso no cumple mi propósito, ya que no es posible obtener el código c de formato intermedio del compilador de Comeaus, e incluso si obtenemos de alguna forma que no es compilable por los compiladores ANSI-C normales. – goldenmean
Si su código no usa excepciones y plantillas, es posible que tenga la oportunidad de obtener una copia anterior de cfront para que funcione en su código. Pero como MSalters dijo que iba a ser feo :-) – lothar
tampoco tendría que usar ninguna funcionalidad de biblioteca estándar –