¿Cuál es el origen del preprocesador C?

30

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 eliflugar deelse if

  • definiciones basadas en palabras clave en lugar de declaración-refleja-uso, no =para definición de valor

  • sugerencias 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?

Leushenko
fuente
55
archive.org/details/dmr-grab
Mike apoya a Monica
@ Mike omg gracias Realmente pensé que el contenido del sitio se perdió para siempre ya que no tiene una entrada navegable en el archivo.
Leushenko
@ MikeSupportsMonica Estaba a punto de preguntar si alguien tenía un enlace. Gracias.
klutt hace

Respuestas:

17

De http://www.jslint.com/chistory.html ("El desarrollo del lenguaje C" por Dennis M. Ritchie):

Muchos otros cambios ocurrieron alrededor de 1972-3, pero el más importante fue la introducción del preprocesador, en parte a instancias de Alan Snyder [Snyder 74], pero también en reconocimiento de la utilidad de los mecanismos de inclusión de archivos disponibles en BCPL y PL / I. Su versión original era extremadamente simple, y solo proporcionaba archivos incluidos y reemplazos simples de cadenas: #include y #define de macros sin parámetros. Poco después, se extendió, principalmente por Mike Lesk y luego por John Reiser, para incorporar macros con argumentos y compilación condicional. El preprocesador se consideraba originalmente un complemento opcional del lenguaje en sí. De hecho, durante algunos años, ni siquiera se invocó a menos que el programa fuente contuviera una señal especial al principio. Esta actitud persistió y explica tanto la integración incompleta de la sintaxis del preprocesador con el resto del lenguaje como la imprecisión de su descripción en los primeros manuales de referencia.

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.

James Youngman
fuente
1
Tenga en cuenta que Snyder llegó a Bell Labs desde el MIT, donde el ensamblador MIDAS tiene las declaraciones DEFINE, IFDEF e IFNDEF. ¿Coincidencia?
Lars Brinkhoff
0

Podría agregar que era muy común que los lenguajes de ensamblaje tuvieran preprocesadores de ensamblador de macros muy similares a CPP.

Manejable
fuente