Quelle est l'origine du préprocesseur C?

30

Le préprocesseur C est attaché à C, mais il a une syntaxe complètement différente du langage principal:

  • espace blanc syntaxiquement significatif (la fin de la ligne termine une instruction, un espace après que la macro détermine le début de la liste de remplacement)

  • blocs basés sur des mots clés au lieu de blocs contreventés, elifau lieu deelse if

  • définitions par mots clés au lieu de déclaration-reflète-utilisation, non =pour la définition de valeur

  • conseils d'une autre syntaxe de chaîne ( #include <>vs #include "")

  • évaluation paresseuse (de C, évidemment; mais 6.10.3.1 peut être lu comme impliquant également un ordre spécifique d'expansion de macro, dans les quelques endroits qui comptent)

Ça ne ressemble vraiment pas du tout à C! Techniquement , il est sa propre langue, mais il a toujours été utilisé comme une partie presque intégrale de C et il semble très étrange que ce ne serait pas intégrer avec elle syntaxiquement.

Wikipédia ne parle pas de son histoire; le Portland Pattern Repository lui donne une mention passante , mais n'entre pas dans les détails au-delà du fait qu'il a été conçu par d'autres personnes que le reste du site Web de C. Dennis Ritchie avec l'histoire de C avait probablement la réponse, mais n'est malheureusement pas est plus disponible.

En tant que moteur macro, il a évidemment une sémantique très différente du langage d'exécution, ce qui expliquerait certaines différences, mais pas les aspects de conception visuelle (il n'est pas clair non plus pour les yeux modernes s'il était initialement destiné à être capable du genre de plaisir que son système de remplacement permet, ou s’il s’agissait «simplement» d’un moyen rapide d’intégrer des fonctions à une époque antérieure à de puissants optimiseurs). Il semble que quelque chose de plus proche de ce qui est finalement devenu des modèles C ++ aurait été une évolution plus logique vers les macros, si la sémantique de type C avait en fait été le point de départ, mais il y a moins de preuves concrètes de cela que pour la syntaxe.

Avons-nous une trace de la raison pour laquelle il a été conçu de cette façon, ou quelles étaient les influences des créateurs?

Leushenko
la source
5
archive.org/details/dmr-grab
Mike soutient Monica le
@Mike omg merci Je pensais vraiment que le contenu du site était perdu pour toujours car il n'a pas d'entrée consultable dans l'archive.
Leushenko
@MikeSupportsMonica J'étais sur le point de demander si quelqu'un avait un lien. Merci.
klutt Il y a

Réponses:

17

De http://www.jslint.com/chistory.html ("Le développement du langage C" par Dennis M. Ritchie):

De nombreux autres changements se sont produits vers 1972-1973, mais le plus important a été l'introduction du préprocesseur, en partie à la demande d'Alan Snyder [Snyder 74], mais aussi en reconnaissance de l'utilité des mécanismes d'inclusion de fichiers disponibles dans BCPL et PL / I. Sa version originale était extrêmement simple et ne fournissait que des fichiers inclus et des remplacements de chaîne simples: #include et #define de macros sans paramètres. Peu de temps après, il a été étendu, principalement par Mike Lesk puis par John Reiser, pour incorporer des macros avec des arguments et une compilation conditionnelle. Le préprocesseur était à l'origine considéré comme un complément facultatif à la langue elle-même. En effet, pendant quelques années, il n'a même pas été invoqué sauf si le programme source contenait un signal spécial à ses débuts. Cette attitude a persisté et explique à la fois l'intégration incomplète de la syntaxe du préprocesseur avec le reste du langage et l'imprécision de sa description dans les premiers manuels de référence.

Il ressort du compte rendu dans la section 4 de la référence [Snyder 74] liée dans la citation ci-dessus qu'Alan Snyder avait travaillé sur un compilateur C portable (aujourd'hui on pourrait dire "retargetable"). C'était peut-être la motivation pour demander un préprocesseur.

Je n'ai cependant pas pu trouver de détails supplémentaires sur la conception du préprocesseur C lui-même, en tant que langage.

James Youngman
la source
1
Notez que Snyder est venu à Bell Labs du MIT, où l'assembleur MIDAS a les instructions DEFINE, IFDEF et IFNDEF. Coïncidence?
Lars Brinkhoff
0

Je pourrais simplement ajouter qu'il était très courant pour les langages d'assemblage d'avoir des pré-processeurs de macro assembleur qui ressemblent beaucoup à CPP.

Tuntable
la source