Qual è l'origine del preprocessore C?


30

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

  • spazi bianchi sintatticamente significativi (fine della riga termina un'istruzione, gap dopo che la macro determina l'inizio dell'elenco di sostituzione)

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

  • definizioni guidate da parole chiave anziché dichiarazione-riflette-uso, no =per la definizione di valore

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

  • valutazione pigra (di C, ovviamente; ma 6.10.3.1 può essere letto come implicante anche un ordine specifico di espansione macro, nei pochi punti che contano)

Non sembra proprio C! Tecnicamente è il suo linguaggio, ma è sempre stato usato come parte quasi integrale di C e sembra molto strano che non si integrasse sintatticamente con esso.

Wikipedia non parla della sua storia; il Portland Pattern Repository gli dà una menzione passeggera , ma non va nei dettagli oltre al fatto che è stato progettato da altre persone rispetto al resto del sito Web di C. Dennis Ritchie con la storia di C probabilmente ha avuto la risposta, ma sfortunatamente è no più disponibile.

Come motore macro, ha ovviamente una semantica molto diversa dal linguaggio di runtime, il che spiegherebbe alcune differenze, ma non gli aspetti del design visivo (non è anche chiaro agli occhi moderni se fosse originariamente inteso come capace del tipo di divertimento che il suo sistema di sostituzione consente, o se era "solo" un modo conveniente per incorporare le funzioni in un tempo prima di potenti ottimizzatori). Sembra qualcosa di più vicino a quello che alla fine sarebbe diventato un modello C ++ sarebbe stata un'evoluzione più logica verso le macro, se la semantica simile al C fosse stata in realtà il punto di partenza, ma ci sono prove meno concrete di ciò di quanto non ci sia per la sintassi.

Abbiamo qualche traccia del perché è stato progettato in questo modo, o quali sono state le influenze dei creatori?



@Mike omg grazie pensavo davvero che il contenuto del sito fosse perso per sempre poiché non ha una voce sfogliabile nell'archivio.
Leushenko,

@MikeSupportsMonica Stavo per chiedere se qualcuno avesse un link. Grazie.
Klut

Risposte:


17

Da http://www.jslint.com/chistory.html ("Lo sviluppo del linguaggio C" di Dennis M. Ritchie):

Molti altri cambiamenti avvennero intorno al 1972-3, ma il più importante fu l'introduzione del preprocessore, in parte su sollecitazione di Alan Snyder [Snyder 74], ma anche in riconoscimento dell'utilità dei meccanismi di inclusione dei file disponibili in BCPL e PL / I. La sua versione originale era estremamente semplice e forniva solo file inclusi e semplici sostituzioni di stringhe: #include e #define di macro senza parametri. Poco dopo fu esteso, principalmente da Mike Lesk e poi da John Reiser, per incorporare le macro con argomenti e compilazione condizionale. Il preprocessore era originariamente considerato un complemento opzionale alla lingua stessa. In effetti, per alcuni anni, non è stato nemmeno invocato a meno che il programma sorgente non contenesse un segnale speciale all'inizio. Questo atteggiamento persisteva e spiega sia l'integrazione incompleta della sintassi del preprocessore con il resto della lingua sia l'imprecisione della sua descrizione nei primi manuali di riferimento.

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

Non sono stato in grado di trovare alcun dettaglio aggiuntivo, tuttavia, sul design del preprocessore C stesso, come lingua.


1
Si noti che Snyder è venuto a Bell Labs dal MIT, dove l'assemblatore MIDAS ha le dichiarazioni DEFINE, IFDEF e IFNDEF. Coincidenza?
Lars Brinkhoff il

0

Potrei solo aggiungere che era molto comune per i linguaggi di assemblaggio avere pre-processori di assemblatori di macro che assomigliavano molto a CPP.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.