Eu acho que BS responde a essa pergunta:
O primeiro compilador C ++ (Cfront) foi escrito em C ++. Para criar isso, usei C para escrever um pré-processador "C com classes" em C. "C com classes" era um dialeto em C que se tornou o ancestral imediato do C ++. Esse pré-processador traduziu as construções "C com Classes" (como classes e construtores) para C. Era um pré-processador tradicional que não entendia todo o idioma, deixou a maior parte do tipo de verificação para o compilador C fazer e traduziu individualmente constrói sem conhecimento completo.
Eu então escrevi a primeira versão do Cfront em "C with Classes". O Cfront era um compilador tradicional que completava a sintaxe e a verificação semântica da fonte C ++. Para isso, ele tinha um analisador completo, construiu tabelas de símbolos e uma representação interna completa da árvore de cada classe, função, etc. Também fez alguma otimização no nível da fonte em sua representação interna da árvore das construções C ++ antes da saída C. C gerado, não confiou em C para nenhuma verificação de tipo. Simplesmente usava C como montador. O código resultante foi incrivelmente rápido.
Primeiro, ele criou algo que chamou de "C com Classes" implementado por um simples pré-processador em C. Era basicamente C ++, mas o pré-processador fez pouca ou nenhuma verificação. Ele então usou isso para escrever o Cfront, a versão mais poderosa do tradutor de C ++ em C, completa com verificação de tipo, tabelas de símbolos etc.