Qual é a origem do pré-processador C?


30

O pré-processador C é anexado a C, mas possui uma sintaxe completamente diferente da linguagem principal:

  • espaço em branco sintaticamente significativo (o fim da linha termina uma instrução, intervalo após a macro determinar o início da lista de substituição)

  • blocos baseados em palavras-chave em vez de blocos apoiados, em elifvez deelse if

  • definições conduzidas por palavras-chave em vez de declaração-reflete-uso, não =para definição de valor

  • dicas de uma sintaxe de string alternativa ( #include <>vs #include "")

  • avaliação preguiçosa (de C, obviamente; mas 6.10.3.1 também pode ser entendida como implicando uma ordem específica de expansão macro, nos poucos lugares que importa)

Realmente não se parece com C! Tecnicamente, é sua própria linguagem, mas sempre foi usada como parte quase integral do C e parece muito estranho que não se integre sintaticamente a ele.

A Wikipedia não fala sobre sua história; o Portland Pattern Repository faz uma menção passageira , mas não entra em detalhes além do fato de ter sido projetado por outras pessoas que não o resto do site de C. Dennis Ritchie, com a história de C, provavelmente teve a resposta, mas infelizmente não existe. mais disponível.

Como um mecanismo de macro, obviamente possui semântica muito diferente da linguagem de tempo de execução, o que explicaria algumas diferenças, mas não os aspectos do design visual (também não está claro para os olhos modernos se ele foi originalmente concebido como capaz do tipo de diversão que seu sistema de substituição permite, ou se era "apenas" uma maneira conveniente de incorporar funções em um tempo antes de otimizadores poderosos). Parece que algo mais próximo do que acabou se transformando em modelos C ++ teria sido uma evolução mais lógica em relação às macros, se a semântica do tipo C tivesse realmente sido o ponto de partida, mas há menos evidência concreta disso do que a sintaxe.

Temos algum registro de por que foi projetado dessa maneira ou quais foram as influências dos criadores?



@ Mike omg obrigado Eu realmente pensei que o conteúdo do site estava perdido para sempre, uma vez que não tem uma entrada navegável no arquivo.
Leushenko

@MikeSupportsMonica Eu estava prestes a perguntar se alguém tinha um link. Obrigado.
klutt

Respostas:


17

Em http://www.jslint.com/chistory.html ("O desenvolvimento da linguagem C", de Dennis M. Ritchie):

Muitas outras mudanças ocorreram por volta de 1972-3, mas a mais importante foi a introdução do pré-processador, em parte por insistência de Alan Snyder [Snyder 74], mas também no reconhecimento da utilidade dos mecanismos de inclusão de arquivos disponíveis no BCPL e PL / I. Sua versão original era extremamente simples e fornecia apenas arquivos incluídos e substituições simples de strings: #include e #define de macros sem parâmetros. Logo depois, foi ampliado, principalmente por Mike Lesk e depois por John Reiser, para incorporar macros com argumentos e compilação condicional. O pré-processador foi originalmente considerado um complemento opcional para o próprio idioma. De fato, por alguns anos, nem foi invocado, a menos que o programa de origem contivesse um sinal especial no início. Essa atitude persistiu e explica a integração incompleta da sintaxe do pré-processador com o restante do idioma e a imprecisão de sua descrição nos manuais de referência anteriores.

Parece que na conta na seção 4 da referência [Snyder 74] vinculada na citação acima, Alan Snyder estava trabalhando em um compilador C portátil (hoje pode-se dizer "retargetable"). Talvez tenha sido essa a motivação para pedir um pré-processador.

Não pude encontrar nenhum detalhe adicional, no entanto, sobre o design do pré-processador C, como uma linguagem.


11
Observe que Snyder veio ao Bell Labs do MIT, onde o montador MIDAS tem as instruções DEFINE, IFDEF e IFNDEF. Coincidência?
Lars Brinkhoff 19/03

0

Devo acrescentar que era muito comum as linguagens assembly terem pré-processadores de macro assembler que se parecem muito com o CPP.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.