El preprocesador C está conectado a C, pero tiene una sintaxis completamente diferente del lenguaje principal:
espacios en blanco sintácticamente significativos (el final de la línea termina una declaración, espacio después de que la macro determina el inicio de la lista de reemplazo)
bloques basados en palabras clave en lugar de bloques arriostrados, en
elif
lugar deelse if
definiciones basadas en palabras clave en lugar de declaración-refleja-uso, no
=
para definición de valorsugerencias de una sintaxis de cadena alternativa (
#include <>
vs#include ""
)evaluación perezosa (de C, obviamente; pero 6.10.3.1 puede leerse como que implica un orden específico de expansión macro también, en los pocos lugares que importan)
¡Realmente no se parece a C en absoluto! Técnicamente es su propio lenguaje, pero siempre se ha utilizado como una parte casi integral de C y parece muy extraño que no se integre sintácticamente con él.
Wikipedia no habla de su historia; el Portland Pattern Repository le da una mención pasajera , pero no entra en detalles más allá del hecho de que fue diseñado por otras personas que el resto del sitio web de C. Dennis Ritchie con la historia de C probablemente tuvo la respuesta, pero desafortunadamente no Ya no está disponible.
Como motor de macro, es obvio que tiene muy diferentes semántica del lenguaje de tiempo de ejecución, lo que explicaría algunas diferencias, pero no en los aspectos de diseño visual (que no es claro a los ojos modernos si se pretendía originalmente como siendo capaz de la clase de diversión que su el sistema de reemplazo permite, o si era "solo" una forma conveniente de integrar funciones en un tiempo anterior a los potentes optimizadores). Parece que algo más cercano a lo que finalmente se convirtió en plantillas de C ++ habría sido una evolución más lógica hacia las macros, si la semántica similar a C hubiera sido realmente el punto de partida, pero hay menos evidencia concreta de esto que la sintaxis.
¿Tenemos algún registro de por qué fue diseñado de esta manera, o cuáles fueron las influencias de los creadores?
Respuestas:
De http://www.jslint.com/chistory.html ("El desarrollo del lenguaje C" por Dennis M. Ritchie):
De la cuenta en la sección 4 de la referencia [Snyder 74] vinculada a la cita anterior, parece que Alan Snyder había estado trabajando en un compilador C portátil (hoy se podría decir "retargetable"). Quizás esta fue la motivación para pedir un preprocesador.
Sin embargo, no he podido encontrar ningún detalle adicional sobre el diseño del preprocesador C en sí, como lenguaje.
fuente
Podría agregar que era muy común que los lenguajes de ensamblaje tuvieran preprocesadores de ensamblador de macros muy similares a CPP.
fuente