Qual è l'origine del preprocessore C?

26

Il preprocessore C è collegato a C, ma ha una sintassi completamente diversa dalla lingua principale:

  • spazio bianco sintatticamente significativo (fine della riga termina un'istruzione, gap dopo che la macro determina l'inizio della lista di sostituzione)

  • blocchi basati su parole chiave anziché blocchi rinforzati, elif anziché else if

  • definizioni guidate da parole chiave invece di dichiarazioni-reflect-use, no = per la definizione del valore

  • suggerimenti di una sintassi di stringa alternativa ( #include <> vs #include "" )

  • valutazione lazy (di C, ovviamente, ma 6.10.3.1 può essere letto come implicando un ordine specifico di espansione macro, nei pochi luoghi quello conta)

In realtà non sembra affatto C! Tecnicamente è il suo linguaggio, ma è sempre stato usato come una parte quasi integrale di C e sembra molto strano che non si integri sintatticamente con esso.

Wikipedia non parla della sua storia; il deposito di Portland Pattern dà una menzione passeggera , ma non entra nei dettagli oltre al fatto che è stato progettato da altri le persone rispetto al resto del sito di C. Dennis Ritchie con la storia di C probabilmente hanno avuto la risposta, ma sfortunatamente non sono più disponibili.

Come motore macro, ovviamente ha una semantica molto diversa dal linguaggio runtime, che spiegherebbe alcune differenze, ma non gli aspetti del design visivo (non è chiaro agli occhi moderni se sia stato originariamente inteso come capace del individuo di divertente che il sistema di sostituzione lo consente, o se fosse "solo" un modo opportuno per integrare le funzioni in un momento precedente ai potenti ottimizzatori). Sembra che qualcosa di più vicino a quelli che alla fine sarebbero diventati modelli C ++ sarebbe stata un'evoluzione più logica verso le macro, se la semantica di tipo C fosse stata effettivamente il punto di partenza, ma ci sono prove meno concrete di ciò che c'è per la sintassi.

Abbiamo una registrazione del motivo per cui è stato progettato in questo modo o quali sono state le influenze dei creatori?

    
posta Leushenko 05.02.2016 - 22:10
fonte

1 risposta

15

Da link ("Lo sviluppo del linguaggio C" di Dennis M. Ritchie):

Many other changes occurred around 1972-3, but the most important was the introduction of the preprocessor, partly at the urging of Alan Snyder [Snyder 74], but also in recognition of the utility of the the file-inclusion mechanisms available in BCPL and PL/I. Its original version was exceedingly simple, and provided only included files and simple string replacements: #include and #define of parameterless macros. Soon thereafter, it was extended, mostly by Mike Lesk and then by John Reiser, to incorporate macros with arguments and conditional compilation. The preprocessor was originally considered an optional adjunct to the language itself. Indeed, for some years, it was not even invoked unless the source program contained a special signal at its beginning. This attitude persisted, and explains both the incomplete integration of the syntax of the preprocessor with the rest of the language and the imprecision of its description in early reference manuals.

Appare dall'account nella sezione 4 del riferimento [Snyder 74] collegato nella citazione sopra che Alan Snyder ha lavorato su un compilatore C portatile (oggi si potrebbe dire "retargetabile"). Forse questa era la motivazione per chiedere un preprocessore.

Non sono stato in grado di trovare dettagli aggiuntivi, tuttavia, sul design del preprocessore C stesso, come linguaggio.

    
risposta data 07.02.2016 - 00:24
fonte

Leggi altre domande sui tag